10

パブリック ルート機関証明書ファイル X509 を使用して httpwebrequest を作成しています。秘密鍵ではなく、公開鍵しか持っていません。コンソール アプリからはすべて正常に機能しますが、asp.net アプリからは機能しません。「基になる接続が閉じられました: SSL/TLS セキュア チャネルの信頼関係を確立できませんでした」というエラーが表示されます。

検証を無効にするオプションはオプションではありません。

ここにコードがあります

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://xxxxxxx/gateway.aspx");
string post = "abcdef";
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
req.ContentLength = post.Length;

var cert = System.Security.Cryptography.X509Certificates.X509Certificate.CreateFromCertFile(@"c:\temp\root.cer");

req.ClientCertificates.Add(cert);
StreamWriter stOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
stOut.Write(post.ToString());
stOut.Close();

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

System.Net および System.Net ソケットからのシステム ログを次に示します。

System.Net 情報: 0 : [5928] SecureChannel#8106798 - 信頼されたルート機関への証明書チェーンを構築できませんでした。

System.Net 情報: 0 : [5928] SecureChannel#8106798 - リモート証明書がユーザーによって無効であることが確認されました。

System.Net.Sockets Verbose: 0: [5928] Socket#7486778::Dispose()

System.Net エラー: 0 : [5928] HttpWebRequest#51319244 の例外:: - 基になる接続が閉じられました: SSL/TLS セキュア チャネルの信頼関係を確立できませんでした。

System.Net エラー: 0 : [5928] HttpWebRequest#51319244::EndGetRequestStream の例外 - 基になる接続が閉じられました: SSL/TLS セキュア チャネルの信頼関係を確立できませんでした。

詳細情報

このコードを使用する場合 (CodeGuru から)

  public static bool ValidateServerCertificate(object sender,
     X509Certificate certificate, X509Chain chain,
     SslPolicyErrors sslPolicyErrors)
  {
     if (sslPolicyErrors ==
        SslPolicyErrors.RemoteCertificateChainErrors) {
        return false;
     } else if (sslPolicyErrors ==
        SslPolicyErrors.RemoteCertificateNameMismatch) {
        System.Security.Policy.Zone z =
           System.Security.Policy.Zone.CreateFromUrl
           (((HttpWebRequest)sender).RequestUri.ToString());
        if (z.SecurityZone ==
           System.Security.SecurityZone.Intranet ||
           z.SecurityZone ==
           System.Security.SecurityZone.MyComputer) {
           return true;
        }
        return false;
     }
     return true;
  }

最終的にエラーが発生します:

リモート証明書チェーン エラー

4

2 に答える 2

13

この問題は、これを Application_Start に追加することで修正できます。

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

基本的に、サーバーとその証明書の間の不一致を許可します。

ソース:

http://www.ben-morris.com/asp-net-web-services-and-ssl-certificates-establishing-a-trust-relationship

注: この回避策は本番環境では推奨されません

于 2012-03-15T22:25:18.450 に答える
1

問題はこのリンクに投稿されている可能性があるようです。ASPNET ワーカー プロセスでは、証明書名がサーバー名と一致する必要があります。テスト環境で実装できる回避策があります。

証明書の生成には、次のようなコマンドで SelfSSL.exe と呼ばれる無料のプログラムを使用できます。

SelfSSL.exe /T /N:CN=localhost /V:999 /Q (「localhost」は証明書名)

と:

winHTTPCertCfg.exe -g -c local_machine\my -s localhost -a Administrators(管理者に証明書へのアクセスを許可するため)

于 2010-01-07T17:29:07.460 に答える