Создайте объект RSACryptoServiceProvider, используя файл закрытого ключа RSA в C #
Как я могу правильно создатьRSACryptoServiceProvider
объект, использующий файл закрытого ключа RSA? Я сгенерировал закрытый ключ RSA и экспортировал его в файл p12 в OSX, используя методы:
openssl genrsa -out rsakey.pem 2048
openssl pkcs12 -export -out rsakey.p12 -inkey rsakey.pem -nocerts
В моем коде C #, который работает на ноутбуке с Windows, я получаю сообщение об ошибке, пытаясь создать экземплярX509Certificate2
объект, чтобы я мог получить закрытый ключ какRSACryptoServiceProvider
возразить из этого:
var privateKey = new X509Certificate2(p12_file, "pass", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet).PrivateKey as RSACryptoServiceProvider;
CryptographicException: параметр неверен.
Ниже приведен полный код C # для справки. Обратите внимание, что я просто пытаюсь получить закрытый ключ как объект RSACryptoServiceProvider, следуя документам дляX509Certificate2 учебный класс.
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;
}
}
}
ОБНОВЛЕНИЕ: я попытался создать свой самоподписанный сертификат, используя
openssl req -key rsakey.pem -new -out domain.crt
а затем завернуть его в p12:
openssl pkcs12 -export -out rsakey.p12 -in rsakey.pem -certfile domain.crt
но команда просто висит навсегда, пока я ее не убью.