Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 如何从.Net Core中包含私钥/公钥的PEM文件导入PKCS1密钥_Security_.net Core_Openssl_Rsa_Pem - Fatal编程技术网

Security 如何从.Net Core中包含私钥/公钥的PEM文件导入PKCS1密钥

Security 如何从.Net Core中包含私钥/公钥的PEM文件导入PKCS1密钥,security,.net-core,openssl,rsa,pem,Security,.net Core,Openssl,Rsa,Pem,我正在尝试使用.NETCore从PEM文件加载私钥和公钥。 我的代码如下所示: var localPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); var path = Path.Combine(localPath, this._configManager.JwtPem); var rsaCryptoServiceProvider = new RSACryptoSer

我正在尝试使用.NETCore从PEM文件加载私钥和公钥。 我的代码如下所示:

var localPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
var path = Path.Combine(localPath, this._configManager.JwtPem);
var rsaCryptoServiceProvider = new RSACryptoServiceProvider();

var linesList = File.ReadAllLines(path).ToList();
var line = string.Concat(linesList.GetRange(1, linesList.Count - 2));

rsaCryptoServiceProvider.ImportCspBlob(Convert.FromBase64String(line));
我得到的例外是:

Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException : Bad Version of provider
   at Internal.NativeCrypto.CapiHelper.ImportKeyBlob(SafeProvHandle saveProvHandle, CspProviderFlags flags, Boolean addNoSaltFlag, Byte[] keyBlob, SafeKeyHandle& safeKeyHandle)
   at System.Security.Cryptography.RSACryptoServiceProvider.ImportCspBlob(Byte[] keyBlob)
   at StepNexusCA.ServiceLayer.Authorization.TokenService.GenerateToken(List`1 claims)
包含my development私钥/公钥PKCS1格式的PEM文件如下:

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAwgs8kmIwk+4geRO7dGZjzYpgD2OiaUrnOOIk+ObXt/CcjhwX
lSst+jBmfMF1Wp/mF4aUQsePxN59MYV2BsqPLEkzVdq/fb/7V2wbZcooJAQKkJwT
emtYHrBN00KBBeu9uQZlFOw365ij4GrbP7mcr4tNFZ3TPnRFUUFqhvB6mEG1aZsb
lOn1lgL34tAycQHNxttXz/aGfPyTefQ+yISvSY2n8288OVlyfu6wKDONQYS+/stC
tCV+a+/dDUSUjaZsXM1+BMSflsINqIcCTCMvPa6fb5Z+USfPDcDNwzUyX20LBzH5
wFwPLIvuoqJeeczcaHaT+dS2ZZREj6kgUsdC+QIBAwKCAQEAgVzTDEF1t/QVpg0n
ou7tM7GVX5fBm4dE0JbDUJnlJUsTCWgPuMdz/CBEUyujkb/uulm4LIUKgz7+IQOk
BIcKHYYiOTx/qSqnj51nmTFwGAKxtb1iUZzlacrejNcArp0pJgRDY0glR7sX6vHn
f9ETH7IzY76M1E2Di4Dxr0r8ZX/3ozsrSXp+GMJLeN9sCjKSyxoE5Y71eDBTCX2N
tShJJjhqUDz61bhKlX9j5c3jWvTXx46dE8wjoJ/BW1XJo5J1gzHQ/OLYeOXIdxlj
jVSlEuU69UT588B7UEEK9N9xK5K/c0Yw5gd02RUv/o7qdpYQICeGtQMMaFkm75xy
nUOxwwKBgQD/orUvgNJfFKyvGY8XJTuek5q8IcFD8AFO3b7pNnPynw8llyEpACAv
Onf9aJSPZvtrabSqrpO8k8Ijyhe2Ino39GuRV8RURl46GmFN31RoYV1wHI4K7Emh
68cdKbCEBudog+kImImldBAfo+QmBtqhS+u4B5qQwwnFa8DriQoiYwKBgQDCUg0r
Jd/ZXDLXk/H5PHpTApmUVd7SWLLIDfkBAlRO8Sni4/Ka+KTTZDec5uoo0hoP6cCs
Z9+MZz4XOiwv9dCEI5czMawGmwsm23+fGM/PP/lW4yD8dz10KZggKjWElymDVl+n
zsc6ctwHAOfYwREi7E+R4rWTBgTEvH2I3deV8wKBgQCqbHjKVeGUuHMfZl9kw30U
YmcoFoDX9VY0k9SbeaKhv19uZMDGABV00aVTmw2071JHm83HHw0oYoFtMWUkFvwl
TZ0Lj9g4Lul8EZYz6jhFlj5KvbQHSDEWnS9oxnWtWe+bAptbEFvDorVqbULEBJHA
3UfQBRG111vY8oCdBgbBlwKBgQCBjAjHbpU7ksyPt/amKFGMrGZi4+nhkHcwCVCr
VuLfS3FB7UxnUG3iQs+970bF4Wa1RoBy7+pdmilk0XLKo+BYF7oiIR1ZvLIZ56pq
EIqKKqY57MCoT35NcRAVcXkDD3ECOZUaidom9z1aAJqQgLYXSDUL7HkMrq3YfakF
6Tpj9wKBgEPCSW7EMFjK2NzmB+4b+skxXcfCZ0ldNtwoUDijuAMFg8ueC3j2qFUX
bAXSApi3mQMow1/JwQxiZ+b+GDLdTcE/PrBVBRkL/5RkmnVagbjBrdZhVjpC+dUo
eEkCChClGGpRyPJ+DYYRyX1Fk9Und8Xbd49Vv+/6RL76ys3gGQl8
-----END RSA PRIVATE KEY-----

为什么我不能使用importSCPBlob(…)导入密钥?我没有在网上找到很多关于异常的信息,但是我的代码哪里错了?我知道BouncyCastle,但我正在尝试使用.Net Core以本机方式执行此操作。

ImportCspBlob的格式是ExportCspBlob中的格式,这是所需的PRIVATEKEY blob格式。由于.NET只是将其透明地传递给Windows CAPI,ImportSCPBLOB方法在非Windows平台上抛出

我在过去为导入私钥(包括PKCS#1 RSAPrivateKey)给出的另一个答案是一个元答案,其中包含一些链接,可以让事情正常运行:

.NET Core 3.0的日常版本具有内置功能。大部分。PEM格式在实践中很简单,但在规范中有点烦人,因此方法将数据“取消PEM”留给调用方。。。对于没有属性的单值有效负载上的默认格式(如示例中所示),您可以通过

私有静态RSA ReadKeyFromFile(字符串文件名)
{
字符串pemContents=System.IO.File.ReadAllText(文件名);
常量字符串RsaPrivateKeyHeader=“----开始RSA私钥------”;
常量字符串RsaPrivateKeyFooter=“----结束RSA私钥------”;
if(pemContents.StartsWith(RsaPrivateKeyHeader))
{
int endIdx=pemContents.IndexOf(
RsaPrivateKeyFooter,
RsaPrivateKeyHeader。长度,
比较(序数);
string base64=pemContents.Substring(
RsaPrivateKeyHeader。长度,
endIdx-RsaPrivateKeyHeader.Length);
字节[]der=Convert.FromBase64String(base64);
RSA=RSA.Create();
rsa.ImportRSAPrivateKey(德,外);
返回rsa;
}
//“开始私钥”(ImportPKCS8私钥),
//“开始加密私钥”(ImportEncryptedPkcs8PrivateKey),
//“开始公钥”(ImportSubjectPublicKeyInfo),
//“开始RSA公钥”(ImportRSAPublicKey)
//任何/全部都可以在这里处理。
抛出新的InvalidOperationException();
}

.NET Core SDK的每日版本可从

获取。如果您不需要在代码中从PEM转换为DER,则可以使用openssl获取DER编码的私钥文件:


openssl rsa-in key.pem-out key.der-outform der

该.Net加密API不支持业界广泛使用的pem文件,因此我们需要将其转换为Microsoft引入的XML格式。基本上,解决方案是在这里的另一个类似问题中找到的。

有很多将PEM转换为XML的在线工具,只需将PEM转换为XML即可


RSA.FromXmlString(string-xmlString)

非常简单,您无法导入它,因为它不是受支持的格式。但是,支持的格式是什么?这里不太清楚。一点也不清楚,是吗?我相信该格式是Microsoft专有格式,您可以通过调用ExportCspBlob获得该格式。我不知道如何从您拥有的PKCS#1 RSAPrivateKey对象中获取RSACryptServiceProvider。如果您指的是XML格式,并且我已经使用了它。然而,PKCS#1格式是行业公认的。我不明白MS为什么不支持它……我想我在哪里读到过一篇文章,其中一个即将发布的.NET版本将支持一些更广泛使用的格式,但我不记得细节。谢谢你的回答。您是否认为这在.NETCore2.1中是不可能的?这就是我无法解析ImportRSAPrivateKey(…)的原因,还是您自己的扩展方法?该方法在.NET Core 3.0;中是新的。NETCore2.1没有内置的公共API,谢谢。显然,这意味着我必须依赖beta版才能投入生产。我希望v3发布后,我会再次访问这个区域。谢谢你的帮助。