は
を動作するように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とトークン認証を使用する場合に
第二のアプローチは、私のために必要でした。 .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を保護するための自己署名証明書を使用することでした。お役に立てれば。
これは役に立ちます:http://stackoverflow.com/questions/2675133/c-sharp-ignore-certificate-errors –
[net .netの無効なSSL証明書を迂回する可能性があります](http://stackoverflow.com)/question/38138952/bypass-invalid-ssl-certificate-in-net-core) – thmshd
他のスレッドへのすべてのポインタをありがとう - しかし、過去にそれらのすべてを訪問しても、まだ問題があります。たびに見つけることができない参考文献があります。明らかに私は何かここに明白な行方不明です!小さなスニペットは、他に何が含まれているか参照されているかのような十分な情報を(私には)与えません。 Ctrl-。合理的な提案もしていません。 – DaveEP