2017-03-10 22 views
9

私は、リモートサーバーをポーリングし、表示されるようにデータを転送する.NETコアアプリケーションを作成しています。これはPHPが証明書を無視しているため(ブラウザでも問題)、C#.NET COREに移行したいので、これはシステム内の唯一のPHPだからです。不正な証明書を無視する - .NET CORE

サーバーは良好ですが、さまざまな理由で証明書をすぐに更新することはできません。

要求はHttpClientをを使用している:

 HttpClient httpClient = new HttpClient(); 
     try 
     { 
      string url = "https://URLGoesHere.php"; 
      MyData md = new MyData(); // this is some data we need to pass as a json 
      string postBody = JsonConvert.SerializeObject(md); 
      httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));     
      HttpResponseMessage wcfResponse = await httpClient.PostAsync(url, new StringContent(postBody, Encoding.UTF8, "application/json")); 
      Console.WriteLine(wcfResponse.Content); 
     } 
     catch (HttpRequestException hre) 
     { 
     // This exception is being triggered 
     } 

がこれを研究したことは、普遍的な勧告はServicePointManagerを使用するようですが、これは、.NETのコアでは使用できないと私はトラブル推奨交換を見つけることを抱えています。

.NETコアでこれを行う簡単な方法がありますか?

+2

これは役に立ちます:http://stackoverflow.com/questions/2675133/c-sharp-ignore-certificate-errors –

+2

[net .netの無効なSSL証明書を迂回する可能性があります](http://stackoverflow.com)/question/38138952/bypass-invalid-ssl-certificate-in-net-core) – thmshd

+2

他のスレッドへのすべてのポインタをありがとう - しかし、過去にそれらのすべてを訪問しても、まだ問題があります。たびに見つけることができない参考文献があります。明らかに私は何かここに明白な行方不明です!小さなスニペットは、他に何が含まれているか参照されているかのような十分な情報を(私には)与えません。 Ctrl-。合理的な提案もしていません。 – DaveEP

答えて

5

代わりのnew HttpClient()あなたは

Windows上、およびlibcurlのは、OpenSSLを使用するようにコンパイルされたLinux上で動作するはず
var handler = new System.Net.Http.HttpClientHandler(); 
using (var httpClient = new System.Net.Http.HttpClient(handler)) 
{ 
    handler.ServerCertificateCustomValidationCallback = (request, cert, chain, errors) => 
    { 
     // Log it, then use the same answer it would have had if we didn't make a callback. 
     Console.WriteLine(cert); 
     return errors == SslPolicyErrors.None; 
    }; 

    ... 
} 

に似て何かをしたいです。他のカールバックエンドでは、Linuxは例外をスローします。

+2

の.NET Coreでサポートされている唯一の方法です.Mac OSの.NET Core 1.1でも動作しません。例外メッセージは次のとおりです。 '使用中のlibcurlライブラリ(7.51.0)とそのSSLバックエンド(" SecureTransport ")は、証明書のカスタム処理をサポートしていません。 OpenSSLでビルドされたlibcurlが必要です。) ' – Ricky

+0

リッキー、私の上記の答えをいくつかのオプションで見てください。 –

+0

@bartonjs:macosといくつかのLinuxバージョンのすべてのシナリオでこれをどうやって動かすかを考えてくれた正しい方に向いてくれてありがとう。とても役に立ちました。 –

2

を動作するようにLinuxとMacOSの取得は、LinuxやMacOSで作業している場合は、HttpClientは、あなたがそれはあなたの信頼できるストアにある場合でも、自己署名証明書にアクセスすることを許可しませんするシナリオが発生する可能性があります。あなたはおそらく次のようになります。(他の回答のように)あなたが実装している場合の

System.Net.Http.CurlException: Peer certificate cannot be authenticated with given CA certificates environment variable 

handler.ServerCertificateCustomValidationCallback = (request, cert, chain, errors) => 
{ 
    // Log it, then use the same answer it would have had if we didn't make a callback. 
    Console.WriteLine(cert); 
    return errors == SslPolicyErrors.None; 
}; 

これは、マシンが適切なコールバックをサポートしていない上のlibcurlのバージョンによるものです.Net CoreはServerCertificateCustomValidationCallbackに電話するための適切なデータを収集する必要があります。たとえば、フレームワークがcertオブジェクトまたは別のパラメータを作成する方法はありません。詳しくはDOTNETコアのGitHubのレポに問題で.NETコアに設けられた問題を回避するための議論に見出すことができる:

https://github.com/dotnet/corefx/issues/19709

(のみ試験または特定の内部アプリケーションのために使用されるべきである)の回避策

using System; 
using System.Net.Http; 
using System.Runtime.InteropServices; 

namespace netcurl 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var url = "https://localhost:5001/.well-known/openid-configuration"; 
      var handler = new HttpClientHandler(); 
      using (var httpClient = new HttpClient(handler)) 
      { 
       // Only do this for testing and potentially on linux/mac machines 
       if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) && IsTestUrl(url)) 
       { 
        handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; 
       } 

       var output = httpClient.GetStringAsync(url).Result; 

       Console.WriteLine(output); 
      } 
     } 

     static bool IsTestUrl(string url) => url.Contains("localhost"); 
    } 
} 

