3

Jira 内のガジェットによって消費される oauth 1.0a サービスを構築しています。これは、C# で記述された .Net 3.5 アプリケーションです。

Jira は RSA-SHA1 署名方式を使用してこのサービスにリクエストを送信します。つまり、リクエストの署名を検証するために、公開証明書から X509Certificate インスタンスを作成する必要があります。

Jira アプリケーション内では、コンシューマー情報画面 (Jira などのコンシューマー キーもある) に移動して公開証明書を取得でき、公開キーが次の形式で表示されます。

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

このキーを生成する Jira コードを見ると、(おそらく) BEGIN/END 証明書ヘッダー/フッターなしで PEM エンコードされていることがわかります。

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("-----[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) 

初歩的な何かが欠けていると確信していますが、それが何であるかを考えることができます。

アップデート

OK、さらに調査すると、これは公開鍵の SubjectPublicKeyInfo シリアライゼーションであると思われるため、ASN.1、base 64 エンコード (エンコードされていない 162 バイト) であり、java.security.PublicKey.getEncoded() を使用した Java からのデフォルト出力です。 .

以上のことから、この公開鍵をラップする X509Certificate2 インスタンスを作成する簡単な方法はありますか? それとも、x509Certificate2 インスタンスを作成するために公開鍵以外に追加のメタデータが必要ですか?

4

2 に答える 2

0

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

お役に立てれば。

于 2013-10-03T12:59:43.753 に答える
0

Jira は (公開キーだけでなく) 証明書を提供する必要があります。

通常、Java の世界では、base64 でエンコードされた証明書または PEM 証明書が提供されます。.Net の X509Certificate2 は、base64、PEM、またはバイナリ証明書を自動的にロードできます。

于 2011-03-31T04:40:30.703 に答える