Bagaimana cara mengimpor sertifikat SSL yang ditandatangani menggunakan Bouncy Castle di C# (Mono/Xamarin)?

Saya menggunakan Bouncy Castle untuk menghasilkan kunci pribadi, serta CSR PKCS10, yang kemudian saya kirimkan ke server jarak jauh untuk ditandatangani. Saya mendapatkan kembali sertifikat SSL bertanda tangan berkode base64 standar sebagai respons sebagai string. Pertanyaannya adalah, bagaimana cara mengimpor sertifikat yang ditandatangani dari sebuah string, lalu menyimpan kunci pribadi dan sertifikat yang ditandatangani sebagai file PKCS12 (.PFX)?

Selain itu, bagaimana cara saya menggabungkan sertifikat CA untuk disertakan dalam file PFX?

// Generate the private/public keypair
RsaKeyPairGenerator kpgen = new RsaKeyPairGenerator ();
CryptoApiRandomGenerator randomGenerator = new CryptoApiRandomGenerator ();
kpgen.Init (new KeyGenerationParameters (new SecureRandom (randomGenerator), 2048));
AsymmetricCipherKeyPair keyPair = kpgen.GenerateKeyPair ();

// Generate the CSR
X509Name subjectName = new X509Name ("CN=domain.com/name=Name");
Pkcs10CertificationRequest kpGen = new Pkcs10CertificationRequest ("SHA256withRSA", subjectName, keyPair.Public, null, keyPair.Private);
string certCsr = Convert.ToBase64String (kpGen.GetDerEncoded ());

// ** certCsr is now sent to be signed  **
// ** let's assume that we get "certSigned" in response, and also have the CA **
string certSigned = "[standard signed certificate goes here]";
string certCA = "[standard CA certificate goes here]";

// Now how do I import certSigned and certCA
// Finally how do I export everything as a PFX file?

person Stigz    schedule 24.01.2015    source sumber


Jawaban (1)


Bouncy Castle adalah perpustakaan yang sangat kuat, namun kurangnya dokumentasi membuatnya cukup sulit untuk digunakan. Setelah terlalu lama mencari melalui semua kelas dan metode, akhirnya saya menemukan apa yang saya cari. Kode berikut akan mengambil kunci pribadi yang dibuat sebelumnya, menggabungkannya dengan sertifikat yang ditandatangani dan CA, lalu menyimpannya sebagai file .PFX:

// Import the signed certificate
X509Certificate signedX509Cert = new X509CertificateParser ().ReadCertificate (Encoding.UTF8.GetBytes (certSigned));
X509CertificateEntry certEntry = new X509CertificateEntry (signedX509Cert);

// Import the CA certificate
X509Certificate signedX509CaCert = new X509CertificateParser ().ReadCertificate (Encoding.UTF8.GetBytes (certCA ));
X509CertificateEntry certCaEntry = new X509CertificateEntry (signedX509CaCert);

// Prepare the pkcs12 certificate store
Pkcs12Store store = new Pkcs12StoreBuilder ().Build ();

// Bundle together the private key, signed certificate and CA
store.SetKeyEntry (signedX509Cert.SubjectDN.ToString () + "_key", new AsymmetricKeyEntry (keyPair.Private), new X509CertificateEntry[] {
    certEntry,
    certCaEntry
});

// Finally save the bundle as a PFX file
using (var filestream = new FileStream (@"CertBundle.pfx", FileMode.Create, FileAccess.ReadWrite)) {
    store.Save (filestream, "password".ToCharArray (), new SecureRandom ());
}

Masukan dan perbaikan dipersilahkan!

person Stigz    schedule 28.01.2015
comment
Namun apakah Anda perlu memiliki sertifikat CA atau sertifikat perantara untuk melakukan ini? - person Richard Barker; 29.03.2016