2012-03-28 5 views
4

Я пишу фрагмент кода для проверки подписи в Xml из сертификата X509 и получил сообщение об исключении в строке темы.SignedXml.CheckSignature throws exception: Значение не может быть нулевым. Имя параметра: name

Мой пример кода

 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 

я загрузил сертификат от моего сертификата магазина успешно (первая строка кода). Я успешно заполнил signedXml (вторая строка кода).

Исключение составляет, когда я звоню signedXml.CheckSignature(cert, True) функция. Сообщение очень нечеткое:

Значение не может быть пустым. Имя
Параметр: имя

Любые подсказки, что здесь не так?

стека вызовов:

System.ArgumentNullException была необработанным кодом пользователя
Message = Значение не может быть пустым. Имя параметра: имя ParamName = имя
Источник = mscorlib StackTrace: на System.Security.Cryptography.CryptoConfig.CreateFromName (имя String, Object [] арг) на System.Security.Cryptography.Xml.SignedXml.CheckSignedInfo (ключ AsymmetricAlgorithm) на System.Security.Cryptography.Xml.SignedXml.CheckSignature (ключ AsymmetricAlgorithm) в System.Security.Cryptography.Xml.SignedXml.CheckSignature (X509Certificate2 сертификата, булева verifySignatureOnly) на MyNamespace.MyClass.MyFunction() в D: \ Проекты \ MyProject \ Test.vb: строка 117

Update 1 Я включил .Net Framework источника отладки, и исключение из 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

ПодписанныйXml требует двух шагов для проверки. Шаг 1 - это построение, где вы даете ему документ или элемент, в котором будут найдены подписанные элементы. Вторая часть заключается в том, что вам нужно загрузить элемент Signature (который мог бы быть получен из другого документа) с помощью метода LoadXml.

Возьмем пример из 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).

 Смежные вопросы

  • Нет связанных вопросов^_^