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:
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
Vous devez vous connecter pour publier un commentaire.
J'ai édité la réponse à faire les cert d'abord, puis délivrer un certificat d'entité finale.
Voici quelques exemple de génération d'auto signer le certificat par plein d'entrain:
et ajouter à stocker (votre code légèrement modifié):
et utilisation:
Je n'ai pas compilé cet exemple de code après @wakeupneo commentaires. @wakeupneo vous pouvez légèrement modifier le code et ajouter bon extensions à chaque certificat.
addCertToStore(cert, StoreName.Root, StoreLocation.CurrentUser);
. Ensuite, il sera de confiance. Pas besoin de créer une autorité de certification pour émettre certificat d'entité finale. De quoi est-il question de générer un CA par programmation si vous n'avez qu'à chaque exécution du programme.X509Certificate2 x509 = new X509Certificate2(certificate.GetEncoded(), (string)null, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
au lieu devar x509 = new System.Security.Cryptography.X509Certificates.X509Certificate2(certificate.GetEncoded());
Mais ne fonctionne pas pour moi sur le framework 4.0.var exported = MyCert.Export(X509ContentType.Pfx, "123");
et puis créer une nouvelle instance de certificat d'exportation commevar cert = new X509Certificate2(exported, "123", X509KeyStorageFlags.MachineKeySet);
. Ajoutez ensuite les conserver:addCertToStore(cert, StoreName.My, StoreLocation.LocalMachine);
. Il a travaillé pour moi. J'ai essayé beaucoup d'autres choses et s'est terminé par jeu de clés n'existe pas exception.SetSignatureAlgorithm(string)
,Generate(AssymmetricKeyParameter)
, etGenerate(AsymmetricKeyParameter, SecureRandom)
sont déconseillés dans les versions ultérieures de la bibliothèque. Pour éviter cela, utilisezGenerate(ISignatureFactory)
comme decibed ici: stackoverflow.com/questions/36942094/...Generate(ISignatureFactory)
.Ok, merci pour l'aide, ici c'est le code de travail:
Après l'intégration de changements à partir de plusieurs postes, j'ai finalement obtenu ce code fonctionne!. J'espère que cela permettra d'économiser beaucoup de temps!!!
Nous utilisons le code suivant lors de nos tests
(a) Nuget dépendance: Château Gonflable 1.7.0
(b), Générateur d'auto-signé, intermédiaires et de certificats d'autorité de certification:
(c) Exemple d'utilisation:
Donc après un long moment je peaufine ma réponse.
Ma mission initiale était de créer un certitificate à la volée pour un service WCF.
Mon windows pour l'application de service d'un service WCF et je veux créer le canal au moment de l'exécution avec la création du cert si il n'est pas présent sur la machine locale.
Tous le code ci-dessus est la bonne façon de le faire, mais il y a une pièce manquante.
Vous devez créer un certificat avec un intégré à s'exporter la clé privée.
Voir ce lien
C'est l'accent mis sur la partie critique de l'extrait de code pour générer la clé privée:
Si vous ne le faites pas, lorsque vous exécutez la commande netsh vous obtenez le message d'erreur 1312.
c'est à dire de la commande netsh:
netsh http ajoutez sslcert ipport=192.168.0.15:8081 certhash=5424476237fc2785ed2d0fd620a9131d7c999f6f appid={02639d71-0935-35e8-9d1b-9dd1a2a34627}