在 C# 中使用 RSA 私钥文件创建 RSACryptoServiceProvider 对象
Create RSACryptoServiceProvider object using RSA private key file in C#
如何使用 RSA 私钥文件正确创建 RSACryptoServiceProvider
对象?我生成了一个 RSA 私钥并使用以下方法将其导出到 OSX 上的 p12 文件:
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: The parameter is incorrect.
下面是完整的C#代码供参考。请注意,我只是试图按照 X509Certificate2 class.
的文档将私钥作为 RSACryptoServiceProvider 对象获取
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
但命令会永远挂起,直到我将其终止。
由于您的 P12 文件不包含 X509 证书,因此 X509Certificate2 不会将该文件解释为正确的输入。
.NET 没有用于读取与证书无关的私钥(或 public 密钥)的内置功能。
最简单的解决方法是将新的 RSA 密钥封装在自签名证书中,然后将证书和私钥都放入 .p12 文件中。
替代方案是手动解析私钥 file/blob 并构建 RSAParameters 结构;或使用可以为您完成此操作的第 3 方库。
如何使用 RSA 私钥文件正确创建 RSACryptoServiceProvider
对象?我生成了一个 RSA 私钥并使用以下方法将其导出到 OSX 上的 p12 文件:
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: The parameter is incorrect.
下面是完整的C#代码供参考。请注意,我只是试图按照 X509Certificate2 class.
的文档将私钥作为 RSACryptoServiceProvider 对象获取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
但命令会永远挂起,直到我将其终止。
由于您的 P12 文件不包含 X509 证书,因此 X509Certificate2 不会将该文件解释为正确的输入。
.NET 没有用于读取与证书无关的私钥(或 public 密钥)的内置功能。
最简单的解决方法是将新的 RSA 密钥封装在自签名证书中,然后将证书和私钥都放入 .p12 文件中。
替代方案是手动解析私钥 file/blob 并构建 RSAParameters 结构;或使用可以为您完成此操作的第 3 方库。