有没有方便的方法从使用.NET Core的 PEM格式的.p12证书导出私钥/公钥?没有在低级别操作字节?我用谷歌搜索了几个小时,几乎没有任何东西在.net核心中可用,或者它没有记录在任何地方..
我们有一个X509Certificate2
var cert = new X509Certificate2(someBytes, pass);
var privateKey = cert.GetRSAPrivateKey();
var publicKey = cert.GetRSAPublicKey();
// assume everything is fine so far
Run Code Online (Sandbox Code Playgroud)
现在我需要将密钥导出为两个单独的PEM密钥.我已经尝试PemWriter过BouncyCastle,但是这些类型与Core的System.Security.Cryptography不兼容..没有运气.
- -编辑 - -
换句话说,我找到了一种方法来写这个:
$ openssl pkcs12 -in path/to/cert.p12 -out public.pub -clcerts -nokeys
$ openssl pkcs12 -in path/to/cert.p12 -out private.key -nocerts
Run Code Online (Sandbox Code Playgroud)
有人有想法吗?
谢谢 ...
我想基于PEM文件创建X509Certificate2对象。问题是设置X509Certificate2的PrivateKey属性。我在.NET Core上阅读X509Certificate2.CreateFromCertFile() ,然后使用
var rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(pvk);
Run Code Online (Sandbox Code Playgroud)
pvk私钥的字节数组在哪里(从GetBytesFromPEM读取,如此处所示,如何从PEM文件获取私钥?)来设置私钥,但随后我得到了一个
Internal.Cryptography.CryptoThrowHelper + WindowsCryptographicException,带有消息提供程序错误版本。
如何根据PEM文件中的私钥正确设置X509Certificate2的私钥?
如果我看创建X509Certificate2,他们使用
RSACryptoServiceProvider prov = Crypto.DecodeRsaPrivateKey(keyBuffer);
certificate.PrivateKey = prov;
Run Code Online (Sandbox Code Playgroud)
这似乎是一种整洁的方法,但这在.Net Core中不起作用...
我有一个 crt 和密钥文件以及密码。
我通过 Postman 成功使用这些来调用外部 API。我如何在 C# 中执行此操作?
我看到了将 X509Certificate 与 httpclient 一起使用的示例,但没有看到构造函数的任何选项,我可以在其中使用 2 个文件并设置密码
我有一个随机私钥 ( "C:\tmp\private.key"):
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDHikastc8+I81zCg/qWW8dMr8mqvXQ3qbPAmu0RjxoZVI47tvs
kYlFAXOf0sPrhO2nUuooJngnHV0639iTTEYG1vckNaW2R6U5QTdQ5Rq5u+uV3pMk
7w7Vs4n3urQ6jnqt2rTXbC1DNa/PFeAZatbf7ffBBy0IGO0zc128IshYcwIDAQAB
AoGBALTNl2JxTvq4SDW/3VH0fZkQXWH1MM10oeMbB2qO5beWb11FGaOO77nGKfWc
bYgfp5Ogrql4yhBvLAXnxH8bcqqwORtFhlyV68U1y4R+8WxDNh0aevxH8hRS/1X5
031DJm1JlU0E+vStiktN0tC3ebH5hE+1OxbIHSZ+WOWLYX7JAkEA5uigRgKp8ScG
auUijvdOLZIhHWq7y5Wz+nOHUuDw8P7wOTKU34QJAoWEe771p9Pf/GTA/kr0BQnP
QvWUDxGzJwJBAN05C6krwPeryFKrKtjOGJIniIoY72wRnoNcdEEs3HDRhf48YWFo
riRbZylzzzNFy/gmzT6XJQTfktGqq+FZD9UCQGIJaGrxHJgfmpDuAhMzGsUsYtTr
iRox0D1Iqa7dhE693t5aBG010OF6MLqdZA1CXrn5SRtuVVaCSLZEL/2J5UcCQQDA
d3MXucNnN4NPuS/L9HMYJWD7lPoosaORcgyK77bSSNgk+u9WSjbH1uYIAIPSffUZ
bti+jc1dUg5wb+aeZlgJAkEAurrpmpqj5vg087ZngKfFGR5rozDiTsK5DceTV97K
a3Y+Nzl+XWTxDBWk4YPh2ZlKv402hZEfWBYxUDn5ZkH/bw==
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
我尝试使用RSACryptoServiceProvider.ImportCspBlob导入它,但失败并显示错误:
System.Security.Cryptography.CryptographicException:提供程序的错误版本。
完整的堆栈跟踪:
Failed: System.Security.Cryptography.CryptographicException: Bad Version of provider.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.Utils._ImportCspBlob(Byte[] keyBlob, SafeProvHandle hProv, CspProviderFlags flags, SafeKeyHandle& hKey)
at System.Security.Cryptography.Utils.ImportCspBlobHelper(CspAlgorithmType keyType, Byte[] keyBlob, Boolean publicOnly, CspParameters& parameters, Boolean randomKeyContainer, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.ImportCspBlob(Byte[] keyBlob)
at ConsoleApplication3.Program.DecodeRSA(Byte[] data, Int32 c_data) in C:\Users\myuser\Documents\Visual Studio 2015\Projects\myproj\ConsoleApplication3\Program.cs:line 28
at ConsoleApplication3.Program.Main(String[] args) in …Run Code Online (Sandbox Code Playgroud) 过去,我一直通过导出带有密码的PFX证书来确保TcpListener的安全,但是我想知道是否可以跳过此步骤。
我没有使用商业SSL证书,而是使用了根CA颁发服务器证书。这些服务器证书在C#中托管TcpListener时需要其他步骤(我想是因为未使用CSR)...但是,如果我确实拥有私钥和OpenSSL生成/使用的证书,该怎么办。
sslCertificate = new X509Certificate2("myExportedCert.pfx", "1234");
Run Code Online (Sandbox Code Playgroud)
因此,这很好,但是我必须发出openssl命令,以根据证书和私钥创建pfx文件,然后输入一些密码。然后在我的代码中包含此密码。
我想知道此步骤是否必要。有没有办法从Cert组成X509Certificate2,然后应用私钥。构造函数参数仅允许Cert部分使用,但是由于没有私钥,因此加密失败。
另外,我不想依靠OpenSSL或IIS导出pfx。...似乎很笨拙。
理想情况下,我想:
sslCertificate = new X509Certificate2("myCert.crt");
sslCertificate.ApplyPrivateKey(keyBytes) // <= or "private.key" or whatever
sslStream.AuthenticateAsServer(sslCertificate, false, SslProtocols.Default, false);
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 .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));
Run Code Online (Sandbox Code Playgroud)
我得到的例外是:
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)
Run Code Online (Sandbox Code Playgroud)
包含我的开发私钥/公钥的 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 …Run Code Online (Sandbox Code Playgroud) 在 Windows Server 2016 上使用 powershell 将 .crt、.csr 和 .key 文件转换为 .pfx 或 .p12。
我有 .cert、.csr 和 .key 文件。但为了执行“netsh http add sslcert ...”命令,我需要 .pfx 或 .p12 文件。我需要在 powershell 中完成此操作。Openssl 不是一个选项。
我已经使用 openssl 完成了上述操作。但我现在无法下载软件,所以这不再是一个选择。我正在寻找openssl pkcs12 -export -out domain.name.pfx -inkey key.key -in cert.crtpowershell 中的等效命令。
作为调试问题的一部分,我试图了解pem证书中私钥的加密方式,因为我想知道是否curl无法对私钥进行解密。
我的-----BEGIN ENCRYPTED PRIVATE KEY-----部分中有一个pem。
它用密码加密了吗?还有其他某种加密方案吗?
更确切地说
一位同事建议,pem即使没有密码,也可以对私钥进行加密。这是对的吗?
c# ×4
pem ×4
.net-core ×3
certificate ×2
rsa ×2
ssl ×2
curl ×1
encryption ×1
httpclient ×1
https ×1
openssl ×1
p12 ×1
pfx ×1
powershell ×1
private-key ×1
security ×1