第二十七章 添加数字签名 - 变体:使用签名的 SAML 断言
要添加在签名的 SAML
断言中使用证书的数字签名,请执行以下操作:
- 可选择包含
%soap.inc
包含文件,它定义了可能需要使用的宏。 - 如果要对任何安全标头元素进行签名,请创建这些安全标头元素。例如:
set utoken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
- 使用
Holder-of-key
方法的<SubjectConfirmation>
元素创建签名的 SAML 断言。请参阅创建和添加SAML
令牌。 - 创建
<Signature>
元素。创建时,使用已签名的SAML
断言作为CreateX509()
类方法的第一个参数。例如:
set signature=##class(%XML.Security.EncryptedKey).CreateX509(signedassertion)
- 将数字签名添加到
WS-Security
标头元素。为此,请调用 Web 客户端或Web
服务的SecurityOut
属性的AddSecurityElement()
方法。对于参数,请指定上一步中创建的签名对象。例如:
do ..SecurityOut.AddSecurityElement(dsig)
- 发送
SOAP
消息。请参阅添加安全标头元素中的一般注释。
将数字签名应用于特定消息部分
默认情况下,当创建数字签名并将其添加到 WS-Security
标头元素时,该签名将应用于 SOAP
主体、标头中的 <Timestamp>
元素(如果存在)以及任何 WS-Addressing
标头元素。
要指定签名适用的部分,请使用前面描述的任一过程,但有一个变体:创建签名时,使用第二个参数 (signatureOptions
) 指定要签名的消息部分。将此参数指定为以下任何宏的二进制组合(包含在 %soap.inc
文件中):
- $$$SOAPWSIncludeNone
$$$SOAPWSIncludeDefault (which equals $$$SOAPWSIncludeSoapBody + $$$SOAPWSIncludeTimestamp + $$$SOAPWSIncludeAddressing)
-
$$$SOAPWSIncludeSoapBody
-
$$$SOAPWSIncludeTimestamp
-
$$$SOAPWSIncludeAddressing
-
$$$SOAPWSIncludeAction
-
$$$SOAPWSIncludeFaultTo
-
$$$SOAPWSIncludeFrom
-
$$$SOAPWSIncludeMessageId
-
$$$SOAPWSIncludeRelatesTo
-
$$$SOAPWSIncludeReplyTo
-
$$$SOAPWSIncludeTo
-
$$$SOAPWSIncludeRMHeaders
要组合宏,请使用加号 (+
) 和减号 (-
)。例如:
$$$SOAPWSIncludeSoapBody+$$$SOAPWSIncludeTimestamp
注意:这些选项既适用于 CreateX509()
也适用于 Create()
方法;后者在使用派生密钥令牌进行加密和签名中进行了讨论。
set ts=##class(%SOAP.Security.Timestamp).Create()
do ..SecurityOut.AddSecurityElement(ts)
set x509alias = "servercred"
set cred = ##class(%SYS.X509Credentials).GetByAlias(x509alias)
set parts=$$$SOAPWSIncludeSoapBody + $$$SOAPWSIncludeTimestamp
set signature=##class(%XML.Security.Signature).CreateX509(cred,parts)