第三十五章 结合加密和签名
可以在同一条消息中加密和签名。在大多数情况下,只需组合前面主题中给出的方法即可。本主题讨论了多种场景。
使用非对称密钥签名并加密
要签名然后加密(使用非对称密钥时),请执行以下操作:
- 按照添加数字签名中的步骤进行操作。
- 按照加密安全标头元素中的步骤进行操作。
或者按照加密 SOAP
主体中的步骤进行操作。
使用非对称密钥加密并签名
要仅加密 SOAP
主体,然后添加数字签名(使用非对称密钥时),请执行以下操作:
- 按照加密 SOAP 主体中的步骤进行操作。
- 按照添加数字签名中的步骤进行操作。
要加密任何安全标头元素,然后添加数字签名(使用非对称密钥时),必须使用顶级 <ReferenceList>
元素(在文档的其他地方不需要)。在这种情况下,请执行以下操作:
- 按照加密安全标头元素中的步骤
1 — 4
进行操作。 - 对于要加密的每个安全标头元素,根据该元素创建一个
<EncryptedData>
元素。为此,请调用%XML.Security.EncryptedData
的Create()
类方法。在此过程中,指定所有三个参数:
a. 在前面的步骤中创建的加密密钥实例。
b. 要加密的安全标头元素。
c. $$$SOAPWSReferenceEncryptedKey
,指定 <EncryptedData>
如何使用加密密钥实例。
set refopt=$$$SOAPWSReferenceEncryptedKey
set encdata=##class(%XML.Security.EncryptedData).Create(enckey,userToken,refopt)
- 创建
<ReferenceList>
元素。为此调用%XML.Security.ReferenceList
的%New()
方法。例如: - 在此
<ReferenceList>
中,创建一个指向<EncryptedData>
元素的Reference>
。为此,请对每个<EncryptedData>
执行以下操作:
a. 调用 %XML.Security.DataReference
的 Create()
类方法,并指定加密数据实例作为参数。此方法返回 %XML.Security.DataReference
的实例。
b. 调用引用列表实例的 AddReference()
方法并指定数据引用实例作为参数。
set dataref=##class(%XML.Security.DataReference).Create(encdata)
do reflist.AddReference(dataref)
- 将
<ReferenceList>
元素添加到WS-Security
标头元素。为此,请调用Web
客户端或Web
服务的SecurityOut
属性的AddSecurityElement()
方法。对于要添加的元素,请指定您的引用列表实例。例如:
do ..SecurityOut.AddSecurityElement(reflist)
注意:在添加其他项目之前,必须先添加 <ReferenceList>
元素。
- 将
<EncryptedKey>
元素添加到WS-Security
标头元素。使用AddSecurityElement()
。例如:
do ..SecurityOut.AddSecurityElement(enckey)
- 将加密的安全标头元素添加到
WS-Security
标头元素。为此,请调用Web
客户端或Web
服务的SecurityOut
属性的AddSecurityElement()
方法。在本例中,指定两个参数:
a. 要包含的安全标头元素(而不是基于该元素的 %XML.Security.EncryptedData
的实例)。
b. 加密密钥实例。第二个参数指定第一个参数指定的项的放置位置。如果参数为 A
、B
,则 IRIS
确保 A
在 B
之后。指定此项以便收件人首先处理加密密钥,然后再处理依赖于它的加密安全标头元素。
do ..SecurityOut.AddSecurityElement(userToken,enckey)
或者,如果加密的安全标头元素是<Signature>
,,则使用 AddSecurityElement()
。
- 按照步骤添加数字签名。
- 发送 SOAP 消息。请参阅添加安全标头元素中的一般注释。