我想從C#代碼中創建iothub設備證書。根 CA 以 .pfx 的形式存盤在 keyvault 中,以字串的形式獲取,然后從 base 64 進行轉換,以便獲得證書位元組,因為存盤在 keyvault 中的證書需要這種位元組。Azure Key Vault 證書在通過 IKeyVaultClient.GetCertificateAsync 檢索時沒有私鑰
。我想寫一個函式,該函式將接收這些位元組,以及一個主題名稱(用于葉子證書),并將創建一個x509證書(包括公鑰和私鑰),將發行人作為根。
以下是我到目前為止的草圖:
public static X509Certificate2 GenerateCertificateBasedOnIssuer(span class="hljs-built_in">string subjectName, byte[] issuerByteCert)。
{
var issuerCertificate = new X509Certificate2(issuerByteCert) 。
RSA keyProvider = issuerCertificate.GetRSAPrivateKey()。
CertificateRequest certificateRequest = new CertificateRequest($"CN={subjectName}", keyProvider, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1) 。
CryptoApiRandomGenerator randomGenerator = new CryptoApiRandomGenerator()。
SecureRandom random = new SecureRandom(randomGenerator)。
BigInteger serialNumber = BigIntegers.CreateRandomInRange(BigInteger.One, BigInteger.ValueOf(Int64.MaxValue), random) 。
var publicOnlyDeviceCertificate = certificateRequest.Create(issuerCertificate, issuerCertificate.NotBefore, issuerCertificate.NotAfter, serialNumber.ToByteArray() )。)
return publicOnlyDeviceCertificate; // oh no ! :()
}
我在這個解決方案中遇到的問題是,創建的證書只包含一個公共密鑰。
我在 Stack Overflow 的另一個問題上發現了另一個解決方案,似乎可以解決我的問題,該解決方案使用 BouncyCastle 的 X509V3CertificateGenerator。 即時生成自簽名證書
我對這個解決方案的問題是,我無法將我的 rootCA 證書的私鑰轉換成 AsymmetricKeyParameter(X509V3CertificateGenerator.Generate 方法的第一個引數)。我試著用這個方案將發行人的密鑰轉換為AsymmetricKeyParameter。將PEM編碼的RSA公鑰轉換為AsymmetricKeyParameter,但我得到一個無效的操作例外。
我想知道我的路徑是否正確(就理解而言),是否有辦法根據我目前的代碼生成帶有私鑰(和公鑰)的證書。
更新:我已經能夠通過硬編碼將私鑰轉換為AsymmetricKeyParameter,具體方法如下:
string testKey = @"-----BEGIN PRIVATE KEY-----
<THE KEY>
-----end private key-----
"。
var stringReader = new StringReader(testKey);
var pemReader = new PemReader(stringReader)。
var pemObject = pemReader.ReadObject()。
var keyParam = ((AsymmetricKeyParameter)pemObject)。
Azure keyvault以pfx格式存盤證書。我正在考慮將私鑰存盤為一個秘密字串。我現在將繼續使用硬編碼的密鑰進行測驗,直到我找到一個可行的解決方案。
我現在正在用BouncyCastle進行測驗,如果成功的話,我會帶著作業方案回來的!
uj5u.com熱心網友回復:
你傳遞給CertificateRequest的密鑰被用作證書中的公鑰......所以你要傳遞一個新的密鑰,而不是發行者的密鑰。
然后,一旦你現在有了主題密鑰,你就在最后使用 CopyWithPrivateKey 來把它們粘在一起。
public static X509Certificate2 GenerateCertificateBasedOnIssuer(span class="hljs-built_in">string subjectName, byte[] issuerByteCert)。
{
using (var issuerCertificate = new X509Certificate2(issuerByteCert)
using (RSA subjectKey = RSA.Create(2048)
{
CertificateRequest certificateRequest = new CertificateRequest($"CN={subjectName}"/span>, subjectKey, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1) 。
CryptoApiRandomGenerator randomGenerator = new CryptoApiRandomGenerator()。
SecureRandom random = new SecureRandom(randomGenerator)。
BigInteger serialNumber = BigIntegers.CreateRandomInRange(BigInteger.One, BigInteger.ValueOf(Int64.MaxValue), random) 。
var publicOnlyDeviceCertificate = certificateRequest.Create(issuerCertificate, issuerCertificate.NotBefore, issuerCertificate.NotAfter, serialNumber.ToByteArray() )。)
using (publicOnlyDeviceCertificate)
{
return publicOnlyDeviceCertificate.CopyWithPrivateKey(subjectKey)。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/329845.html
標籤:
