美文网首页web
第二十六章 添加数字签名 - 示例

第二十六章 添加数字签名 - 示例

作者: Cache技术分享 | 来源:发表于2024-09-15 09:41 被阅读0次

    第二十六章 添加数字签名 - 示例

    示例

    此示例显示了对其响应消息进行签名的 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 done
     Set 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 saved
     Set 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 object
     Set signature=##class(%XML.Security.Signature).CreateX509(bst)
     
     //Add WS-Security Signature object to the outbound message
     Do ..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=$$$FAULTServer
        Set fault.detail=detail
        Set 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 断言中。本节讨论了这些变体。

    变体:使用可识别证书的信息

    可以包含标识证书的信息,而不是在邮件中包含证书。收件人使用此信息从适当的位置检索证书。为此,请使用上一节中的步骤,并进行以下更改:

    • 跳过步骤 45。也就是说,不要添加 <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 done
     Set 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 saved
     Set x509alias = "servercred" 
     Set cred = ##class(%SYS.X509Credentials).GetByAlias(x509alias)
    
     //Create WS-Security Signature object
     Set signature=##class(%XML.Security.Signature).CreateX509(cred)
     
     //Add WS-Security Signature object to the outbound message
     Do ..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>
    

    相关文章

      网友评论

        本文标题:第二十六章 添加数字签名 - 示例

        本文链接:https://www.haomeiwen.com/subject/mrdiljtx.html