2009-08-14 13 views
2

XML署名の証明書が有効かどうかを確認するWCF Webサービスを開発しています。 XMLは、有効で有効なX509証明書で署名されています。 Visual Studio開発環境内でサービスを実行している間、X509Certificate2.Verify()メソッドとX509Chain.Build()メソッドはTRUEを返します。しかし、IISでサービスを公開すると、これらのメソッドはFALSEを返します。私が間違っていることや欠けていることは何ですか?私の検証コードは以下の通りです:WebサービスのX509Certificate2検証

public static void VerifyXml(XmlDocument xDoc) 
    { 
     // Create a new SignedXml object and pass it 
     // the XML document class. 
     SignedXml signedXml = new SignedXml(xDoc); 

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

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

     IEnumerable<KeyInfoX509Data> x509Data = signedXml.KeyInfo.Cast<KeyInfoX509Data>(); 
     KeyInfoX509Data info = x509Data.First<KeyInfoX509Data>(); 
     X509Certificate2 cert = info.Certificates[0] as X509Certificate2; 

     bool certIsValid = cert.Verify(); 
     // Here I receive TRUE in development environment and FALSE under IIS 
     if (!certIsValid) 
      throw new X509Exception("Invalid certificate"); 

     bool chainIsValid = false; 
     X509Chain chain = new X509Chain(); 
     chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain; 
     chain.ChainPolicy.RevocationMode = X509RevocationMode.Online; 
     chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0); 
     chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag; 
     chainIsValid = chain.Build(cert); 
     // Here I also receive TRUE in development environment and FALSE under IIS 
     if (!chainIsValid) 
      throw new X509Exception("Chain is invalid"); 

     // Check the signature 
     bool signatureOK = signedXml.CheckSignature(cert, false); 
     if (!signatureOK) 
      throw new X509Exception("Signature is invalid"); 
    } 

アイデアはありますか? ありがとう

答えて

4

ルート証明書はどこにありますか?私はASP.NETがローカルマシンストアを使用すると思う - おそらくVS開発サーバーはユーザーストアを使用し、そこにルート証明書を見つけるが、ASP.NETはそれを見つけられないのだろうか?ローカルマシンストアにルート証明書を追加してみてください。

あなたは詳細を取得するためにX509Chainでステータスを確認することができます。

foreach (X509ChainElement element in chain.ChainElements) 
{ 
    Console.WriteLine ("Element issuer name: {0}", element.Certificate.Issuer); 
    Console.WriteLine ("Element certificate valid until: {0}", element.Certificate.NotAfter); 
    Console.WriteLine ("Element certificate is valid: {0}", element.Certificate.Verify()); 
    Console.WriteLine ("Element error status length: {0}", element.ChainElementStatus.Length); 
    Console.WriteLine ("Element information: {0}", element.Information); 
    Console.WriteLine ("Number of element extensions: {0}{1}", element.Certificate.Extensions.Count, Environment.NewLine); 

    if (ch.ChainStatus.Length > 1) 
    { 
     for (int index = 0; index < element.ChainElementStatus.Length; index++) 
     { 
      Console.WriteLine (element.ChainElementStatus[index].Status); 
      Console.WriteLine (element.ChainElementStatus[index].StatusInformation); 
     } 
    } 
} 
+1

ローカルマシンストアにルート証明書を追加するには、問題を解決しました。 Thaks a lot! –

関連する問題