2017-04-18 4 views
1

Ich versuche, eine selbstsignierte RSA-2048-SHA-256-Zertifikat-PFX-Datei zu erstellen, um es für die Datensignierung in meinen WCF-Anfragen zu verwenden.Erzeuge selbstsignierte RSA-2048-SHA-256-Zertifikat-PFX-Datei mit openSSL

Ich habe einige openSSL-Beispiele verwendet, um eine Zertifikat-PFX-Datei zu erstellen, aber obwohl ich den SHA-Algorithmus auf 256 setze, sehe ich, dass der private Schlüssel dieses Zertifikats diese Einstellungen hat :

KeyExchangeAlgorithm = RSA-PKCS1-KeyEx 

SignatureAlgorithm = http://www.w3.org/2000/09/xmldsig#rsa-sha1 

und wenn ich den Code unten verwenden, um dieses Zertifikat zu konsumieren, I „Invalid Algorithmus angegeben Ausnahme“ bin immer, aber wenn ich die SHA256CryptoServiceProvider ändern fein alles funktioniert SHA1CryptoServiceProvider.

string msg = "This is my test message"; 

X509Certificate2 privateCert = new X509Certificate2("C:\\TEMP\\private.pfx", "12345"); 

byte[] signature = (privateCert.PrivateKey as RSACryptoServiceProvider).SignData(new UTF8Encoding().GetBytes(msg), new SHA256CryptoServiceProvider()); 

Ich kann nur annehmen, dass meine Zertifikatsdatei nicht mit SHA256 erstellt wurde, sondern mit irgendeiner Art von Standard-SHA1-Algorithmus.

Das sind die Schritte, die ich verwendet, um mein Zertifikat zu erstellen:

  1. openssl req -x509 -days 365 -newkey rsa:2048 -sha256 -keyout key.pem -out cert.pem
  2. openssl pkcs12 -export -in cert.pem -inkey key.pem -out private.pfx

Was mache ich falsch?

+0

Was, warum Sie nicht schaffen können neue SHA-256-basierte Signaturen mit dem Schlüssel, fügen Sie entweder '-CSP„Microsoft Verbesserte RSA und AES Cryptographic Provider“' zum pkcs12 Befehl oder den privaten Schlüssel erhalten von 'cert.GetRSAPrivateKey()'. Aber das ist wirklich eine andere Frage. – bartonjs

+0

Vielen Dank für Ihren Kommentar, ich verwendet -CSP "Microsoft Enhanced RSA und AES Cryptographic Provider" in meinem pkcs12 Befehl, und jetzt funktioniert es, ich habe es tatsächlich versucht Nähern Sie sich vorher, aber aus irgendeinem Grund ist der Befehl pkcs12 fehlgeschlagen. Ich habe auch versucht, cert.GetRSAPrivateKey() zu verwenden, und das funktionierte auch, obwohl es .NET Framework 4.6 erfordert. – Alex

Antwort

1

Was mache ich falsch?

Glauben, dass diese beiden Eigenschaften Bedeutung haben :).

Die zwei Werte, die Sie sehen, sind hard-coded into RSACryptoServiceProvider. Andere RSA-Typen (wie RSACng) haben different, less confusing, hard-coded values.

Das Problem ist, dass ein Schlüssel keines dieser Attribute hat. Ein Schlüssel kann für mehrere Zwecke verwendet werden (obwohl das NIST dagegen empfiehlt). Eine TLS-Sitzung (oder ein EnvelopedCMS-Dokument usw.) kann einen Schlüsselaustauschalgorithmus haben. Ein Zertifikat, ein SignedCMS-Dokument oder ein anderes solches Material kann eine Signatur (und somit einen Signaturalgorithmus) aufweisen.

Um zu wissen, dass Ihr Zertifikat mit RSA-PKCS1-SHA256 signiert wurde, müssen Sie sich X509Certificate2.SignatureAlgorithm ansehen.

switch (cert.SignatureAlgorithm.Value) 
{ 
    case "1.2.840.113549.1.1.4": 
     return "RSA-PKCS1-MD5"; 
    case "1.2.840.113549.1.1.5"; 
     return "RSA-PKCS1-SHA1"; 
    case "1.2.840.113549.1.1.11"; 
     return "RSA-PKCS1-SHA2-256"; // Winner 
    case "1.2.840.113549.1.1.12": 
     return "RSA-PKCS1-SHA2-384"; 
    case "1.2.840.113549.1.1.13": 
     return "RSA-PKCS1-SHA2-512"; 
    default: 
     throw new SomethingFromTheFutureOrMaybeNotRSAException(); 
} 
+0

Vielen Dank für Ihre Antwort, ich überprüfte mein Zertifikat mit dem cert.SignatureAlgorithm valie, und tatsächlich, wie Sie gesagt haben, war es eigentlich RSA-PKCS1-SHA2-256 :). – Alex

Verwandte Themen