我有一個通過運行生成的私鑰:
openssl req -new -sha384 -x509 -days 63524 -subj "/C=CA/ST=State/L=City/O=Org/CN=Org-CA" -extensions v3_ca -keyout Org-CA.key -out Org-CA.pem -passout pass:pass1234
我需要使用此私鑰和證書來簽署客戶端 CSR。我曾經使用 OpenSSL 來做到這一點,但我需要在 C# 中做到這一點。
我在網上找到了我想做的事情的例子,但這些例子使用的是充氣城堡和未加密的私鑰。
密鑰檔案如下所示:
-----BEGIN ENCRYPTED PRIVATE KEY-----
....
-----END ENCRYPTED PRIVATE KEY-----
我試圖通過這樣做來加載它:
var privatekey = File.ReadAllBytes(@"Org-CA.key");
var rsaKeyParameters = PrivateKeyFactory.DecryptKey("pass1234".ToArray(), privatekey);
但那是行不通的。我收到一條錯誤訊息Wrong number of elements in sequence (Parameter 'seq')'
這是我應該如何解密和加載私鑰?
uj5u.com熱心網友回復:
根據您的 .NET 版本,您可能根本不需要 BouncyCastle。從 .NET Core 3.1 開始,有RSA.ImportEncryptedPkcs8PrivateKey()DER 編碼的加密私有 PKCS#8 密鑰,從 .NET 5.0 開始,甚至RSA.ImportFromEncryptedPem()有 PEM 編碼的加密密鑰。
否則,使用 C#/BouncyCastle 可以匯入加密的私有 PKCS#8 密鑰,例如:
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
...
string encPkcs8 = @"-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----";
StringReader stringReader = new StringReader(encPkcs8);
PemReader pemReader = new PemReader(stringReader, new PasswordFinder("<your password>"));
RsaPrivateCrtKeyParameters keyParams = (RsaPrivateCrtKeyParameters)pemReader.ReadObject();
...
具有以下IPasswordFinder介面的實作:
private class PasswordFinder : IPasswordFinder
{
private string password;
public PasswordFinder(string pwd) => password = pwd;
public char[] GetPassword() => password.ToCharArray();
}
如有必要,可以通過以下方式轉換keyParams為System.Security.Cryptography.RSAParameters:
using Org.BouncyCastle.Security;
...
RSAParameters rsaParameters = DotNetUtilities.ToRSAParameters(keyParams);
可以直接匯入,例如使用RSA.ImportParameters().
編輯:
在挖掘 C#/BouncyCastle 源代碼后,你的方式也是可能的(我以前不知道)。
DecryptKey()有幾個多載,其中之一可以處理 DER 編碼的加密密鑰,正如 Maarten Bodewes 在他的評論中所懷疑的那樣。后者可以通過Org.BouncyCastle.Utilities.IO.Pem.PemReader()類輕松生成。
請注意,這PemReader與第一個實作中的不同(不同的命名空間),這就是我在以下代碼片段中明確使用命名空間的原因。使用這種方法,RsaPrivateCrtKeyParameters可以按如下方式生成實體:
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto.Parameters;
...
StringReader stringReader = new StringReader(encPkcs8);
Org.BouncyCastle.Utilities.IO.Pem.PemReader pemReader = new Org.BouncyCastle.Utilities.IO.Pem.PemReader(stringReader);
Org.BouncyCastle.Utilities.IO.Pem.PemObject pem = pemReader.ReadPemObject();
RsaPrivateCrtKeyParameters keyParams = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.DecryptKey("<your password>".ToCharArray(), pem.Content);
...
pem.Content 包含 DER 編碼的加密私有 PKCS#8 密鑰。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/398769.html
