Générer un certificat auto-signé à la volée

J'ai cherché partout, mais je n'ai pas trouver un clair exemple.
Je souhaite créer une auto-signé (auto-)certificat approuvé par programmation (C#), en suivant ces étapes:

ÉTAPE 1:

Créer une autorité de certification racine à la volée et l'ajouter dans le magasin de certificats dans le dossier "Autorités de certification Racine approuvées"

Je veux faire exactement ce que cet outil de ligne de commande n':

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

ÉTAPE 2:

Créer un certificat basé sur le certificat CA racine et de le mettre dans le magasin de certificats, dans le dossier "Personnel"

Je veux faire exactement ce que cet outil de ligne de commande n':

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

Je veux obtenir ceci:

Générer un certificat auto-signé à la volée

Je l'ai fait (voir le code ci - ÉTAPE 1). Comment puis-je faire l'ÉTAPE 2? Cible machines Windows XP/7.

J'ai essayé à la fois un pur .NET approche et BouncyCastle bibliothèque.

//STEP 1
mycerRoot = generateRootCertV1("MY_CA"); //Tried also generateRootCertV2(BouncyCastle)
addCertToStore(mycerRoot, StoreName.Root, StoreLocation.LocalMachine);
//STEP 2
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;
}
  • Peut-être que cela peut vous aider: stackoverflow.com/questions/3736568/...
  • Merci, déjà visiter ce lien, mais...pourrais-tu donner un exemple? Je ne veux pas créer une "auto-signé non fiables cert". Je veux créer une autorité de certification racine cert d'abord, puis je veux créer un certificat basé sur le le premier
  • voir l'image(je veux obtenir): i57.tinypic.com/2akfayg.png
InformationsquelleAutor wakeupneo | 2014-03-06