我目前正在將代碼從.NET 4.7.2升級到.NET 5。當下面的代碼在.NET 4.7.2下運行時,它成功地連接到網路服務器,而在.NET 5下,它拋出了這個例外:
Exception: "SSL連接無法建立,見內部例外。"。
-> InnerException。"認證失敗,見內部例外。"; InnerException: "認證失敗,見內部例外。
-> InnerException: "處理時發生了一個未知的錯誤"。
為什么我在.NET 4.7.2和.NET 5之間會得到不同的行為呢?
如果你不提供一個證書,你會得到同樣的例外。我曾嘗試從.pfx檔案和本地機器的X509Store中加載證書。我還讓公司的其他開發人員進行了嘗試,他們得到了相同的結果。
該代碼在 Windows 10 上運行,使用的是 VS 2019,但在部署到 Windows IIS 服務器時,也出現了同樣的問題。
請幫助我,因為我已經沒有想法了
。using RestSharp;
using System;
using System.Linq;
using System.Net;
使用System.Security.Cryptography.X509Certificates;
namespace SwipeTestNet5。
{
class Program {
{
static void Main(string[] args)?
{
try
{
//證書庫的獲取。
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine)。
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly)。
//根據應用程式設定certificateName從商店獲取證書。
//!顯然這個網址不是真正的網址。
var certificateName = "test-cert-name" ;
//下面一行會出錯,如果有相同友好名稱的證書...你不應該讓這種情況發生。
var cert = store.Certificate.Cast<X509Certificate2>().SingleOrDefault(c => c.FriendlyName == certificateName)。
if (cert == null)
throw new Exception("Could not find certificate with name: "/span> certificateName);
//處理來自服務器的證書上的任何證書錯誤。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
//!顯然這個網址不是真正的網址。
var url = "https://test.com.au/api"/span>;
var client = new RestClient(url)。
var request = new RestRequest(Method.GET)。
client.ClientCertificates = new X509CertificateCollection(new[ ] { cert })。
//處理來自服務器的證書上的任何證書錯誤。
// ! 當在.NET 4.7.2下運行時,這個回呼會被觸發,在.NET 5下,它永遠不會達到的要求。
client.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true。
//!顯然這個url不是真正的引數。
var parameters = new
{
param1 = "a"/span>,
param2 = "b",
param3 = "c".
};
request.AddObject(引數)。
var response = client.Execute(request);
//! 在NET4.7.2下response.ErrorException為空并繼續。
// ! 在NET 5下,response.ErrorException被填充成這樣: /!
// ErrorException:
// -> InnerException: "認證失敗,見內部例外。"
// -> InnerException: "在處理證書時發生了一個未知的錯誤。"
if (response.ErrorException != null)
拋出 response.ErrorException。
//! 在.NET 4.7.2版本中到達這里是沒有問題的。
if (response.StatusCode != HttpStatusCode.OK)
{
Exception ex = new Exception($"Error calling {client}"/span>)。
ex.Data.Add("xml"/span>, response.Content)。
ex.Data.Add("status code", response.StatusCode);
ex.Data.Add("param1", parameters.param1);
ex.Data.Add("param2", parameters.param2);
ex.Data.Add("param3", parameters.param3)。
throw ex.Data.Add("param3", parameters.param3;)
}
Console.WriteLine("成功")。
}
catch(Exception ex)
{
Console.WriteLine(ex.Message)。
}
}
}
}
uj5u.com熱心網友回復:
問題出在這里:
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine)。
App Pool身份默認沒有管理員權限,但從本地機器商店讀取密鑰時需要該權限。要么明確授予存盤在本地機器中的密鑰的讀取權限,要么在 App Pool 身份的個人存盤(當前用戶背景關系)中安裝證書。
為了授予 App Pool 身份對本地機器的讀取權限,請導航到證書,右鍵單擊并選擇所有任務 -> 管理私鑰選單項。
uj5u.com熱心網友回復:
改變這個
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
用這個
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls。
or
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3。
或者允許忽略這個錯誤
ServicePointManager
.ServerCertificateValidationCallback =
(sender, cert, chain, sslPolicyErrors) => true;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/317203.html
標籤:
上一篇:各種環境下的POST請求
