RSACryptoServiceProvider-Objekt mithilfe der privaten RSA-Schlüsseldatei in C # @ erstell

Wie kann ich das @ richtig erstellRSACryptoServiceProvider -Objekt mit einer privaten RSA-Schlüsseldatei? Ich habe einen privaten RSA-Schlüssel generiert und ihn mit den folgenden Methoden in eine p12-Datei unter OSX exportiert:

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 ausgeführt wird, wird beim Versuch, das @ zu instanziieren, eine Fehlermeldung angezeigX509Certificate2 Objekt, so dass ich den privaten Schlüssel als @ greifen kaRSACryptoServiceProvider Objekt raus:

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

CryptographicException: Der Parameter ist falsch.

Below ist der gesamte C # -Code als Referenz. Beachten Sie, dass ich nur versuche, den privaten Schlüssel als RSACryptoServiceProvider-Objekt abzurufen, indem ich den Dokumenten für das @ folg X509Certificate2 Klasse.

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, mein selbstsigniertes Zertifikat mit @ zu erstelle

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

und wickeln Sie es dann in eine p12:

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

Aber der Befehl bleibt für immer hängen, bis ich ihn töte.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage