第二十五章 添加数字签名
本主题介绍如何向 IRIS Web
服务和 Web
客户端发送的 SOAP
消息添加数字签名。
通常,会同时执行加密和签名。为简单起见,本主题仅介绍签名。有关结合加密和签名的信息,请参阅主题结合加密和签名。
主题使用派生密钥令牌进行加密和签名描述了向 SOAP
消息添加数字签名的另一种方法。
数字签名概述
可以使用数字签名来检测消息是否被篡改,或者简单地验证消息的某一部分是否确实由所列实体生成。与传统的手工签名一样,数字签名是对文档的附加,只有文档的创建者才能创建,并且不容易伪造。
IRIS
对 SOAP
消息的数字签名的支持基于 WS-Security
1.1
。反过来,WS-Security
遵循 XML
签名规范。根据后者的规范,要对 XML 文档进行签名:
- 使用摘要函数来计算文档一个或多个部分的哈希值。
- 将摘要值连接起来。
- 使用私钥加密串联摘要。(这是只有才能执行的计算。)
- 创建
<Signature>
元素,其中包含以下信息:
- 对已签名部分的引用(以表明该签名适用于消息的哪些部分)。
- 加密的摘要值。
- 使接收者能够识别用于解密加密摘要值的公钥的信息。
此信息可以包含在<Signature>
元素中,或者 <Signature>
元素可以包含对包含 X.509
证书或签名的 SAML
断言的二进制安全令牌的直接引用。在后一种情况下,必须在添加 <Signature>
元素之前将安全令牌添加到消息中。
此信息还可以让收件人验证您是公钥/私钥对的所有者。
使用派生密钥令牌进行加密和签名主题介绍了一种向 SOAP
消息添加数字签名的替代方法。消息本身的细节各不相同,但一般过程是相同的,并遵循 XML
签名规范:生成签名部分的摘要,加密摘要,并包含一个 <Signature>
元素,其中包含使收件人能够验证签名和解密加密摘要的信息。
添加数字签名
要对 SOAP
消息进行数字签名,可以使用此处的基本过程或本主题后续部分中描述的变体。
首先,下图概括了这个过程:
具体过程如下:
- 可选择包含
%soap.inc
包含文件,它定义了可能需要使用的宏。 - 如果要对任何安全标头元素进行签名,请创建这些安全标头元素。例如:
set utoken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
- 创建
%SYS.X509Credentials
实例,如以编程方式检索凭证集中所述。此 IRIS 凭证集必须包含自己的证书,并且必须提供私钥密码(如果尚未加载)。例如:
Set x509alias = "servercred"
Set pwd = "mypassword"
Set credset = ##class(%SYS.X509Credentials).GetByAlias(x509alias,mypassword)
- 创建包含与该凭证集关联的证书的二进制安全令牌。为此,调用
%SOAP.Security.BinarySecurityTokenO
的CreateX509Token()
类方法。例如:
set bst=##class(%SOAP.Security.BinarySecurityToken).CreateX509Token(credset)
此方法返回代表 <BinarySecurityToken>
标头元素的 %SOAP.Security.BinarySecurityToken
实例。
- 将此令牌添加到
WS-Security
标头元素。为此,请调用Web
客户端或Web
服务的SecurityOut
属性的AddSecurityElement()
方法。对于方法参数,请使用刚刚创建的令牌。例如:
do ..SecurityOut.AddSecurityElement(bst)
- 根据二进制安全令牌创建
<Signature>
元素。为此,调用%XML.Security.Signature的 CreateX509()
类方法。例如:
set dsig=##class(%XML.Security.Signature).CreateX509(bst)
此方法返回 %XML.Security.Signature
的实例,该实例表示 &<Signature>
标头元素。<Signature>
元素适用于消息的一组默认部分;可以指定一组不同的部分。
正式地,该方法具有以下签名:
classmethod CreateX509(credentials As %SYS.X509Credentials = "",
signatureOptions As %Integer,
referenceOption As %Integer,
Output status As %Status) as %XML.Security.Signature
-
credentials
- 凭据要么是实例中的%SYS.X509Credentials
,要么是实例中的%SAML.Assertion
,要么是实例中的%SOAP.Security.BinarySecurityToken
。 -
signatureOptions
指定要签名的部分。此选项在将数字签名应用于特定消息部分中进行了描述。 -
referenceOption
指定要创建的引用类型。有关详细信息,请参阅X.509
凭证的引用选项。 -
status
表示该方法是否成功。
- 将数字签名添加到
WS-Security
标头元素。为此,请调用Web
客户端或Web
服务的SecurityOut
属性的AddSecurityElement()
方法。对于参数,请指定上一步中创建的签名对象。例如:
do ..SecurityOut.AddSecurityElement(dsig)
- 发送
SOAP
消息。请参阅添加安全标头元素中的一般注释。