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();
}
}
}