文章目录
第三十九章 创建安全对话
IRIS
支持安全对话,遵循 WS-SecureConversation 1.3
规范。本页介绍如何手动创建安全对话。
概述
在安全对话中,Web
客户端向 Web
服务发出初始请求并接收包含 <SecurityContextToken>
的消息。此元素包含双方都可以使用的对称密钥的信息。此信息指的是只有双方知道的共享密钥。然后双方可以在后续交换中使用对称密钥,直到令牌过期或客户端取消令牌。
双方不应该直接使用 <SecurityContextToken>
执行这些任务(不推荐),而应该从中生成一个 <SecurityContextToken>
,然后使用它进行加密、签名、解密和签名验证。
共享密钥可以通过以下任一方式指定:
- 双方共同提供随机熵值。这是典型的情况。
- 由客户端,如果客户端提供了一个随机的客户端熵值。
- 由服务提供,如果服务提供了随机的服务熵值。
开始安全对话
Web
客户端启动安全对话。要在 IRIS
中执行此操作,请在 Web
客户端中执行以下操作:
- 加密
SOAP
主体。客户端发送的请求包含必须保护的信息;此信息在SOAP
主体中携带。
根据需要,可以选择采用其他方式保护请求消息。
- 在调用
%SOAP.WST.Entropy
的CreateBinarySecret()
方法。此方法返回表示随机客户端熵的该类的实例。该方法接受一个参数,即熵的大小(以字节为单位)。
set clientEntropy=##class(%SOAP.WST.Entropy).CreateBinarySecret(32)
该实例表示 <Entropy>
元素和其中包含的 <BinarySecret>
。
- 在调用
%SOAP.WST.RequestSecurityToken
的CreateIssueRequest()
类方法。此方法返回此类的一个实例,客户端将使用该实例请求安全对话。该方法具有以下参数:
a. Interval
间隔,请求的令牌的生命周期。默认值为 300
秒;使用空字符串则不指定生命周期。
b. clientEntropy
,在上一步中创建的客户端熵对象(如果适用)。
c. requireServerEntropy
,一个布尔值,指定服务器在创建 <SecurityContextToken>
时是否必须使用服务器熵。默认值为 false
。
set RST=##class(%SOAP.WST.RequestSecurityToken).CreateIssueRequest(300,clientEntropy,1)
- 可以选择实例中指定
%SOAP.WST.RequestSecurityToken
的ComputedKeySize
属性。 - 调用
Web
客户端的StartSecureConversation()
方法。此方法向Web
服务发送一条消息,请求双方都可以使用的<SecurityContextToken>
。此方法接受一个参数,即上一步中在中打开的%SOAP.WST.RequestSecurityToken
实例。
此方法返回一个状态代码,代码应该检查该代码。如果响应表示成功,则客户端的 SecurityContextToken
属性包含一个 %SOAP.WSSC.SecurityContextToken
实例,该实例表示从客户端返回的 <SecurityContextToken>
。此元素包含有关对称密钥的信息,双方都可以使用该密钥进行加密、签名、解密和签名验证。
- 使用
<SecurityContextToken>
根据需要重新指定安全标头。请参阅使用<SecurityContextToken>
。
//encrypt the SOAP body because it contains part of the shared secret key
Set x509alias = "servernopassword"
Set cred = ##class(%SYS.X509Credentials).GetByAlias(x509alias)
set enckey=##class(%XML.Security.EncryptedKey).CreateX509(cred)
do client.SecurityOut.AddSecurityElement(enckey)
// if client entropy to be passed
set entropy=##class(%SOAP.WST.Entropy).CreateBinarySecret(32)
// request with 300 second lifetime and computed key using both client
//and server entropy.
set RST=##class(%SOAP.WST.RequestSecurityToken).CreateIssueRequest(300,entropy,1)
set sc=client.StartSecureConversation(RST) ; sends a SOAP message