文章目录
- 第二十六章 添加数字签名 - 示例
- 示例
- 使用带签名的证书的其他方法
- 变体:使用可识别证书的信息
- 示例
第二十六章 添加数字签名 - 示例
示例
此示例显示了对其响应消息进行签名的 Web
服务。
为了使此示例在自己的环境中运行,请首先执行以下操作:
- 为服务器创建证书。
- 将此证书加载到服务器端的
IRIS
中,创建名为servercred
的凭证。执行此操作时,还要加载私钥文件并提供其密码(这样Web
服务在签署其响应消息时就不必提供该密码。)
该 Web
服务指的是具有此确切名称的 IRIS
凭证集。
Class DSig.DivideWS Extends %SOAP.WebService
{/// Name of the Web service.
Parameter SERVICENAME = "DigitalSignatureDemo";/// SOAP namespace for the Web service
Parameter NAMESPACE = "http://www.myapp.org";/// use in documentation
Method Divide(arg1 As %Numeric = 2, arg2 As %Numeric = 8) As %Numeric [ WebMethod ]
{Do ..SignResponses()Try {Set ans=arg1 / arg2}Catch{Do ..ApplicationError("division error")}Quit ans
}/// use in documentation
/// signs and includes a binary security token
Method SignResponses()
{//Add timestamp because that's commonly doneSet ts=##class(%SOAP.Security.Timestamp).Create()Do ..SecurityOut.AddSecurityElement(ts)//access previously stored server certificate & private key file//no need to use private key file password, because that has been savedSet x509alias = "servercred" Set cred = ##class(%SYS.X509Credentials).GetByAlias(x509alias)set bst=##class(%SOAP.Security.BinarySecurityToken).CreateX509Token(cred)do ..SecurityOut.AddSecurityElement(bst)//Create WS-Security Signature objectSet signature=##class(%XML.Security.Signature).CreateX509(bst)//Add WS-Security Signature object to the outbound messageDo ..SecurityOut.AddSecurityElement(signature)Quit
}/// Create our own method to produce application specific SOAP faults.
Method ApplicationError(detail As %String)
{Set fault=##class(%SOAP.Fault).%New()Set fault.faultcode=$$$FAULTServerSet fault.detail=detailSet fault.faultstring="Application error"// ReturnFault must be called to send the fault to the client.// ReturnFault will not return here.Do ..ReturnFault(fault)
}}
使用带签名的证书的其他方法
在上一节讨论的基本过程中,使用 <BinarySecurityToken>
包含序列化、base-64
编码格式的证书。除了包含证书之外,还可以使用标识证书的信息。或者,可以将证书包含在签名的 SAML
断言中。本节讨论了这些变体。
变体:使用可识别证书的信息
可以包含标识证书的信息,而不是在邮件中包含证书。收件人使用此信息从适当的位置检索证书。为此,请使用上一节中的步骤,并进行以下更改:
- 跳过步骤
4
和5
。也就是说,不要添加<BinarySecurityToken>
。 - 在步骤
6
(创建签名)中,使用步骤1
中设置的凭证(而不是二进制安全令牌)作为CreateX509()
的第一个参数。例如:
set dsig=##class(%XML.Security.Signature).CreateX509(credset,,referenceOption)
对于第三个参数(referenceOption
),可以指定<Signature>
元素如何使用证书。
如果指定一个凭据集作为第一个参数(正如我们在此变体中所做的那样),则referenceOption
的默认值为$$$SOAPWSReferenceThumbprint
。 可选地指定一个值,如X.509凭据的参考选项中所述。 您可以使用除$$$SOAPWSReferenceDirect
之外的任何值。
示例
此示例是本主题中先前示例的变体。
Method SignResponses()
{//Add timestamp because that's commonly doneSet ts=##class(%SOAP.Security.Timestamp).Create()Do ..SecurityOut.AddSecurityElement(ts)//access previously stored server certificate & private key file//no need to use private key file password, because that has been savedSet x509alias = "servercred" Set cred = ##class(%SYS.X509Credentials).GetByAlias(x509alias)//Create WS-Security Signature objectSet signature=##class(%XML.Security.Signature).CreateX509(cred)//Add WS-Security Signature object to the outbound messageDo ..SecurityOut.AddSecurityElement(signature)Quit
}
在这种情况下,Web
服务发送如下响应消息:
<?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"><Timestamp xmlns="[parts omitted]oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-48CEE53E-E6C3-456C-9214-B7D533B2663F"><Created>2010-03-19T14:35:06Z</Created><Expires>2010-03-19T14:40:06Z</Expires></Timestamp><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha256"></SignatureMethod><Reference URI="#Timestamp-48CEE53E-E6C3-456C-9214-B7D533B2663F"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>waSMFeYMruQn9XHx85HqunhMGIA=</DigestValue></Reference><Reference URI="#Body-73F08A5C-0FFD-4FE9-AC15-254423DBA6A2"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>wDCqAzy5bLKKF+Rt0+YV/gxTQws=</DigestValue></Reference></SignedInfo><SignatureValue>j6vtht/[parts omitted]trCQ==</SignatureValue><KeyInfo><SecurityTokenReference xmlns="[parts omitted]oasis-200401-wss-wssecurity-secext-1.0.xsd"><KeyIdentifier EncodingType="[parts omitted]#Base64Binary" ValueType="[parts omitted]#ThumbprintSHA1">WeCnU2sMyOXfHH8CHTLjNTQQnGQ=</KeyIdentifier></SecurityTokenReference></KeyInfo></Signature></Security></SOAP-ENV:Header><SOAP-ENV:Body wsu:Id="Body-73F08A5C-0FFD-4FE9-AC15-254423DBA6A2">[omitted]</SOAP-ENV:Body>
</SOAP-ENV:Envelope>