Мне нужна помощь для создания pfx-файла PKCS12 с надувным замком.
Я использую следующие команды для генерации pfx-файла PKCS12:
keytool -genkey -storetype PKCS12 -dname "CN=%CN, OU=%OU, O=Company, L=City, ST=State, C=US" -alias clientcert -keyalg RSA -keysize 2048 -keystore %keystore_name% -storepass %default_keystore_pwd% -keypass %default_keystore_pwd%
Импорт ca.crt от имени root:
keytool -import -trustcacerts -noprompt -alias root -file ca.crt -keystore %keystore_name% -storepass %default_keystore_pwd%
ca.crt - корневой сертификат, используемый для подписи сгенерированного CSR
keytool -certreq -alias clientcert -keystore %keystore_name% -file clientcert.csr -keypass %default_keystore_pwd% -storepass %default_keystore_pwd%
В этот момент я получаю CSR, который я подписываю на выделенном сервере с ca.crt
Затем я импортирую подписанный сертификат в pfx:
keytool -import -alias clientcert -file signed.crt -keystore %keystore_name% -storepass %default_keystore_pwd% -keypass %default_keystore_pwd%
Используя библиотеку bouncycastle, я создаю CSR и закрытый ключ. Затем я подписываю CSR на сервере с помощью ca.crt.
В последней папке 3 файла:
- ca.crt
- signature.crt - сертификат, подписанный ca.crt
- private_key.key (не зашифрованный ключ RSA)
С командами, которые я предоставил ранее, конечный файл pfx, при извлечении выглядит так:
keytool -list -rfc -keystore client_keystore.pfx
Enter keystore password:
Keystore type: jks
Keystore provider: SUN
Your keystore contains 2 entries
Alias name: clientcert
Creation date: Mar 22, 2019
Entry type: PrivateKeyEntry
Certificate chain length: 2
Certificate[1]:
-----BEGIN CERTIFICATE-----
//removed
-----END CERTIFICATE-----
Certificate[2]:
-----BEGIN CERTIFICATE-----
//removed
-----END CERTIFICATE-----
*******************************************
*******************************************
Alias name: root
Creation date: Apr 3, 2019
Entry type: trustedCertEntry
-----BEGIN CERTIFICATE-----
//removed
-----END CERTIFICATE-----
*******************************************
*******************************************
Я уже подписал ca.crt, certificate.crt и private.key.
Как я могу создать файл pfx такой же структуры, используя библиотеку bouncycastle?
Генерация CSR и ключа:
public void TDE(string CName, string OUnit, string Country, string State, string City, string EmailAdr, string password)
{
AsymmetricCipherKeyPair pair;
Pkcs10CertificationRequest csr;
Asn1SignatureFactory signatureFactory;
var random = new SecureRandom(new CryptoApiRandomGenerator());
var values = new Dictionary<DerObjectIdentifier, string>
{
{X509Name.CN, CName},
{X509Name.OU, OUnit},
{X509Name.O, "Company"},
{X509Name.L, City},
{X509Name.ST, State},
{X509Name.C, Country},
{X509Name.EmailAddress, EmailAdr },
};
var extensions = new Dictionary<DerObjectIdentifier, X509Extension>()
{
{X509Extensions.BasicConstraints, new X509Extension(true, new DerOctetString(new BasicConstraints(false)))},
{X509Extensions.KeyUsage, new X509Extension(true, new DerOctetString(new KeyUsage(KeyUsage.DigitalSignature | KeyUsage.KeyEncipherment | KeyUsage.DataEncipherment | KeyUsage.NonRepudiation)))},
{X509Extensions.ExtendedKeyUsage, new X509Extension(false, new DerOctetString(new ExtendedKeyUsage(KeyPurposeID.IdKPServerAuth, KeyPurposeID.IdKPClientAuth)))},
};
var subject = new X509Name(values.Keys.Reverse().ToList(), values);
var gen = new RsaKeyPairGenerator();
gen.Init(new KeyGenerationParameters(random, 2048));
pair = gen.GenerateKeyPair();
signatureFactory = new Asn1SignatureFactory("SHA256withRSA", pair.Private);
extensions.Add(X509Extensions.SubjectKeyIdentifier, new X509Extension(false, new DerOctetString(new SubjectKeyIdentifierStructure(pair.Public))));
csr = new Pkcs10CertificationRequest(signatureFactory, subject, pair.Public, new DerSet(new AttributePkcs(PkcsObjectIdentifiers.Pkcs9AtExtensionRequest, new DerSet(new X509Extensions(extensions)))), pair.Private);
//Convert BouncyCastle csr to .PEM file.
var csrPem = new StringBuilder();
var csrPemWriter = new PemWriter(new StringWriter(csrPem));
csrPemWriter.WriteObject(csr);
csrPemWriter.Writer.Flush();
//Writes password to file
Directory.CreateDirectory(Environment.CurrentDirectory + "\\" + CName + "_" + OUnit);
File.AppendAllText(Environment.CurrentDirectory + "\\" + CName + "_" + OUnit + "\\key_password.txt", password);
//writes CSR to file
File.AppendAllText(Environment.CurrentDirectory + "\\" + CName + "_" + OUnit + "\\" + CName + "_csr", csrPem.ToString());
//Convert BouncyCastle Private Key to .PEM file.
var privateKeyPem = new StringBuilder();
var privateKeyPemWriter = new PemWriter(new StringWriter(privateKeyPem));
privateKeyPemWriter.WriteObject(pair.Private);
privateKeyPemWriter.Writer.Flush();
//privateKeyPem.ToString();
File.AppendAllText(Environment.CurrentDirectory + "\\" + CName + "_" + OUnit + "\\" + CName + "_" + OUnit + "_prvNE.key", privateKeyPem.ToString());
}
Спасибо