2012-03-28 3 views
4

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> 
+1

XML이 전체 Me.samlResponseXml을 게시 했습니까? AFAIK, Signature 요소를 찾아서 LoadXml 요소 인 signedXml.LoadXml (theSignatureElement)에 전달해야합니다. 유사 : http://msdn.microsoft.com/en-us/library/kd4wwa16.aspx –

+0

주석 주셔서 감사합니다, 이것은 XML의 서명 부분입니다. 나중에 당신이 설명했던 것을 알아 냈습니다. – hardywang

답변

1

SignedXml에는 확인을 위해 2 단계가 필요합니다. 1 단계는 생성 된 요소가있는 문서 나 요소를 제공하는 구조입니다. 파트 2는 LoadXml 메서드를 통해 Signature 요소 (다른 문서의 요소 일 수 있음)에로드해야한다는 것입니다.

the SignedXml MSDN page에서 예를 들자면,하지만 인증서를 수정하려면 :
public static Boolean VerifyXmlFile(XmlElement samlResponseXml, X509Certificate2 cert) 
{ 
    // Create a new SignedXml object and pass it the XML. 
    SignedXml signedXml = new SignedXml(samlResponseXml); 

    // Find the "Signature" node and create a new XmlNodeList object. 
    XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature"); 

    // TODO: Error checking. Was it found? Were too many found? 

    // Load the signature node. 
    signedXml.LoadXml((XmlElement)nodeList[0]); 

    // Check the signature and return the result. 
    return signedXml.CheckSignature(cert, true); 
} 

SignedXml를 사용하여 MSDN 페이지의 설명 부분에서 오는 문제의 인식. 특히 서명 된 키가 서명 된 콘텐츠에 적합하도록 보장합니다 (TLS 세션 중에 호스트 이름 확인을 수행하는 것과 유사).