title: How do I create a PKCS12 .p12 file in C#?
body: <p>this is probably a n00b question, but I don't really have any experience in this area.</p>
  
  <p>I need to create a p12 bundle containing an X509 certificate and the private key.   I currently have two objects, the X509Certificate2, and the RSAParameters object which contains  key information.  How do I combine these into a p12 file?</p>
  
  <p>I just cannot find any information regarding this.</p>
  
  <p>I also have a RSACryptoServiceProvider object that has the parameters from the RSAParameters imported into it if that helps.</p>
  
  <p>Some additional background. I am getting my certificate from a VeriSign Registration Authority we have installed here. This is done by creating a PCKS#10 certificate request. I create my certificate object by reading in a byte array of data the RA puts into a database.</p>
  
  <pre><code>RsaPrivateCrtKeyParameters KeyParams = (RsaPrivateCrtKeyParameters)this.KeyPair.Private;
  RSAParameters rsaParameters = new RSAParameters();
  
  rsaParameters.Modulus = KeyParams.Modulus.ToByteArrayUnsigned();
  rsaParameters.P = KeyParams.P.ToByteArrayUnsigned();
  rsaParameters.Q = KeyParams.Q.ToByteArrayUnsigned();
  rsaParameters.DP = KeyParams.DP.ToByteArrayUnsigned();
  rsaParameters.DQ = KeyParams.DQ.ToByteArrayUnsigned();
  rsaParameters.InverseQ = KeyParams.QInv.ToByteArrayUnsigned();
  rsaParameters.D = KeyParams.Exponent.ToByteArrayUnsigned();
  rsaParameters.Exponent = KeyParams.PublicExponent.ToByteArrayUnsigned();
  
  RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
  rsaKey.ImportParameters(rsaParameters);
  
  this.Certificate.PrivateKey = rsaKey;
  
  byte[] p12 = this.Certificate.Export(X509ContentType.Pkcs12, "password");
  
  File.WriteAllBytes(fileName, p12);
  </code></pre>
  
  <p>PKCS10 generation (using the bouncycastle library)</p>
  
  <pre><code>509Name name = new X509Name(String.Concat(SubjectCommonName, "=", firstName, " ", lastName));
  RsaKeyPairGenerator rkpg = new RsaKeyPairGenerator();
  rkpg.Init(new KeyGenerationParameters(new SecureRandom(), 1024));
  this.KeyPair = rkpg.GenerateKeyPair();
  
  // PKCS #10 Certificate Signing Request
  Pkcs10CertificationRequest csr = new Pkcs10CertificationRequest("SHA1WITHRSA", name, this.KeyPair.Public, null, this.KeyPair.Private);
  byte[] request = Base64.Encode(csr.GetEncoded());
  ASCIIEncoding encoder  = new ASCIIEncoding();
  return encoder.GetString(request);
  </code></pre>
  
  <p>The cert request (minus the http post headers). the public_key parameter is the base64 encoded, pkcs10 formatted CSR. (I've put the line breaks after each parameter just so it's easier to read here, they are not there in the actual http post)</p>
  
  <pre><code>operation=AutoAuthOSUserSubmit&amp;
  form_file=..%2ffdf%2fclient%2fuserEnrollMS.fdf&amp;
  authenticate=NO&amp;
  public_key_format=pkcs10&amp;
  country=NZ&amp;
  mail_firstName=Daniel&amp;
  mail_lastName=Mapletoft&amp;
  mail_email=daniel.mapletoft@nz.firstms.com&amp;
  challenge=1234&amp;
  public_key=MIIBTzCBuwIBADAUMRIwEAYDVQQDDAlTaW1vbiBEb2UwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANZD8M7gjUq1vBWq4w25x3SNhet4T+uCV3ebnAB5ws9f2YQevd9QeSfoPWw/pyJ/mJRDZDLjYzG63VQUzrXyBx3PZhmWqWaDECAYSssOYTfTMWPns0sRsyg1f35f4mh0ZXieiPYdv8r9CVjG9woa15LA1cYI0b93alM/z+OoMLxNAgMBAAEwCwYJKoZIhvcNAQEFA4GBAIB9buu5sycjdAgyV+UMAlzYKlENrQmI2/36ZZ4q3sx5bIyLm9tOEexbNzkk86kcGQhL2w/0oA5UpUCUU4IIf9u+lhpMoUlbHKH4tosswMwVEiFpfIWrL4M9X7+TW4Lj1aGf2T+xgKhWeo+cBSGexxvHo27OaH9d1NVDozEJ6c7i
  </code></pre>
  
  <p>This is the output from Certificate.GetRawCertDataString()</p>
  
  <pre><code>3082036F30820257A003020102021034914BB0AF5A48704B56C89DE8B1BBFD300D06092A864886F70D0101050500304D310B3009060355040613024E5A31283026060355040A131F4669727374204D6F727467616765205365727669636573204C696D69746564311430120603550403130B464D5320526F6F74204341301E170D3130303132313030303030305A170D3131303132313233353935395A305B31243022060355040A141B4669727374204D6F727467616765205365727669636573204C7464311F301D060355040B1416466F72205465737420507572706F736573204F6E6C79311230100603550403140953696D6F6E20446F6530819F300D06092A864886F70D010101050003818D0030818902818100D643F0CEE08D4AB5BC15AAE30DB9C7748D85EB784FEB8257779B9C0079C2CF5FD9841EBDDF507927E83D6C3FA7227F9894436432E36331BADD5414CEB5F2071DCF661996A966831020184ACB0E6137D33163E7B34B11B328357F7E5FE2687465789E88F61DBFCAFD0958C6F70A1AD792C0D5C608D1BF776A533FCFE3A830BC4D0203010001A381C03081BD30090603551D1304023000300E0603551D0F0101FF0404030205A030600603551D1F0101FF045630543052A050A04E864C687474703A2F2F6F6E7369746563726C2E766572697369676E2E636F6D2F46697273744D6F72746761676553657276696365734C746450726F70656C6C632F4C617465737443524C2E63726C301F0603551D230418301680148B2A2C583903B2619F16E73D3DF1704DB1F3D4E2301D0603551D0E0416041411A6D5EBC14D7C226502EC340F70237D23431D0B300D06092A864886F70D010105050003820101008EFD93EF777F2D196FC8633C5A8347CA886320E59AF8AF8D3AA901AEF0ADF75EDD2D3C4495CF70F1E4516AA224F3731B6EE66DCB332FD88C03255DA9D12202DD3DF619EE55443F53773FD03C808B5B66AEEB39A3E20B866DC22D92010785A2729C269E35ED6B2036014628850B8E8A40A501F3C7EECA49A4B7E957B496ECD8A27702D7230C40580F94C69E83A0AEFD9347625B529E3ACDD2A5FEB7B946BEE9BE9DA9AA52E14AEC790C66E8A670AA1D53518DEFB66FE6BC33A57BB6A59C75C6DFADE5E961A9A03C3FFDC559FC9ADD565D345975B99BEF5F973D331E60A3FEFEF713C6C630D80222AD9541BC12F1E92379EF5CBECE81CA5E327FD32FDC28AB52D7
  </code></pre>
  
  <p>this is the contents of array from 
      byte[] array1 = certKey.ExportCspBlob(false);</p>
  
  <pre><code>6,2,0,0,0,164,0,0,82,83,65,49,0,4,0,0,1,0,1,0,77,188,48,168,227,207,63,83,106,119,191,209,8,198,213,192,146,215,26,10,247,198,88,9,253,202,191,29,246,136,158,120,101,116,104,226,95,126,127,53,40,179,17,75,179,231,99,49,211,55,97,14,203,74,24,32,16,131,102,169,150,25,102,207,29,7,242,181,206,20,84,221,186,49,99,227,50,100,67,148,152,127,34,167,63,108,61,232,39,121,80,223,189,30,132,217,95,207,194,121,0,156,155,119,87,130,235,79,120,235,133,141,116,199,185,13,227,170,21,188,181,74,141,224,206,240,67,214
  </code></pre>
  
  <p>this is the contents of the array from
      byte[] array2 = rsaKey.ExportCspBlob(false);</p>
  
  <pre><code>6,2,0,0,0,164,0,0,82,83,65,49,0,4,0,0,1,0,1,0,77,188,48,168,227,207,63,83,106,119,191,209,8,198,213,192,146,215,26,10,247,198,88,9,253,202,191,29,246,136,158,120,101,116,104,226,95,126,127,53,40,179,17,75,179,231,99,49,211,55,97,14,203,74,24,32,16,131,102,169,150,25,102,207,29,7,242,181,206,20,84,221,186,49,99,227,50,100,67,148,152,127,34,167,63,108,61,232,39,121,80,223,189,30,132,217,95,207,194,121,0,156,155,119,87,130,235,79,120,235,133,141,116,199,185,13,227,170,21,188,181,74,141,224,206,240,67,214
  </code></pre>