从自签名证书生成 X.509 SubjectPublicKeyInfo/OpenSSL PEM public 密钥

Generate X.509 SubjectPublicKeyInfo/OpenSSL PEM public key from self-signed certificate

我正在为第三方构建存根 API。必须使用提供的 public 密钥对向第三方发出的请求进行加密。作为存根的一部分,我想解密传入的请求。

我计划更改我的调用代码使用的 public 密钥,以便我可以使用我的私钥解密它。

我有一个自签名证书正在应用程序的其他部分使用,我希望我可以重新使用它。

我遇到的问题是以我需要的格式从证书中获取 public 密钥。

根据 Ian Boyd (this one and this one) 的几个回答,我需要将 public 密钥输入的格式是“X.509 SubjectPublicKeyInfo/OpenSSL PEM”,这是我从第三方收到的密钥格式。例如:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcZ/r0nvJyHUUstIB5BqCUJ1CC
Cd1nzle4bEpPQJ/S0Wn7mV2FDAeh+UcbVhZu9n+5zypYNjeZKapPqBLoT8eCK51y
Kpzeb8LuEm3P8PK4xN18XBrIF1GprN8IIgSdK9f5SwnemutcURrY+PlWnvj7N5s/
03RlJA3/NHVXpPW/VQIDAQAB
-----END PUBLIC KEY-----

我试过使用 X509Certificate2.GetPublicKey 方法,然后 base64 对其进行编码,但这给了我“PEM DER ASN.1 PKCS#1 RSA 中的密钥" 格式。

有谁知道如何以我需要的格式获取 public 密钥?我不一定需要代码中的键,我只需要一个可以存储在数据库中的字符串值。

本人certificate/private/public/cryptography知识有限,如有帮助将不胜感激!

我能够使用 Bouncy Castle 的 PemWriter 以我需要的格式构建 public 密钥:

var cert = Org.BouncyCastle.Security.DotNetUtilities.FromX509Certificate(x509certificate);

using (var stringWriter = new StringWriter())
{
    var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(stringWriter);
    pemWriter.WriteObject(cert.GetPublicKey());
    var pem = stringWriter.ToString();
}