Genera certificato autofirmato al volo

Ho cercato in giro ma non ho trovato un chiaro esempio. Voglio creare un certificato autofirmato (auto) certificato a livello di programmazione (c #) , seguendo questo passaggio:

PASSAGGIO1: creare il certificato CA radice al volo e aggiungerlo all’archivio certificati nella cartella “Autorità di certificazione fonti attendibili”

Voglio fare esattamente ciò che fa questo strumento da riga di comando:

makecert.exe -sk RootCA -sky signature -pe -n CN = MY_CA -r -sr LocalMachine -ss Root MyCA.cer

STEP2: creare un certificato basato sul certificato CA radice creato in precedenza e inserirlo nell’archivio certificati, nella cartella “Personale”

Voglio fare esattamente ciò che fa questo strumento da riga di comando:

makecert.exe -sk server -sky exchange -pe -n CN = 127.0.0.1 -ir LocalMachine -is Root -ic MyCA.cer -sr LocalMachine -ss My MyCertificate.cer

Voglio ottenere questo:
inserisci la descrizione dell'immagine qui

L’ho fatto (vedi il codice seguente – STEP1), non so come rendere STEP2, qualsiasi aiuto sarebbe apprezzato. Le macchine target sono Windows XP / Seven. Ho provato sia l’approccio .net puro che la libreria BouncyCastle .

//STEP1 mycerRoot=generateRootCertV1("MY_CA"); //tried also generateRootCertV2(BouncyCastle) addCertToStore(mycerRoot, StoreName.Root, StoreLocation.LocalMachine); //STEP2 mycer=generateCert("127.0.0.1",mycerRoot);//?????? <-- Something like that How to implement generateCert??? addCertToStore(mycer, StoreName.My, StoreLocation.LocalMachine); public static Org.BouncyCastle.X509.X509Certificate generateRootCertV2(string certName) { X509V1CertificateGenerator certGen = new X509V1CertificateGenerator(); X509Name CN = new X509Name("CN=" + certName); RsaKeyPairGenerator keypairgen = new RsaKeyPairGenerator(); keypairgen.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024)); AsymmetricCipherKeyPair keypair = keypairgen.GenerateKeyPair(); certGen.SetSerialNumber(BigInteger.ProbablePrime(120, new Random())); certGen.SetIssuerDN(CN); certGen.SetNotAfter(DateTime.MaxValue); certGen.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7, 0, 0, 0))); certGen.SetSubjectDN(CN); certGen.SetPublicKey(keypair.Public); certGen.SetSignatureAlgorithm("MD5WithRSA"); Org.BouncyCastle.X509.X509Certificate newCert = certGen.Generate(keypair.Private); return newCert; } public static X509Certificate2 GenerateRootCertV1(string HostNameOrIP_or_CertName) { X509Certificate2 cert = null; try { using (CryptContext ctx = new CryptContext()) { ctx.Open(); cert = ctx.CreateSelfSignedCertificate( new SelfSignedCertProperties { IsPrivateKeyExportable = true, KeyBitLength = 4096, Name = new X500DistinguishedName("cn=" + HostNameOrIP_or_CertName), ValidFrom = DateTime.Today.AddDays(-1), ValidTo = DateTime.Today.AddYears(20), }); } } catch (Exception ex) { } return cert; } public static bool addCertToStore(X509Certificate2 cert, StoreName st, StoreLocation sl) { bool bRet = false; try { X509Store store = new X509Store(st, sl); store.Open(OpenFlags.ReadWrite); if (cert != null) { byte[] pfx = cert.Export(X509ContentType.Pfx); cert = new X509Certificate2(pfx, (string)null, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet); if (!certExists(store, cert.SubjectName.Name)) { store.Add(cert); bRet = true; } } store.Close(); } catch { } return bRet; }