第二十二章 加密 SOAP 主体 - 变体:使用签名的 SAML 断言
要使用签名的 SAML
断言中的证书中包含的公钥进行加密,请执行以下操作:
- 跳过前面步骤中的步骤
1–4
。 - 使用
Holder-of-key
方法的<SubjectConfirmation>
元素创建签名的SAML
断言。请参阅创建和添加SAML
令牌。 - 创建
<EncryptedKey>
元素。执行此操作时,使用签名的SAML
断言作为CreateX509()
类方法的第一个参数。例如:
set enckey=##class(%XML.Security.EncryptedKey).CreateX509(signedassertion)
- 继续前面步骤中的步骤5。
消息加密示例
在此示例中,Web
客户端(未显示)发送签名的请求消息,而 Web
服务发送加密响应。
Web
服务从请求消息签名中的客户端证书中获取公钥,并使用该公钥在其响应中添加一个加密的 <EncryptedKey>
元素。 <EncryptedKey>
元素使用客户端的公钥加密,它包含用于加密响应消息正文的对称密钥。
Web
服务如下:
Class XMLEncr.DivideWS Extends %SOAP.WebService
{
Parameter SECURITYIN = "REQUIRE";
Parameter SERVICENAME = "XMLEncryptionDemo";
Parameter NAMESPACE = "http://www.myapp.org";
Method Divide(arg1 As %Numeric = 2, arg2 As %Numeric = 8) As %Numeric [ WebMethod ]
{
Do ..EncryptBody()
Try {
Set ans=arg1 / arg2
} Catch {
Do ..ApplicationError("division error")
}
Quit ans
}
Method EncryptBody()
{
//Retrieve X.509 certificate from the signature of the inbound request
Set clientsig = ..SecurityIn.Signature
Set clientcred = clientsig.X509Credentials
set bst=##class(%SOAP.Security.BinarySecurityToken).CreateX509Token(clientcred)
do ..SecurityOut.AddSecurityElement(bst)
//generate a symmetric key, encrypt that with the public key of
//the certificate contained in the token, and create an
//<EncryptedKey> element with a direct reference to the token (default)
Set enc=##class(%XML.Security.EncryptedKey).CreateX509(bst)
//add the <EncryptedKey> element to the security header
Do ..SecurityOut.AddSecurityElement(enc)
}
/// Create our own method to produce application specific SOAP faults.
Method ApplicationError(detail As %String)
{
//details omitted
}
}
该服务发送如下响应消息:
<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope [parts omitted]>
<SOAP-ENV:Header>
<Security xmlns="[parts omitted]oasis-200401-wss-wssecurity-secext-1.0.xsd">
<BinarySecurityToken wsu:Id="SecurityToken-4EC1997A-AD6B-48E3-9E91-8D50C8EA3B53"
EncodingType="[parts omitted]#Base64Binary"
ValueType="[parts omitted]#X509v3">
MIICnDCCAYQ[parts omitted]ngHKNhh
</BinarySecurityToken>
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="[parts omitted]xmlenc#rsa-oaep-mgf1p">
<DigestMethod xmlns="http://www.w3.org/2000/09/xmldsig#"
Algorithm="http://www.w3.org/2000/09/xmldsig#sha1">
</DigestMethod>
</EncryptionMethod>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<SecurityTokenReference
xmlns="[parts omitted]oasis-200401-wss-wssecurity-secext-1.0.xsd">
<Reference URI="#SecurityToken-4EC1997A-AD6B-48E3-9E91-8D50C8EA3B53"
ValueType="[parts omitted]#X509v3"></Reference>
</SecurityTokenReference>
</KeyInfo>
<CipherData>
<CipherValue>WtE[parts omitted]bSyvg==</CipherValue>
</CipherData>
<ReferenceList>
<DataReference URI="#Enc-143BBBAA-B75D-49EB-86AC-B414D818109F"></DataReference>
</ReferenceList>
</EncryptedKey>
</Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#"
Id="Enc-143BBBAA-B75D-49EB-86AC-B414D818109F"
Type="http://www.w3.org/2001/04/xmlenc#Content">
<EncryptionMethod Algorithm="[parts omitted]#aes128-cbc"></EncryptionMethod>
<CipherData>
<CipherValue>MLwR6hvKE0gon[parts omitted]8njiQ==</CipherValue>
</CipherData>
</EncryptedData>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
指定块加密算法
默认情况下,消息本身使用 $$$SOAPWSaes128cbc
加密。您可以指定不同的算法。为此,请设置 %XML.Security.EncryptedKey
实例的算法属性。
可能的值是 $$$SOAPWSaes128cbc
(默认值)、$$$SOAPWSaes192cbc
和 $$$SOAPWSaes256cbc
例如:
set enckey.Algorithm=$$$SOAPWSaes256cbc
如其他地方所述,当在其他场景中创建 <EncryptedKey>
时,此信息也适用。
指定密钥传输算法
密钥传输算法是用于对称密钥的公钥加密算法(请参阅 https://www.w3.org/TR/xmlenc-core/
)。默认情况下,这是 $$$SOAPWSrsaoaep
。可以改用 $$$SOAPWSrsa15
。为此,请调用上一步中创建的 %XML.Security.EncryptedKey
实例的 SetEncryptionMethod()
方法。此方法的参数可以是 $$$SOAPWSrsaoaep
(默认值)或 $$$SOAPWSrsa15
例如:
do enckey.SetEncryptionMethod($$$SOAPWSrsa15)
如其他地方所述,当您在其他场景中创建<EncryptedKey>
时,此信息也适用。