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 は、次の場所にあるオープン ソース クラスです。
この公開証明書 (キー) を .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 インスタンスを作成するために公開鍵以外に追加のメタデータが必要ですか?