X509証明書からXmlの署名を検証するコードを書き、件名に例外メッセージがあります。SignedXml.CheckSignature throws exception:値に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に成功しました(コードの2行目)。私はsignedXml.CheckSignature(cert, True)
関数を呼び出すとき
例外がスローされます。メッセージは非常に不明です:
値をnullにすることはできません。
パラメータ名:名前
ここで何が間違っていますか?
コールスタック:
System.ArgumentNullExceptionは
メッセージ=値がヌルにすることはできませんユーザコードによって未処理でした。パラメータ名:名のparamName =名
ソース= mscorlibのStackTrace: System.Security.Cryptography.CryptoConfig.CreateFromNameで(文字列名、[]引数オブジェクト)System.Security.Cryptography.Xml.SignedXml.CheckSignedInfo(AsymmetricAlgorithmキーで DでSystem.Security.Cryptography.Xml.SignedXml.CheckSignatureでSystem.Security.Cryptography.Xml.SignedXml.CheckSignature(AsymmetricAlgorithmキー) (X509Certificate2証明書、ブールverifySignatureOnly)MyNamespace.MyClass.MyFunctionで ()で) 。 \ Projects \ MyProject \ Test.vb:行117
更新1 それはのSignatureMethodは
public string SignatureMethod {
get { return m_signature.SignedInfo.SignatureMethod; }
}
のラップであることは明らかである私は、.NET Frameworkのソースのデバッグをオンにし、例外がSignedXml.CheckSignedInfo
メソッドからスローされ、コード
SignatureDescription signatureDescription = CryptoConfig.CreateFromName(SignatureMethod) as SignatureDescription;
の行があります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>
あなたは完全なMe.samlResponseXmlを投稿したXMLですか? AFAIKでは、Signature要素を見つけて、それをLoadXml要素に渡す必要があります:signedXml.LoadXml(theSignatureElement)。類似:http://msdn.microsoft.com/en-us/library/kd4wwa16.aspx –
コメントのおかげで、これはXMLの署名部分です。後で私はあなたが説明したことを理解しました。 – hardywang