簡體   English   中英

.NET 通過 TLS 1.2 刪除客戶端證書

[英].NET dropping client certificate over TLS 1.2

您好,似乎有人以一百萬種不同的方式詢問了這個問題的某種形式,但許多人沒有答案,或者答案不適用於我。

我們有一個微不足道的小 .NET 服務,它調用現在只支持 TLS 1.2 的 3rd 方 API。

        var requestHandler = new WebRequestHandler();
        var clientCert = GetClientCert("THUMBPRINT");

        requestHandler.ClientCertificates.Add(clientCert);
        var encodedHeader = "FOO";
        var httpClient = new HttpClient(requestHandler) { BaseAddress = new Uri("https://foo.bar.com/rest/api/") };
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", encodedHeader);

        var httpResponse = httpClient.GetAsync("").Result;
        var responseContent = httpResponse.Content.ReadAsStringAsync().Result;

當我將安全協議顯式設置為 1.2 或針對默認為 1.2 的框架時,客戶端證書不是發送到服務器的數據包的一部分。 我已經在 Wireshark 中檢查過它並且證書從未超過 1.2。 此時,服務器發送致命警報握手失敗 (40),導致以下 .Net 異常:

The request was aborted: Could not create SSL/TLS secure channel.

我可以通過 Chrome 或 Postman(本機)撥打相同的電話,並且工作正常。 如果我將協議設置為 1.1,它就可以正常工作。 但是如果我通過 .NET 作為 1.2 運行它,它每次都會失敗。 即使我故意不添加我的客戶端證書,我也會在 Wireshark 中得到完全相同的錯誤和相同的流量。

我通過https://www.ssllabs.com/運行了 3rd 方端點,結果很好。 我在任何一側都看不到 MD5 簽名。 一切都用 sha1 或 sha256 簽名,並使用 RSA 加密。

我啟用了跟蹤。 以下輸出似乎表明找到證書或其私鑰沒有問題:

System.Net Information: 0 : [19512] SecureChannel#41622463 - Certificate is of type X509Certificate2 and contains the private key.
System.Net Information: 0 : [19512] SecureChannel#41622463::.AcquireClientCredentials, new SecureCredential() (flags=(ValidateManual, NoDefaultCred, SendAuxRecord, UseStrongCrypto), m_ProtocolFlags=(Zero), m_EncryptionPolicy=RequireEncryption)
System.Net Information: 0 : [19512] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent  = Outbound, scc     = System.Net.SecureCredential)
System.Net Information: 0 : [19512] InitializeSecurityContext(credential = 
System.Net.SafeFreeCredential_SECURITY, context = 1ed7465db80:1f1d854c910, targetName = foo.bar.com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [19512] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=133, returned code=ContinueNeeded).

我還打開了 SCHANNEL 事件日志記錄。 在那里我可以看到它使用私鑰獲取客戶端證書。

The TLS client credential's private key has the following properties:

   CSP name: Microsoft Enhanced Cryptographic Provider v1.0
   CSP type: 1
   Key name: {some hex here}
   Key Type: key exchange
   Key Flags: 0x0

 The attached data contains the certificate.

其次是Wireshark中Alert包對應的錯誤:

A fatal alert was received from the remote endpoint. The TLS protocol defined fatal alert code is 40.

我完全沒有想法。 感覺就像 .Net 中的一個錯誤。 我們想了一會兒,這是一個不完整的與我們的客戶端證書的信任鏈,因為我們的證書包只有客戶端證書和一個中間 CA。 但是我們從供應商那里獲得了根 CA,現在 Windows 說證書是合法的。

我在 Wireshark 中注意到的一件有趣的事情是,我們在成功調用時發送客戶端證書和中間 CA。 我不知道它是如何獲取中間 CA 的,因為我只提取客戶端證書以附加到請求。 一旦我們擁有它,為什么它不也提交根 CA? 我的直覺告訴我問題可能仍然存在於此,但我無法證明。 任何日志中都沒有任何內容表明信任鏈失敗。

我什至還連接了 ProcMon,看看我是否能看到任何錯誤但沒有跳出。 伙計,我本可以用我花在這上面的時間用 Java 重寫整個事情。

我嘗試過的其他一些不起作用的事情:

針對 .Net 4.8

機器存儲與用戶存儲

直接從 pfx 加載

HttpWebRequest 而不是 HttpClient

帶有 SslStream 的 TcpClient

較新的 Windows 10 版本

編輯我剛剛讀到一些說 SHA-1 簽名也從 TLS 1.2 和 MD5 中刪除的內容。 我們的客戶證書在 SHA-1 中簽名。 我認為可能就是這樣,我們正在聯系我們的供應商。

我的問題和我的解決方案最終與這個相同。 唯一的區別是我的客戶端證書是 SHA1 而不是 MD5。 .NET 顯然也在放棄 SHA1 證書。

C# 和 dotnet 4.7.1 沒有為 TLS 1.2 調用添加自定義證書

這篇文章給了我線索,因為其他帖子表明SHA1仍然被接受。 我的 SHA1 證書在 .NET 之外仍然有效。

https://tools.ietf.org/id/draft-ietf-tls-md5-sha1-deprecate-00.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM