public class CA { public static void Issue(string subject, X509Certificate2 signingCert) { X509CertificateParser pas = new X509CertificateParser(); X509Certificate bouncySigningCert = pas.ReadCertificate(signingCert.GetRawCertData()); AsymmetricKeyParameter signingPrivateKey; // ding if (signingCert.HasPrivateKey && signingCert.PrivateKey is RSA) { RSAParameters signingParams = ((RSACryptoServiceProvider)signingCert.PrivateKey).ExportParameters(true); RSAParameters publicSigningParams = ((RSACryptoServiceProvider) signingCert.PublicKey.Key).ExportParameters(false); signingPrivateKey = new Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters( new BigInteger(1, signingParams.Modulus), new BigInteger(1, publicSigningParams.Exponent), new BigInteger(1, signingParams.Exponent), new BigInteger(1, signingParams.P), new BigInteger(1, signingParams.Q), new BigInteger(1, signingParams.DP), new BigInteger(1, signingParams.DQ), new BigInteger(1, signingParams.InverseQ)); } else throw new Exception("boom!"); RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); RSAParameters param = rsa.ExportParameters(true); //RsaKeyParameters privateKey = new RsaKeyParameters(true, new BigInteger(1, param.Modulus), new BigInteger(1, param.Exponent)); RsaKeyParameters publicKey = new RsaKeyParameters(false, new BigInteger(1, param.Modulus), new BigInteger(1, param.Exponent)); X509V3CertificateGenerator gen = new X509V3CertificateGenerator(); X509Name email = new X509Name("CN=" + subject); gen.SetSubjectDN(email); X509Name issuer = new X509Name(signingCert.Subject); gen.SetIssuerDN(issuer); gen.SetNotBefore(DateTime.Now.AddYears(-1)); gen.SetNotAfter(DateTime.Now.AddYears(1)); gen.SetSerialNumber(new BigInteger(128, new Random())); gen.SetPublicKey(publicKey); gen.SetSignatureAlgorithm("MD5withRSA"); //RSAParameters signingCertPublicParams = ((RSA)signingCert.PublicKey.Key).ExportParameters(false); //RsaKeyParameters signingCertPublicKey = // new RsaKeyParameters(false, new BigInteger(1, signingCertPublicParams.Modulus), // new BigInteger(1, signingCertPublicParams.Exponent)); gen.AddExtension(X509Extensions.AuthorityKeyIdentifier, false, new AuthorityKeyIdentifierStructure(bouncySigningCert)); X509Certificate cert = gen.Generate(signingPrivateKey); X509Certificate2 l = new X509Certificate2(cert.GetEncoded()); l.PrivateKey = rsa; byte[] pkcs12File = l.Export(X509ContentType.Cert); using (FileStream stream = new FileStream("c:\\Certificate.cer", FileMode.Create)) { stream.Write(pkcs12File, 0, pkcs12File.Length); stream.Flush(); } } }