2016-08-09 3 views
0

Wie kann ich das Objekt RSACryptoServiceProvider mithilfe einer privaten RSA-Schlüsseldatei ordnungsgemäß erstellen? I erzeugt einen privaten RSA-Schlüssel und exportiert sie in eine p12-Datei auf OSX die Methoden verwenden:Erstellen Sie das RSACryptoServiceProvider-Objekt mithilfe der privaten RSA-Schlüsseldatei in C#

openssl genrsa -out rsakey.pem 2048 
openssl pkcs12 -export -out rsakey.p12 -inkey rsakey.pem -nocerts 

In meinem C# -Code, der auf einem Windows-Laptop läuft, erhalte ich einen Fehler versuchen, so das X509Certificate2 Objekt zu instanziiert dass ich den privaten Schlüssel als RSACryptoServiceProvider Objekt aus ihm heraus greifen:

var privateKey = new X509Certificate2(p12_file, "pass", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet).PrivateKey as RSACryptoServiceProvider; 

Cryptographic: der Parameter ist falsch.

Unten ist der gesamte C# -Code als Referenz. Beachten Sie, dass ich gerade versuche, den privaten Schlüssel als RSACryptoServiceProvider-Objekt abzurufen, indem ich die Dokumente für die Klasse befolge.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using System.Net; 
using System.Security; 
using System.Security.Cryptography; 
using System.Security.Cryptography.X509Certificates; 
using System.Globalization; 
using Jose; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string p12_file = @"C:\Root\rsakey.p12"; 

      DateTime issued = DateTime.Now; 
      DateTime expire = DateTime.Now.AddHours(10); 

      var payload = new Dictionary<string, object>() 
      { 
       { "iss", "auth0_user"}, 
       { "exp", ToUnixTime(expire).ToString() } 
      }; 

      var privateKey = new X509Certificate2(p12_file, "pass", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet).PrivateKey as RSACryptoServiceProvider; 

      string token = Jose.JWT.Encode(payload, privateKey, JwsAlgorithm.RS256); 

      Console.WriteLine(token); 

     } 

     static long ToUnixTime(DateTime dateTime) 
     { 
      return (int)(dateTime.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds; 
     } 

    } 
} 

UPDATE: Ich habe versucht, meine selbst signiertes Zertifikat

openssl req -key rsakey.pem -new -out domain.crt 

mit zu erstellen und sie dann in eine p12 Verpackung:

openssl pkcs12 -export -out rsakey.p12 -in rsakey.pem -certfile domain.crt 

aber der Befehl hängt nur ewig, bis ich töten es.

Antwort

0

.NET verfügt über keine integrierte Funktionalität zum Lesen von privaten Schlüsseln (oder öffentlichen Schlüsseln), die nicht mit Zertifikaten verknüpft sind.

Am einfachsten ist es, den neuen RSA-Schlüssel in ein selbstsigniertes Zertifikat zu integrieren und dann das Zertifikat und den privaten Schlüssel in die .p12-Datei zu schreiben.

Die Alternativen bestehen darin, die private Schlüsseldatei/Blob manuell zu analysieren und eine RSAParameters-Struktur zu erstellen; oder um eine 3rd-Party-Bibliothek zu verwenden, die das für Sie tun kann.

+0

Vielen Dank für Ihren Rat. Wie erreiche ich eine dieser Optionen? Ich bin damit nicht vertraut. – FullStack

+1

Selbstparsing würde beinhalten, die passenden RFCs zu finden, um die Datenstrukturen zu finden, und anschließend DER dekodieren. Eine 3rd-Party-Bibliothek ist eine ziemlich weite offene Fläche. Aber die einfachste Lösung ist 'openssl req -new -x509 -key rsakey.pem -out selfsigned.cer' (und akzeptiere einfach alle Standardwerte, wenn du dazu aufgefordert wirst). (und ersetzen Sie "-nocerts" durch "-in selfsigned.cer" in Ihrer .p12-Erstellung). Rufen Sie dann 'GetRSAPrivateKey()' oder 'GetRSAPublicKey()' auf dem Zertifikat auf. – bartonjs

+0

Ich habe verschiedene Varianten ausprobiert, aber das funktioniert schließlich. Vielen Dank – FullStack

0

Da Ihre P12-Datei kein X509-Zertifikat enthält, interpretiert X509Certificate2 die Datei nicht als die richtige Eingabe.

+0

Ich möchte nur den privaten Schlüssel als 'RSACryptoServiceProvider' Objekt. Wie kann ich das erreichen? – FullStack

Verwandte Themen