gpt4 book ai didi

c# - 从字符串加载 .Net 中的 Jira 公共(public)证书(如何将 ASN.1 编码的 SubjectPublicKeyInfo 转换为 .Net 中的 X509 证书)

转载 作者:行者123 更新时间:2023-11-30 18:42:37 26 4
gpt4 key购买 nike

我正在构建一个 oauth 1.0a 服务,它将被 Jira 中的一个小工具使用,它是一个用 C# 编写的 .Net 3.5 应用程序。

Jira 使用 RSA-SHA1 签名方法向此服务发出请求,这意味着要验证请求的签名,我需要从其公共(public)证书创建一个 X509Certificate 实例。

在 Jira 应用程序中,您可以通过转到消费者信息屏幕(它也有 Jira 等的消费者 key )获取公共(public)证书,它以这种格式显示公共(public) key :

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCObJRTGSZbAo
jRkvKmm0cwFXnKcPMfR4t/sghvLe/+QVs6TJOz5cUh5UokSqyz
VeMsL0jomP18ZcR3SPcIFT7xtOGQjLwLk7ghfYSsxjTGs9VxsC
/PQk5OQRP3v43IxFNF3M2SYhFWJZTOnqrab5AsMh2Kxdv+D69D
CINXCu5ltQIDAQAB

查看生成此 key 的 Jira 代码,我可以看到它(据推测)是 PEM 编码的,没有 BEGIN/END 证书页眉/页脚。

RSAKeys.toPemEncoding(consumer.getPublicKey())

RSAKeys 是一个开源类,可在此处找到:

https://studio.atlassian.com/source/browse/OAUTH/trunk/api/src/main/java/com/atlassian/oauth/util/RSAKeys.java?r=HEAD

我希望将此公共(public)证书( key )加载到 .Net 中的 X509Certificate 实例中,但到目前为止我的尝试都失败了。这是我的代码:

static readonly Regex stripRegex = new Regex("-----[A-Z ]*-----");

public string ConvertFromOpenSsl(string key)
{
return stripRegex.Replace(key, "").Replace("\r", "").Replace("\n", "");
}

public X509Certificate2 GetConsumerCertificate(IConsumer consumer)
{
string cert =
@"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCObJRTGSZbAo
jRkvKmm0cwFXnKcPMfR4t/sghvLe/+QVs6TJOz5cUh5UokSqyz
VeMsL0jomP18ZcR3SPcIFT7xtOGQjLwLk7ghfYSsxjTGs9VxsC
/PQk5OQRP3v43IxFNF3M2SYhFWJZTOnqrab5AsMh2Kxdv+D69D
CINXCu5ltQIDAQAB";

string converted = ConvertFromOpenSsl(cert);

var bytes = Convert.FromBase64String(converted);


var cert = new X509Certificate2(bytes); // throws here

但是在代码的最后一行我抛出了一个异常:

System.Security.Cryptography.CryptographicException: Cannot find the requested object.

at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._QueryCertBlobType(Byte[] rawData)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] data)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData)

我很确定我错过了一些基本的东西,但我能想到它是什么。

更新

好的,经过进一步调查,这似乎是公钥的 SubjectPublicKeyInfo 序列化,因此它是 ASN.1,base 64 编码(162 字节未编码),这是使用 java.security.PublicKey 的 Java 的默认输出。 getEncoded()。

那么鉴于所有这些 - 是否有任何简单的方法来创建包装此公钥的 X509Certificate2 实例 - 或者是否需要除公钥之外的其他元数据来创建 x509Certificate2 实例?

最佳答案

Jira 应该为您提供证书(而不仅仅是公钥)。

通常 Java 世界会提供 base64 编码或 PEM 证书。 .Net 的 X509Certificate2 可以自动加载 base64、PEM 或二进制证书。

关于c# - 从字符串加载 .Net 中的 Jira 公共(public)证书(如何将 ASN.1 编码的 SubjectPublicKeyInfo 转换为 .Net 中的 X509 证书),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5493722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com