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

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

Jira使用RSA-SHA1签名方法向此服务发出请求,这意味着validation我需要创建X509Certificate实例的请求的签名形成其公共证书。

在Jira应用程序中,您可以通过转到消费者信息屏幕(也包含Jira的消费者密钥等)来获取公共证书,并以此格式显示公钥:

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

查看生成此密钥的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

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

 static readonly Regex stripRegex = new Regex("-----[AZ ]*-----"); 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 

但是在最后一行代码中我抛出了一个exception:

 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) 

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

UPDATE

好的,经过进一步调查,看来这是一个公钥的SubjectPublicKeyInfo序列化,所以它是ASN.1,基本64编码(162字节未编码),这是Java使用java.security.PublicKey.getEncoded()的默认输出。 。

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

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

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

您可以使用RSACryptoServiceProvider通过.NET生成XML RSA证书。 这将为您提供XML(FromXmlString方法), 然后需要对公钥进行编码 ,例如使用此服务:

https://superdry.apphb.com/tools/online-rsa-key-converter

然后用于创建JIRA的应用程序链接。

您之前获得的XML格式的私钥可用于直接签署.NET应用程序请求。

我个人使用DonNetAuth库进行签名,交换令牌等,这对我有用。 我遇到的唯一错误是关于jql查询,签名需要一些调整才能正常工作。 链接在这里:

http://samondotnet.blogspot.sk/2012/12/introduction-to-dotnetauth.html

另请参阅此链接: https : //answers.atlassian.com/questions/172760/is-there-any-jira-oauth-implementation-example-in-net

希望这可以帮助。