代码之家  ›  专栏  ›  技术社区  ›  Guillermo Gutiérrez

STR转换是如何工作的?

  •  1
  • Guillermo Gutiérrez  · 技术社区  · 6 年前

    在使用WS-Security时,STR转换算法如何处理XML签名?我需要对用于SOAP消息签名的SecurityTokenReference进行签名,这是安全令牌所需的转换。我使用x509证书进行签名,因此安全令牌就是这个证书。但是,在消息中,我只需要对证书指纹的引用。

    这是我需要复制的签名结构,我唯一缺少的是对SecurityTokenReference的签名引用:

    <dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
      <dsig:SignedInfo>
        <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
        <dsig:Reference URI="#Timestamp_C1Ih1AB1vpPT5uG2">
          <dsig:Transforms>
            <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
          </dsig:Transforms>
          <dsig:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
          <dsig:DigestValue>fVSyToUO8yS131cV8oT1h6fa69Jvtt+pKFeP4BFf1P4=</dsig:DigestValue>
        </dsig:Reference>
        <!-- Other signature references -->
        <dsig:Reference URI="#str_U1sjQ5j8JtKnObLk">
          <dsig:Transforms>
            <dsig:Transform Algorithm="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#STR-Transform">
              <wsse:TransformationParameters>
                <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
              </wsse:TransformationParameters>
            </dsig:Transform>
          </dsig:Transforms>
          <dsig:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
          <dsig:DigestValue>gRa3zakGn13XISoKpekB3zl0iDqb/LmNy7+aMDtzKIY=</dsig:DigestValue>
        </dsig:Reference>
      </dsig:SignedInfo>
      <dsig:SignatureValue>ptO...E9Q==</dsig:SignatureValue>
      <dsig:KeyInfo>
        <wsse:SecurityTokenReference
                        xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
                        xmlns:wsse11="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd"
                        xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
                        wsse11:TokenType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"
                        wsu:Id="str_U1sjQ5j8JtKnObLk">
          <wsse:KeyIdentifier
                            EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"
                            ValueType="http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1">h5...ow=</wsse:KeyIdentifier>
        </wsse:SecurityTokenReference>
      </dsig:KeyInfo>
    </dsig:Signature>
    

    有人能告诉我如何为这种代币签名吗?算法的逐步描述或使用任何语言/库的示例都会很好。

    In this document is the description of the transformation ,但我无法理解如何在实践中应用它。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Guillermo Gutiérrez    6 年前

    好的,在检查了Oracle的WebLogic server调试和详细日志文件(具有一个工作的服务示例)并设置了标志之后 -Dweblogic.xml.crypto.dsig.debug=true -Dweblogic.xml.crypto.dsig.verbose=true -Dweblogic.xml.crypto.keyinfo.debug=true -Dweblogic.xml.crypto.keyinfo.verbose=true -Dweblogic.wsee.verbose=* -Dweblogic.wsee.debug=* (更多信息 here , here , here here ),谢天谢地,对于安全令牌是如何被取消引用的,有一个很好的见解。基本上 SecurityTokenReference 对于x509证书 KeyIdentifier ,被取消引用为 BinarySecurityToken 以这种方式:

    <wsse:BinarySecurityToken xmlns="" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3">CertificateBase64String</wsse:BinarySecurityToken>
    

    需要注意的一些重要事项包括:

    • ValueType,以及 二进制安全令牌 ,由 TokenType SecurityTokenReference . 在这种情况下 二进制安全令牌 是由引用的x509证书 密钥标识符 元素,编码为base64字符串。
    • 根据规范 二进制安全令牌 仅包括 ValueType 属性因此,它不应包括 EncodingType 属性,则 Id 属性 SecurityTokenReference
    • 的相同命名空间前缀 SecurityTokenReference 已使用。此外,此前缀的命名空间也包含在标记中。
    • 默认命名空间属性设置为空: xmlns=""

    所以基本上整个 SecurityTokenReference 元素替换为新的 二进制安全令牌 ,这是要规范化和散列的(以获取其摘要值)。请注意,它是按原样规范化和摘要化的,因此如果通过删除空的 xmlns 命名空间或前缀命名空间,或通过更改命名空间前缀。

    示例 二进制安全令牌 已使用算法规范化“ http://www.w3.org/2001/10/xml-exc-c14n# ,所以在.NET中,使用摘要算法获取摘要值 http://www.w3.org/2001/04/xmlenc#sha256 “,足以做到这一点:

    System.Security.Cryptography.SHA256 sha = System.Security.Cryptography.SHA256.Create();
    byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes("<wsse:BinarySecurityToken xmlns=\"\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" ValueType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3\">MIIF...2A8=</wsse:BinarySecurityToken>"));
    string digestValue = Convert.ToBase64String(hash);