X509 인증서에서 Xml의 서명을 확인하는 코드를 작성했으며 제목 줄에 예외 메시지가 있습니다.SignedXml.CheckSignature 예외를 throw합니다. 값은 null 일 수 없습니다. 매개 변수 이름 : 이름
내가 성공적으로 내 인증서 저장소에서 인증서를로드 한
Dim cert As X509Certificate2 = GetCertificate("Certificate Name")
Dim signedXml As SignedXml = New SignedXml(Me.samlResponseXml)
If (signedXml.CheckSignature(cert, True)) Then
' The signature is valid
Else
' The signature is invalid
Throw New ArgumentException("Invalid signature found in Saml Xml.")
End If
내 샘플 코드 (코드 1 라인). signedXml을 성공적으로 채 웠습니다 (코드의 두 번째 줄).
signedXml.CheckSignature(cert, True)
함수를 호출하면 예외가 발생합니다. 메시지가 매우 명확하지 않습니다.
값은 null 일 수 없습니다.
매개 변수 이름 : 이름
어떤 단서가 잘못 되었습니까?
호출 스택 :
System.ArgumentNullException은 = 값이 null 일 수 없습니다 사용자 코드에 의해
메시지 처리되지 않은이었다. 매개 변수 이름 : 이름 paramName에 = 이름
소스 = mscorlib에의 스택 트레이스 : System.Security.Cryptography.CryptoConfig.CreateFromName에서 System.Security.Cryptography.Xml.SignedXml.CheckSignedInfo에서 (AsymmetricAlgorithm 키 (문자열 이름, [] 인수 개체)) System.Security.Cryptography.Xml.SignedXml.CheckSignature에서 System.Security.Cryptography.Xml.SignedXml.CheckSignature (AsymmetricAlgorithm 키) (X509Certificate2 인증서, 부울 verifySignatureOnly) D에서 MyNamespace.MyClass.MyFunction()에서 에서 : \ Projects \ MyProject \ Test.vb : 줄 117
업데이트 1 나는 닷넷 프레임 워크 소스 디버그에 설정하고, 예외가 SignedXml.CheckSignedInfo
방법에서 발생합니다, 코드의 라인
SignatureDescription signatureDescription = CryptoConfig.CreateFromName(SignatureMethod) as SignatureDescription;
그것의 SignatureMethod이의 랩임을 분명히있다
public string SignatureMethod {
get { return m_signature.SignedInfo.SignatureMethod; }
}
m_signature.SignedInfo.SignatureMethod
은 널값입니다. MSDN에서 SignatureMethod에 대한 설명을 http://msdn.microsoft.com/en-us/library/system.security.cryptography.xml.signedxml.signaturemethod.aspx으로 다시 읽고 아래 서명 부분에 서명 된 XML 코드를 확인했습니다. 값이있는 SignatureMethod
태그가 있지만 SignedXml에서 처리 할 수없는 이유는 무엇입니까?
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="#_ea559faf-417b-407f-bdc2-bccc76dab76c">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces PrefixList="#default samlp saml ds xs xsi" xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" />
</Transform>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>fvQx+J90ZGKhwj8Mfhg6v/esOtI=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>Ft2mQEA3a39uRq5N94pDI8Y6B/UGLXHkZJ+/besOQmEtZoi630vBDzQfIxx5Djgg6YYeF/s67iF+KLgfvBrHxoe3E8xiqTwBigem41+PJdITlwgrOTkLo2sSdj4DaFdxeN+SCy6KfKXpDBvDyN4i/R0hBKodGwytfzK/DMeOhHU=</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>MIICBjCCAXOgAwIBAgIQ3VhOVESMV71O0q5EttLxxDAJBgUrDgMCHQUAMBwxGjAYBgNVBAMTEUlkZW50aXR5UHJvdmlkZXIxMB4XDTExMDkwMTA1MDAwMFoXDTQwMTIzMTA1MDAwMFowHDEaMBgGA1UEAxMRSWRlbnRpdHlQcm92aWRlcjEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMBVhtKneTweMOgmvwO+i8AvZ5p0/PGatzLKNXVctTROcXb48u3L9JR3sVPasAFNsafq086xqaWyuFM7jAHtYHTQg/oLt+wGCKd7w/n4s0crxM3NVahDmSUPnBW9RZM2XD4pOs9DTu8aEEQGN/p01jrIMgPYhdlVsTJSg43lLyzjAgMBAAGjUTBPME0GA1UdAQRGMESAEHDoTOJwf2lSgqgCU4TXI2ShHjAcMRowGAYDVQQDExFJZGVudGl0eVByb3ZpZGVyMYIQ3VhOVESMV71O0q5EttLxxDAJBgUrDgMCHQUAA4GBAKvsy5KkU9dDNWDRW55/+s7txFfl4ZmWw45AmZYXEA90g+xzALFtWbX/QGqCOx4C0h5fB5Oco084B7gJK/uf2a8oaYvxYGwlxgRxJ9Dq5XBx5ZhOuobT8G2xVy575cbaGnFbObG6/E33Mva1gAYdw7rvGaz/dYuBeChsEIvzROYU</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
XML이 전체 Me.samlResponseXml을 게시 했습니까? AFAIK, Signature 요소를 찾아서 LoadXml 요소 인 signedXml.LoadXml (theSignatureElement)에 전달해야합니다. 유사 : http://msdn.microsoft.com/en-us/library/kd4wwa16.aspx –
주석 주셔서 감사합니다, 이것은 XML의 서명 부분입니다. 나중에 당신이 설명했던 것을 알아 냈습니다. – hardywang