簡體   English   中英

.NET X509Certificate2 和 RSA 性能不佳

[英].NET poor performance of X509Certificate2 and RSA

我正在開發具有動態 SSL 證書的跨平台多租戶應用程序。 最初,我使用的是 .NET RSA 函數,但由於它們不是跨平台的,所以我將該部分切換到了 Bouncy Castle。 當我這樣做時,我注意到 BC 性能明顯優於 .NET RSA 性能。 我估計 BC 至少要慢 3-5 倍,因為它是 .NET 並且不是在平台上本地運行,但事實並非如此。

現在我必須將 SSL 證書動態加載到 Kestrel 中。 我發現這樣做的唯一方法是將 X509Certificate2 傳遞給它。 在此示例中,它是使用 Microsoft 的“自定義”RSACertificate2 從磁盤上的證書文件和私鑰文件構建的:

  var cert = X509Certificate2.CreateFromPemFile(publicKeyPath, privateKeyPath);

從這兩個問題可以看出,由於它對性能的影響,我已經探索了用 BC 替換它的選項。

如何使用 Bouncy Castle 將私鑰附加到證書

如何使用 Bouncy Castle 導入/讀取 PKCS#12 pfx

現在我只能看到從 Kestrel 切換或打開 Microsoft 的錯誤報告作為選項。 所以我的問題是是否有人有建議?

不管它值多少錢,我懷疑 X509Certificate2 可能使用 RSA class,而 RSA class 似乎很容易在創建 class 時創建新密鑰,之后新密鑰被覆蓋。 因此,巨大的性能差異(高達 200 倍)可能是由於 Microsoft 類創建了新的 RSA 密鑰。 但這只是猜測。

現在我必須將 SSL 證書動態加載到 Kestrel 中。 我發現這樣做的唯一方法是將 X509Certificate2 傳遞給它。

那是對的。 使用 TLS/SSL 的 .NET 組件將只使用系統 TLS 庫。 Windows TLS 提供程序 (SChannel) 僅適用於 Windows 證書和 Windows 證書存儲。 .NET X509Certificate2,在 Windows 上,由 Windows CERT_CONTEXT 支持,因此可用於 TLS。 Bouncy Castle 的證書不是,所以它們不可能。

var cert = X509Certificate2.CreateFromPemFile(publicKeyPath, privateKeyPath);

這實際上會將私鑰加載為臨時密鑰(相當於加載帶有 X509KeyStorageFlags.EphemeralKeySet 的 PFX)。 但是,作為進程外密鑰管理的一部分,SChannel 要求存儲/命名私鑰。 您可能會發現您需要將證書更改為臨時保留(“永久”)私鑰,例如

byte[] pfx = cert.Export(X509ContentType.Pfx);
cert.Dispose();
cert = new X509Certificate2(pfx);

暫無
暫無

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

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