好的,在检查了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);