文章目录
- 第二十章 加密 SOAP 主体
- 加密概述
- 加密 `SOAP` 主体
第二十章 加密 SOAP 主体
本主题介绍如何加密 IRIS Web
服务和 Web
客户端发送的 SOAP
消息正文。
主题“加密安全标头元素”和“使用派生密钥令牌进行加密和签名”描述了如何加密安全标头元素以及加密 SOAP
主体的其他方法。
加密概述
IRIS
对 SOAP
消息加密的支持基于 WS-Security
1.1
。反过来,WS-Security
遵循 XML
加密规范。根据后者规范,要加密 XML 文档:
- 生成一个对称密钥以供临时使用。
- 可以使用它来加密文档(或文档的选定部分)。
使用包含内容加密版本的 <EncryptedData>
元素替换文档的这些部分。
- 使用要向其发送文档的实体的公钥加密对称密钥。
可以从该实体的请求消息中包含的 X.509
证书中获取公钥。或者可以提前获取它。
- 在同一文档中的
<EncryptedKey>
元素中包含加密的对称密钥。<EncryptedKey>
元素直接或间接地提供信息,使接收者能够确定用于解密此元素的密钥。
此信息可以包含在 <EncryptedKey>
元素中,或者 <EncryptedKey>
元素可以包含对包含 X.509
证书或签名的 SAML
断言的二进制安全令牌的直接引用。在后一种情况下,必须在添加 <Signature>
元素之前将安全令牌添加到消息中。
文档可以包含多个<EncryptedKey>
元素,适用于文档的不同加密部分。
其他主题介绍了加密 SOAP
消息部分内容的其他方法。消息本身的细节各不相同,但一般过程相同,并遵循 XML
加密规范:生成并使用对称密钥,加密对称密钥,并将加密的对称密钥包含在消息中。
加密 SOAP
主体
要加密 SOAP
消息的正文,可以使用此处的基本过程或小节中描述的变体。首先,下图总结了该过程:
具体过程如下:
- 可选择包含
%soap.inc
包含文件,它定义了可能需要使用的宏。 - 获取包含将接收
SOAP
消息的实体的公钥的凭证集,通常来自收到的入站消息。请参阅以编程方式检索凭证集。
例如:
set credset=..SecurityIn.Signature.X509Credentials
请务必检查返回对象的类型,看它是否是 %SYS.X509Credential
的实例,如以编程方式检索凭据集中所述。
- 创建包含与该凭证集关联的证书的二进制安全令牌。为此,请调用
%SOAP.Security.BinarySecurityToken
的CreateX509Token()
类方法。例如:
set bst=##class(%SOAP.Security.BinarySecurityToken).CreateX509Token(credset)
此方法返回代表 <BinarySecurityToken>
标头元素的 %SOAP.Security.BinarySecurityToken
实例。
- 将此令牌添加到
WS-Security
标头元素。为此,请调用Web
客户端或Web
服务的SecurityOut
属性的AddSecurityElement()
方法。对于方法参数,请使用您刚刚创建的令牌。例如:
do ..SecurityOut.AddSecurityElement(bst)
- 根据二进制安全令牌创建加密密钥。为此,请调用
%XML.Security.EncryptedKey的 CreateX509()
类方法。例如:
set enckey=##class(%XML.Security.EncryptedKey).CreateX509(bst)
此方法生成一个对称密钥,使用它来加密 SOAP
主体,并返回 %XML.Security.EncryptedKey
的实例,该实例表示 <EncryptedKey>
标头元素。此标头元素包含对称密钥,由给定二进制安全令牌中包含的公钥加密。
- 可选择修改加密密钥实例以使用不同的算法。请参阅指定块加密算法和指定密钥传输算法。
- 将
<EncryptedKey>
元素添加到WS-Security
标头元素。为此,请调用Web
客户端或Web
服务的SecurityOut
属性的AddSecurityElement()
方法。对于要添加的元素,请指定%XML.Security.EncryptedKey
的实例。
例如:
do ..SecurityOut.AddSecurityElement(enckey)
此步骤还添加 <EncryptedData>
元素作为 <Body>
元素的子元素。
- 发送
SOAP
消息。SOAP
主体已加密,并包含WS-Security
标头。
WS-Security
标头包括<BinarySecurityToken>
and <EncryptedKey>
元素。