獲取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核心需要爲了收集適當的數據來調用ServerCertificateCustomValidationCallback
。例如,框架無法創建cert
對象或另一個參數。更多信息,請以.Net核心的問題DOTNET核心的GitHub庫提供解決方法的討論中找到:
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");
}
}
沒有爲解決這個問題的另一個途徑,那就是使用的libcurl的一個版本,與OpenSSL的支持編譯。適用於MacOS,這裏是如何做到這一點的好教程:
https://spin.atomicobject.com/2017/09/28/net-core-osx-libcurl-openssl/
對於短版,搶與OpenSSL的支持編譯最新的libcurl的副本:
brew install curl --with-openssl
你可能不要不想強制整個操作系統使用非Apple版本的libcurl,因此您可能需要使用DYLD_LIBRARY_PATH
環境變量而不是使用brew來強制將二進制文件鏈接到OS的常規路徑。
export DYLD_LIBRARY_PATH=/usr/local/opt/curl/lib${DYLD_LIBRARY_PATH:+:$DYLD_LIBRARY_PATH}
上述命令可用於在終端中運行dotnet
時設置適當的環境變量。但這並不適用於GUI應用程序。如果你正在使用Visual Studio for Mac,您可以設置環境變量在項目運行設置:使用IdentityServer4和令牌授權時
第二種方法是必要的我。 .NET Core 2.0授權管道正在使用HttpClient
實例調用令牌授權。由於我無權訪問HttpClient
或其HttpClientHandler
對象,因此我需要強制HttpClient
實例使用合適的libcurl版本,以查看我的可信證書的KeyChain系統根目錄。否則,當嘗試使用Authorize(AuthenticationSchemes = IdentityServerAuthenticationDefaults.AuthenticationScheme)]
屬性保護webapi端點時,我會得到System.Net.Http.CurlException: Peer certificate cannot be authenticated with given CA certificates environment variable
。
在尋找解決方法之前,我花了數小時研究此問題。我的整個目標是在使用IdentityServer4爲macOs開發期間使用自簽名證書來保護我的webapi。希望這可以幫助。
這可能是有用的http://stackoverflow.com/questions/2675133/c-sharp-ignore-certificate-errors –
可能重複的[繞過無效SSL證書在.net核心](http://stackoverflow.com/questions/38138952/bypass-invalid-ssl-certificate-in-net-core) – thmshd
感謝所有指向其他線程的指針 - 但在過去曾經訪問過它們,但仍然有問題 - 它們都不會編譯。每次都有一些無法找到的參考。很明顯,我錯過了一些明顯的東西!小片段沒有提供足夠的信息(對我來說),比如還需要包含或引用其他信息。按Ctrl - 。也沒有提出任何合理的建議。 – DaveEP