は、この問題を修正するための別の道があり、それはOpenSSLサポート付きでコンパイルされたlibcurlのバージョンを使用している:以下れます。

https://spin.atomicobject.com/2017/09/28/net-core-osx-libcurl-openssl/

OpenSSLサポート付きでコンパイル最新のlibcurlのコピーをつかむ、短いバージョンの場合:MacOSのために、ここでそれを行う方法についての良いチュートリアルです

brew install curl --with-openssl 

おそらくドンOS全体が強制的にlibcurlの非Appleバージョンを使用するようにしたいので、brewを使用してバイナリをOSの通常のパスに強制的にリンクさせるのではなく、DYLD_LIBRARY_PATH環境変数を使用することをお勧めします。

export DYLD_LIBRARY_PATH=/usr/local/opt/curl/lib${DYLD_LIBRARY_PATH:+:$DYLD_LIBRARY_PATH} 

上記のコマンドは、端末でdotnetを実行するときに適切な環境変数を設定するために使用できます。しかし、これは実際にGUIアプリケーションには当てはまりません。あなたがMac用のVisual Studioを使用している場合は、プロジェクトの実行設定で環境変数を設定することができますIdentityServer4とトークン認証を使用する場合に

Visual Studio for Mac project run settings

第二のアプローチは、私のために必要でした。 .NET Core 2.0承認パイプラインがHttpClientインスタンスを使用してトークン機関にコールしていました。 HttpClientまたはそのHttpClientHandlerオブジェクトにアクセスできなかったため、HttpClientインスタンスに、信頼できる証明書のKeyChainシステムルートを調べるlibcurlの適切なバージョンを使用する必要がありました。そうでなければ、Authorize(AuthenticationSchemes = IdentityServerAuthenticationDefaults.AuthenticationScheme)]属性を使用してwebapiエンドポイントを保護しようとすると、System.Net.Http.CurlException: Peer certificate cannot be authenticated with given CA certificates environment variableを取得します。

回避策を探す前に、これを研究する時間を費やしました。私の全目標は、アイデンティティサーバー4を使用してmacapを開発する際にwebapiを保護するための自己署名証明書を使用することでした。お役に立てれば。

+0

あなたの投稿に感謝します。それは正しい方向に私を助けた。 .NET標準2を使用しています。0最初に私はすべての問題に直面していた理由を理解できませんでした... 私はカールとopensslとすべてのものを何度も試してみましたが、何も助けてくれませんでした。 私は厄介なハックをしました(あなたのコード例はどちらにも使えませんでした)。 'if(RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { handler.ServerCertificateCustomValidationCallback = null; } ' – martinmose

関連する問題