9

証明書認証を初めて使用する必要があります。 商用パートナーは、XML WebサービスとHTTPサービスの2つのサービスを公開しています。私は両方の.NETクライアントにアクセスする必要があります。私は私のローカルマシンに(ルートと中間2上)SSLCACertificatesとクライアント証明書をインストールしている環境証明書認証を使用したWebサービスとHTTPインターフェイスへのアクセス

の設定

0を試してみましたが、何

は(7プロに勝ちます)certmgr.exeを使用します。 Webサービス

  • については

    1.私は、クライアント証明書(DER)を持っています。

  • サービスは.NETプロキシ経由で消費されます。最後の文で報告

    OrderWSService proxy = new OrderWSService(); 
    string CertFile = "ClientCert_DER.cer"; 
    
    proxy.ClientCertificates.Add(new System.Security.Cryptography.X509Certificates.X509Certificate(CertFile)); 
    orderTrackingTO ot = new orderTrackingTO() { order_id = "80", tracking_id = "82", status = stateOrderType.IN_PREPARATION }; 
    resultResponseTO res = proxy.insertOrderTracking(ot); 
    

    例外:The request failed with an empty response

は、ここでは、コードです。

2. HTTPインターフェース

  • のために、それは私がPOSTメソッドを介して呼び出す必要がありHTTPSインターフェイスです。
  • HTTPSリクエストは、HTTPクライアントからHTTPWebRequestを使用して送信されます。最後の文で報告

    string PostData = "MyPostData"; 
    
    //setting the request 
    HttpWebRequest req; 
    req = (HttpWebRequest)HttpWebRequest.Create(url); 
    req.UserAgent = "MyUserAgent"; 
    req.Method = "POST"; 
    req.ContentType = "application/x-www-form-urlencoded"; 
    req.ClientCertificates.Add(new System.Security.Cryptography.X509Certificates.X509Certificate(CertFile, "MyPassword")); 
    
    //setting the request content 
    byte[] byteArray = Encoding.UTF8.GetBytes(PostData); 
    Stream dataStream = req.GetRequestStream(); 
    dataStream.Write(byteArray, 0, byteArray.Length); 
    dataStream.Close(); 
    
    //obtaining the response 
    WebResponse res = req.GetResponse(); 
    r = new StreamReader(res.GetResponseStream()); 
    

    例外:The request was aborted: Could not create SSL/TLS secure channel

は、ここでは、コードです。

3.最終試してみてください。

Error 107 (net::ERR_SSL_PROTOCOL_ERROR) 

私は立ち往生午前:私は、私は107エラーを取得する両方のURLにアクセスしようとした場合、証明書をインストールした後、Chromeのブラウザ

を使用。

+1

Uは、SSL証明書のathorizationでHTTPリクエストを作成することはできません。 https経由で行う必要があります。この証明書が必要ですか?答えが「はい」の場合、このWebサービスをhttps経由で通信させる必要があります。 – harry180

+0

@ harry180。ご清聴ありがとうございます。私はその質問を編集した。 httpプロトコルで –

+0

を入力すると、ユーザ名とパスワードが送信されます。これはMD5で最小限に暗号化されている必要があります。あなたがそうしたとしても、この情報を許可されていない人に漏らすのはかなり簡単です。そのような情報共有のためにhttpsプロトコルを再考する。 – harry180

答えて

5

以下は、SSL接続をテストする2つの方法、サイトをテストする方法、もう1つはSSLが失敗した原因を特定するためのコールバックメソッドです。それ以外の場合は、なぜそれが失敗しているか、あなたに良いアイデアを与える必要があります。

このメソッドが呼び出されると、証明書の選択ダイアログボックスが表示されます。これは、証明書ストアから自動的に読み込みたい場合に表示されます。なぜなら、有効な証明書が見つからなければ、証明書がインストールされている方法に問題があることがわかるからです。

行うための最善のことは、簡単なコンソールアプリケーションでこのコードを配置します

using System.Security.Cryptography.X509Certificates; 
using System.Net.Security; 
using System.Net; 

private static void CheckSite(string url, string method) 
{ 
    X509Certificate2 cert = null; 
    ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate; 

    X509Store store = new X509Store(StoreLocation.LocalMachine); 
    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); 
    X509Certificate2Collection certcollection = (X509Certificate2Collection)store.Certificates; 
    // pick a certificate from the store 
    cert = X509Certificate2UI.SelectFromCollection(certcollection, 
      "Caption", 
      "Message", X509SelectionFlag.SingleSelection)[0]; 

    store.Close(); 

    HttpWebRequest ws = (HttpWebRequest)WebRequest.Create(url); 
    ws.Credentials = CredentialCache.DefaultCredentials; 
    ws.Method = method; 
    if (cert != null) 
     ws.ClientCertificates.Add(cert); 

    using (HttpWebResponse webResponse = (HttpWebResponse)ws.GetResponse()) 
    { 
     using (Stream responseStream = webResponse.GetResponseStream()) 
     { 
      using (StreamReader responseStreamReader = new StreamReader(responseStream, true)) 
      { 
       string response = responseStreamReader.ReadToEnd(); 
       Console.WriteLine(response); 
       responseStreamReader.Close(); 
      } 

      responseStream.Close(); 
     } 
     webResponse.Close(); 
    } 
} 

/// <summary> 
/// Certificate validation callback. 
/// </summary> 
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) 
{ 
    // If the certificate is a valid, signed certificate, return true. 
    if (error == System.Net.Security.SslPolicyErrors.None) 
    { 
     return true; 
    } 

    Console.WriteLine("X509Certificate [{0}] Policy Error: '{1}'", 
     cert.Subject, 
     error.ToString()); 

    return false; 
} 
+0

ありがとうございました。私はそれを試してみましょう。 –

関連する問題