第二十三章 加密安全标头元素
本主题介绍如何加密 Web
服务和 Web
客户端发送的消息中的 WS-Security
标头内的元素。(此处描述的工具也可单独使用或与安全标头元素结合使用来加密 SOAP
主体。)
通常,会同时执行加密和签名。为简单起见,本主题仅介绍加密。有关结合加密和签名的信息,请参阅结合加密和签名。
使用派生密钥令牌进行加密和签名主题描述了加密 SOAP
消息部分内容的另一种方法。
加密安全标头元素
与上一主题中显示的加密技术不同,加密 WS-Security
标头元素的过程要求您指定 <EncryptedData>
元素如何连接到相应的 <EncryptedKey>
元素。
要加密安全标头元素,请执行以下操作:
- 可选择包含
%soap.inc
包含文件,它定义了可能需要使用的宏。 - 创建要加密的标头元素。例如:
set userToken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
- 获取包含将接收
SOAP
消息的实体的公钥的凭证集。请参阅以编程方式检索凭证集。
set credset=..SecurityIn.Signature.X509Credentials
请务必检查返回对象的类型,看它是否是 %SYS.X509Credential
的实例,如以编程方式检索凭据集中所述。
- 根据凭证集创建加密密钥。为此,调用
%XML.Security.EncryptedKey
的CreateX509()
类方法,并可选择指定第二个参数。例如:
set enckey=##class(%XML.Security.EncryptedKey).CreateX509(credset,$$$SOAPWSEncryptNone)
此方法生成一个对称密钥,返回 %XML.Security.EncryptedKey
的实例,该实例表示 <EncryptedKey>
标头元素。此标头元素包含对称密钥,由给定凭证集中的公钥加密。
第二个参数指定此密钥是否加密 SOAP
主体(除了密钥的任何其他用途之外)。值 $$$SOAPWSEncryptNone
表示此密钥不会用于加密 SOAP
主体。如果省略此参数,则 SOAP
主体也会被加密。
- 可选择修改加密密钥实例以使用不同的算法。请参阅指定块加密算法和指定密钥传输算法。
- 对于每个要加密的安全标头元素,根据该元素创建一个
<EncryptedData>
元素。为此,调用%XML.Security.EncryptedData
的Create()
类方法。在此过程中,仅指定第二个参数,即要加密的安全标头元素。例如:
set encdata=##class(%XML.Security.EncryptedData).Create(,userToken)
- 对于
<EncryptedKey>
,添加对<EncryptedData>
元素的引用。对每个<EncryptedData>
元素执行以下操作:
a. 调用 %XML.Security.DataReference
的 Create()
类方法并提供加密数据实例作为参数。
b. 调用加密密钥实例的 AddReference()
方法并提供数据引用作为参数。
set dataref=##class(%XML.Security.DataReference).Create(encdata)
do enckey.AddReference(dataref)
此步骤更新加密密钥实例以包含指向加密数据实例的指针。
如果此 <EncryptedKey>
也加密 SOAP
主体,它会自动在 <Body>
中包含对 <EncryptedData>
元素的引用。
- 将
<EncryptedKey>
元素添加到WS-Security
标头元素。为此,请调用Web
客户端或Web
服务的SecurityOut
属性的AddSecurityElement()
方法。对于要添加的元素,指定%XML.Security.EncryptedKey
的实例。
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)