2011-07-01 23 views
11

HTTPSを使用するサーバー上で実行されているWebサービスを呼び出すと、アプリケーションがSystem.Net.WebExceptionをスローします。リモートサーバーとの信頼関係を確立しません "。この問題を回避して通話を成功させる方法がわかりません。HTTPSを使用してWebサービスを使用するとSystem.Net.WebExceptionがスローされる

+0

ブラウザからURLにアクセスできますか?その場合、ブラウザは証明書が無効であることを警告しますか? – dlev

答えて

17

いくつかの研究の後、私は何が起こっているかを説明しJan Tielensにより、ブログエントリ、私の問題の回避策が見つかりました:

あなたはHTTPSサイトを参照するとき、あなたはおそらくあなたを尋ねるダイアログウィンドウを取得するにはWebサーバーによって提供された証明書を信頼したい場合。したがって、証明書を受け入れる責任は、ユーザーによって処理されます。 Webサービスのシナリオに戻って、SSLとHTTPSを使用するWebサーバーにあるWebサービスを呼び出す場合は、問題があります。コードから呼び出しを行うと、ダイアログウィンドウが表示されず、証明書を信頼するかどうかを尋ねるメッセージが表示されます(幸いにも、これはサーバーサイドのシナリオではかなり醜いものです)。タイプSystem.Net.WebExceptionの未処理の例外がSystem.dllのに
発生しました追加情報

:基礎となる 接続が閉じられました: リモートサーバーとの信頼関係を確立できませんでした。おそらく、次の例外を取得します

しかし、この 問題の解決策があり、あなたは( がICertificatePolicy インタフェースを実装する)独自の CertificatePolicyクラスを作成することによって、あなたの コードでこれを解決することができます。このクラスでは、 はあなた ダイアログ ]ウィンドウで[はい]を押すか、何だろうと同じように、trueまたはfalseを返さないために持っていることを、あなた自身の CheckValidationResult機能を記述する必要があります。開発目的のために私は は は、すべての証明書を受け入れ、以下のクラスを作成しましたので、あなたは はもう嫌なWebExceptionを得ることはありません。

public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy 
{ 
    public TrustAllCertificatePolicy() { } 

    public bool CheckValidationResult(ServicePoint sp, X509Certificate cert, WebRequest req, int problem) 
    { 
     return true; 
    } 
} 

あなたが を CheckValidationResult機能を常に見ることができるようにすべての証明書が になるようにtrueを返します。この クラスを少し安全にしたい場合は、 は、たとえば X509Certificateパラメータを使用してチェックを追加できます。このCertificatePolicyを使用するには 、あなたはそれを使用するServicePointManager を指示する必要があり ます:

System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy(); 

これは 呼び出しを行う前に( アプリケーションのライフサイクルの間に1回)行われなければなりませんあなたのwebserviceに。

3

自己署名入りSSL証明書または信頼できないSSL証明書を使用している場合は、アプリケーションに無視するように指示できます(本当に無視したい場合)。例えば

ServicePointManager.ServerCertificateValidationCallback = _ 
     new RemoteCertificateValidationCallback(IgnoreSelfSSL) 

public bool IgnoreSelfSSL(ServicePoint sp, X509Certificate cert,WebRequest req, int problem) { 
    return true; 
} 

サービスコールを実行する前にコールバックをどこにでも置くことができます。

1

答えに記載されたヒントは、のテストの場合にのみを使用してください。受諾/生産のためには、マシンにWS証明書がインストールされていなければなりません.WSの有効期限や件名などを呼び出す前に証明書の検証を行います。その後、SoapHttpClientProtocol.Proxy.ClientCertificatesによってWS依頼にこの証明書を追加できます。

関連する問題