Загрузка публичного сертификата Jira в .Net из строки (как преобразовать SubjectPublicKeyInfo в кодировке ASN.1 в сертификат X509 в .Net) - PullRequest
3 голосов
/ 31 марта 2011

Я создаю службу oauth 1.0a, которая будет использоваться гаджетом в Jira, это приложение .Net 3.5, написанное на C #.

Jira делает запросы к этой службе, используя метод подписи RSA-SHA1Это означает, что для проверки подписи запроса мне нужно создать экземпляр X509Certificate из своего публичного сертификата.

В приложении Jira вы можете получить публичный сертификат, перейдя на экран информации о потребителе (на котором также есть потребитель.ключ для Jira и т. д.), и он представляет открытый ключ в следующем формате:

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

Глядя на код Jira, который генерирует этот ключ, я вижу, что он (предположительно) PEM закодирован без заголовка сертификата BEGIN / END/footer.

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

Я хочу загрузить этот открытый сертификат (ключ) в экземпляр X509Certificateв .Net, но мои попытки пока не увенчались успехом.Вот код, который у меня есть:

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, base64 закодирован (162 байта не кодирован), который является выводом по умолчанию из Java с использованием java.security.PublicKey.getEncoded ().

Итак, учитывая все это - есть ли простой способ создания экземпляра X509Certificate2, обертывающего эту общедоступнуюключ - или для создания экземпляра x509Certificate2 требуются дополнительные метаданные помимо открытого ключа?

Ответы [ 2 ]

0 голосов
/ 03 октября 2013

вы можете создать свой сертификат XML RSA через .NET, используя RSACryptoServiceProvider . Это даст вам 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

Надеюсь, это поможет.

0 голосов
/ 31 марта 2011

Jira должен предоставить вам сертификат (а не просто открытый ключ).

Обычно мир Java предоставляет кодированный base64 или сертификат PEM. X509Certificate2 из .Net может автоматически. Загрузить base64, PEM или бинарный сертификат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...