Comment générer une paire de clés publique et privée X.509 et une demande de signature (fichier CSR) à envoyer à une AC pour la signature en C#?Générer une paire de clés de certificat X.509 et une demande de signature (CSR) en C#
1
A
Répondre
1
Génération d'une paire de clés RSA est facile:
// Generate a 2048 bit RSA keypair
RSA keypair = new RSACryptoServiceProvider(2048);
Malheureusement .NET n'a pas de support pour générer les certificats demandes. Votre meilleur pari est probablement d'interfacer avec le composant COM CEnroll. Vous devriez utiliser le CreatePKCS10 -method.
1
Si vous utilisez la classe IAsn1Node que vous pouvez obtenir à partir Liping Dai's website les méthodes suivantes devraient le faire pour vous:
private static readonly Oid oidInstance = new Oid();
private static void AddSubjectString(IAsn1Node parent, string oid, string value)
{
if (!string.IsNullOrEmpty(value))
{
parent.AddChild(AddString(new Asn1Node
{
Tag = Asn1Tag.SET | Asn1TagClasses.CONSTRUCTED
},
oid, value));
}
}
private static Asn1Node AddString(Asn1Node parent, string name, string value)
{
var childNode = new Asn1Node
{
Tag = Asn1Tag.SEQUENCE | Asn1TagClasses.CONSTRUCTED
};
parent.AddChild(childNode);
var nameNode = new Asn1Node
{
Tag = Asn1Tag.OBJECT_IDENTIFIER,
Data = oidInstance.Encode(name)
};
childNode.AddChild(nameNode);
var valueNode = new Asn1Node();
if (value == null)
{
valueNode.Tag = Asn1Tag.TAG_NULL;
}
else
{
valueNode.Tag = Asn1Tag.PRINTABLE_STRING;
valueNode.Data = Encoding.ASCII.GetBytes(value);
}
childNode.AddChild(valueNode);
return parent;
}
public static void GenerateCsr(RSACryptoServiceProvider keyPair, Certificates.Subject subject, Stream output)
{
var rootNode = new Asn1Node
{
Tag = Asn1Tag.SEQUENCE | Asn1TagClasses.CONSTRUCTED
};
var topSequenceNode = new Asn1Node
{
Tag = Asn1Tag.SEQUENCE | Asn1TagClasses.CONSTRUCTED
};
rootNode.AddChild(topSequenceNode);
var versionNode = new Asn1Node
{
Tag = Asn1Tag.INTEGER,
Data = new byte[] { 0 }
};
topSequenceNode.AddChild(versionNode);
var stringSequenceNode = new Asn1Node
{
Tag = Asn1Tag.SEQUENCE | Asn1TagClasses.CONSTRUCTED
};
topSequenceNode.AddChild(stringSequenceNode);
AddSubjectString(stringSequenceNode, Oid.OID_COMMON_NAME, subject.CommonName);
AddSubjectString(stringSequenceNode, Oid.OID_ORGANIZATIONAL_UNIT, subject.OrganisationalUnit);
AddSubjectString(stringSequenceNode, Oid.OID_LOCALITY_NAME, subject.City);
AddSubjectString(stringSequenceNode, Oid.OID_COUNTRY_NAME, subject.Country);
AddSubjectString(stringSequenceNode, Oid.OID_PROVINCE_NAME, subject.Province);
AddSubjectString(stringSequenceNode, Oid.OID_ORGANIZATION, subject.Organisation);
AddSubjectString(stringSequenceNode, Oid.OID_EMAIL_ADDRESS, subject.EmailAddress);
var rsaNode = new Asn1Node
{
Tag = Asn1Tag.SEQUENCE | Asn1TagClasses.CONSTRUCTED
};
topSequenceNode.AddChild(AddString(rsaNode, Oid.OID_RSA_ENCRYPTION, null));
var publicKeyNode = new Asn1Node
{
Tag = Asn1Tag.BIT_STRING
};
rsaNode.AddChild(publicKeyNode);
var publicKeySequenceNode = new Asn1Node
{
Tag = Asn1Tag.SEQUENCE | Asn1TagClasses.CONSTRUCTED
};
publicKeyNode.AddChild(publicKeySequenceNode);
var publicKeyInfo = keyPair.ExportParameters(false);
publicKeySequenceNode.AddChild(new Asn1Node
{
Tag = Asn1Tag.INTEGER,
Data = publicKeyInfo.Modulus
});
publicKeySequenceNode.AddChild(new Asn1Node
{
Tag = Asn1Tag.INTEGER,
Data = publicKeyInfo.Exponent
});
topSequenceNode.AddChild(new Asn1Node
{
Tag = Asn1TagClasses.CONTEXT_SPECIFIC | Asn1TagClasses.CONSTRUCTED
});
byte[] signature;
using (var data = new MemoryStream(1024))
{
topSequenceNode.SaveData(data);
signature = keyPair.SignData(data.GetBuffer(), 0, (int)data.Length, new SHA1CryptoServiceProvider());
}
AddString(rootNode, Oid.OID_SHA1_WITH_RSA, null);
rootNode.AddChild(new Asn1Node
{
Tag = Asn1Tag.BIT_STRING,
Data = signature
});
var csrOutput = new StreamWriter(output);
csrOutput.WriteLine("-----BEGIN CERTIFICATE REQUEST-----");
using (var data = new MemoryStream(1024))
{
rootNode.SaveData(data);
var base64Data = Convert.ToBase64String(data.GetBuffer(), 0, (int)data.Length,
Base64FormattingOptions.InsertLineBreaks);
csrOutput.WriteLine(base64Data);
}
csrOutput.WriteLine("-----END CERTIFICATE REQUEST-----");
csrOutput.Flush();
}
Merci à Theodor qui sont venus à la rescousse et ont écrit pour nous.
Questions connexes
- 1. En C#, signez un xml avec un certificat x.509 et vérifiez la signature
- 2. Comment puis-je analyser une demande de signature de certificat avec Perl?
- 3. X.509 Signatures numériques imprimées
- 4. Certificat de signature de code
- 5. Powershell Scripting Signature de SSL CSR par CA?
- 6. Inter-convertibilité des conteneurs de clés asymétriques (par exemple: X.509, PGP, OpenSSH)
- 7. Swap paire de clés et la valeur de tableau
- 8. « Impossible de charger l'identité de certificat X.509 spécifié dans la configuration »
- 9. Certificat de signature automatique vers un certificat Authenticode?
- 10. Le serveur rejetant les certificats Biztalk X.509
- 11. asp.net Génération d'une paire de clés publiques RSA sans magasin de clés
- 12. Certificats IIS7 et X.509: connexion d'asp.net à un service Web - où stocker les certificats?
- 13. J'ai P & G-- comment puis-je utiliser l'API Wincrypt pour générer une paire de clés Diffie-Hellman?
- 14. Validation de signature numérique XML
- 15. Certificat numérique personnel gratuit ou ouvert de signature de documents?
- 16. XMLHttpRequest et erreurs de certificat
- 17. Envoi de clés à une application inactive en C#/.NET
- 18. Comment attacher une paire de valeurs clés à un UIView sur iPhone?
- 19. Générer TestCases pour les méthodes en fonction de sa signature à l'aide CodeDom en C#
- 20. problèmes de certificat C#
- 21. Puis-je utiliser un certificat SSL pour cliquer sur une signature de code?
- 22. Comment générer une URL conviviale en C#?
- 23. Génération CSR: Tomcat ou Apache?
- 24. Soumettre une paire de valeur de nom de javascript?
- 25. Générer une énumération aléatoire en C# 2.0
- 26. Comment puis-je générer une signature v2 pour Amazon EC2 en utilisant PHP?
- 27. Énumération des champs de certificat en C#
- 28. Comment générer un certificat SSL? Comment accéder à une page avec un certificat invalide dans FF3?
- 29. Fonction de hachage pour une paire de long long?
- 30. Avons-nous besoin d'installer le certificat de signature de code intermédiaire pour une application XBAP/ClickOnce de confiance totale?