[英]Client / Server Handshake fails using RestSharp, but works fine on Postman and when using Fiddler as proxy. Certificate length 0
這是我的第一篇文章。 首先,我要感謝大家為本網站所做的所有貢獻,因為這讓我作為初級開發人員的工作變得更加輕松!
我在使用 RestSharp 進行服務器握手時遇到問題。 我正在向 RestSharp POST 請求添加證書,但似乎無法正確驗證它。 然而,完全相同的發布請求將證書添加到 Postman 或通過 Fiddler 作為代理運行相同的代碼似乎工作正常。
我收到錯誤:錯誤:System.Net.WebException:請求被中止:無法創建 SSL/TLS 安全通道。
我完全迷路了。 我替換了我不想與 xxxxxxxxxx 分享的信息。
ServicePointManager.DefaultConnectionLimit = 9999;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback +=
(sender, certificate, chain, sslPolicyErrors) => true;
var client = new RestClient("xxxxxxxxxxxxxxxxxxx");
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection collection = store.Certificates.Find(X509FindType.FindBySubjectName, "xxxxxxxxx", true);
client.ClientCertificates = new X509CertificateCollection();
client.ClientCertificates.AddRange(collection);
client.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
var request = new RestRequest(Method.POST);
request.AddHeader("X-IBM-Client-Id", "xxxxxxxxxxxxxxx");
request.AddHeader("X-IBM-Client-Secret", "xxxxxxxxxxxxxxxxxxxxxxxx");
request.AddHeader("Accept", "*/*");
request.AddHeader("Content-Type", "application/json");
var jsonToSend = JsonConvert.SerializeObject(requestBody);
request.AddParameter("application/json; charset=utf-8", jsonToSend, ParameterType.RequestBody);
request.RequestFormat = DataFormat.Json;
SecurityShower.ShowRestSharpRequest(client, request);
IRestResponse response = client.Execute(request);
return String.IsNullOrEmpty(response.Content) ? response.ErrorMessage : response.Content;
我運行 Wireshark 並發現在握手期間客戶端(我們)發送 certfifcate lenght 0,所以盡管您可以清楚地看到我向 RestSharp 客戶端添加了證書,但我不包含證書。 它在我調試時顯示。
請查看 Wireshark 快照:
我認為這一切都歸結為 Fiddler 和 Postman 如何處理他們的握手和證書。 但對我來說,為什么 .Net 處理這些應用程序的過程不同,這仍然是一個謎(或痛苦)!
編輯:附加信息。
我添加了這段代碼:
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateServerCertificate);
(...)
public static bool ValidateServerCertificate(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
Console.WriteLine("Validation of server cert.");
return true;
}
而且我發現這段代碼沒有執行。
無論如何 - 我不確定如何使用 .net 深入抽象 go,我不知道如何以編程方式影響握手過程......
在服務器端人員的響應后,我們發現我的程序編寫正確。 問題(除了來自 API 提供商的不良通信。)是我們的證書,服務器無法使用。 我正在向運行某些舊版本 Windows 服務器的服務器發送自簽名證書,我被告知我一直在使用的證書是正確的,但是在握手期間服務器是正確的。 正在發送我的證書無法匹配的受信任證書列表,因此 my.Net 編寫的程序正在發送證書長度 0。這與 TLS 1.2 協議一致。 上傳證書鏈后,證書鏈與服務器連接提供的受信任證書列表中的授權機構之一相匹配,並且所有工作都按預期工作。
感謝您的所有答案和快樂的編碼!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.