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

瓦西里斯

我正在尝试使用.Net Core从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)

包含我的开发私钥/公钥的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-----

为什么不能使用ImportCspBlob(...)导入密钥?我没有在网上找到太多有关该异常的信息,但是我的代码在哪里呢?我知道BouncyCastle,但是我正在尝试使用.Net Core进行本地操作。

巴顿

对于ImportCspBlob格式是从ExportCspBlob,这是所要求的专用密钥BLOB格式的格式CryptImportKey由于.NET只是将其透明地传递给Windows CAPI,因此ImportCspBlob方法会在非Windows平台上引发。

过去,我为导入私钥(包括PKCS#1 RSAPrivateKey)而给出的另一个答案是一些元答案,其中包括一些使工作正常的链接:c#中的数字签名,而无需使用BouncyCastle

.NET Core 3.0的每日内部版本具有内置功能。大多。PEM格式在实践中很容易,但是在规范中有些烦人,因此这些方法将其留给调用者“取消PEM”数据...对于不带属性的单值有效负载进行默认格式化(例如您可以在示例中进行操作),可以通过

private static RSA ReadKeyFromFile(string filename)
{
    string pemContents = System.IO.File.ReadAllText(filename);
    const string RsaPrivateKeyHeader = "-----BEGIN RSA PRIVATE KEY-----";
    const string RsaPrivateKeyFooter = "-----END RSA PRIVATE KEY-----";

    if (pemContents.StartsWith(RsaPrivateKeyHeader))
    {
        int endIdx = pemContents.IndexOf(
            RsaPrivateKeyFooter,
            RsaPrivateKeyHeader.Length,
            StringComparison.Ordinal);

        string base64 = pemContents.Substring(
            RsaPrivateKeyHeader.Length,
            endIdx - RsaPrivateKeyHeader.Length);

        byte[] der = Convert.FromBase64String(base64);
        RSA rsa = RSA.Create();
        rsa.ImportRSAPrivateKey(der, out _);
        return rsa;
    }

    // "BEGIN PRIVATE KEY" (ImportPkcs8PrivateKey),
    // "BEGIN ENCRYPTED PRIVATE KEY" (ImportEncryptedPkcs8PrivateKey),
    // "BEGIN PUBLIC KEY" (ImportSubjectPublicKeyInfo),
    // "BEGIN RSA PUBLIC KEY" (ImportRSAPublicKey)
    // could any/all be handled here.
    throw new InvalidOperationException();
}

可以从https://github.com/dotnet/core-sdk/#installers-and-binaries获得.NET Core SDK的每日构建。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在VBA中包含.NET类?

如何在.net Core中的库中包含文件

从文件中读取公钥或私钥时,如何解决“无效的密钥格式”?

如何在Visual Studio 2017中包含.Net Core 2.0

如何在.NET Core 2.0中包含库

.NET Core自包含发布参考-如何删除未使用的?

如何从 .NET Framework 项目创建自包含的 .exe 文件?

如何在asp.net(WebForm)中包含GoogleMap?

C#(.NET)RSACryptoServiceProvider导入/导出x509公钥blob和PKCS8私钥blob

如何在ASP.NET Core的Swagger中包含XML注释文件

.NET接口如何包含数据

如何使用.NET Reactor混淆包含多个附属程序集的.NET Core 3程序集?

如何以可读的方式读写包含在“ EVP_PKEY”中的公钥和私钥?

如何在VB.net中包含/导入C ++应用程序

如何从作业中的密钥存储中读取公钥和私钥?

如何使用dotnet(.NET Core)打包包含sql项目的sln文件?

AES 256加密:公钥和私钥如何生成和使用.net

如何从SSH私钥中检索公钥?

如何从我们创建的密钥库中检索我的公钥和私钥

如何从C#中的.Net DLL中提取公钥?

如何在.Net Core项目的解决方案中包含NuGet软件包?

如何在发布中包含asp.net Core 2依赖项

ASP.NET Core 3.1 如何重定向到 MicrosoftIdentity 提供的 AccountController 中包含的登录操作

如何在.Net Core自包含exe中设置版本号和产品信息

当参数包含在 URL 中时如何触发 ASP.NET Core API 函数

如何在我的安装程序中包含 .NET Core(Windows 和 macOS)

如何在 ASP.NET Core 中包含對象的 ApplicationUser

如何获取Pem文件的公钥?

如何在 ASP.NET CORE MVC 中导入一个 js 文件模块?