Как получить Public Key сертификата идентичный с выводу openssl? да, звучит весьма глупо. но так и есть.
предположим есть у нас сертификат crt.cer в Base64
далее запускаю openssl x509 -in crt.cer -pubkey и на выходе получаю (например длиной 294 байта):MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvUihVNnWYpu3uJmcLy+PBecKu4ziVD7OIeZ/V+tJkXbc5+6OW8G+QDtJKuJkkuxGNLBNmLHbCyXsJ/US3kKkU7/7yK7jfWRNdqAKJdDTVxsWnxlo+/28ScGrAV6wK2bbK8GQBpsYRn1HKGCGceWIBCSqUfI7rwgwDnvqcW5PeivORd4+or5DdhgUMwiV5Vr2fvdcAiQR1CKgMphxO4+OmZ4khpB/HT/xS4FscvfFsSBLM37jBMrnhY5yNKPeHZB2eYvehnnw22NFHJNksa+vVFXL9aJcZWJc/bqqlhlhL8eLdYSR/KA006PSInW8yWtd4IFVKJ1Moa41gCUZL81voQIDAQAB
Затем тоже самое делаю в коде UWP приложения:X509Certificate2 certificate = new X509Certificate2(certificateBlob);
var truePublicKey = Convert.ToBase64String(certificate.GetPublicKey());
на выходе нечто вроде этого (длиной уже 270 байт)MIIBCgKCAQEAvUihVNnWYpu3uJmcLy+PBecKu4ziVD7OIeZ/V+tJkXbc5+6OW8G+QDtJKuJkkuxGNLBNmLHbCyXsJ/US3kKkU7/7yK7jfWRNdqAKJdDTVxsWnxlo+/28ScGrAV6wK2bbK8GQBpsYRn1HKGCGceWIBCSqUfI7rwgwDnvqcW5PeivORd4+or5DdhgUMwiV5Vr2fvdcAiQR1CKgMphxO4+OmZ4khpB/HT/xS4FscvfFsSBLM37jBMrnhY5yNKPeHZB2eYvehnnw22NFHJNksa+vVFXL9aJcZWJc/bqqlhlhL8eLdYSR/KA006PSInW8yWtd4IFVKJ1Moa41gCUZL81voQIDAQAB
Если присмотреться повнимательнее, то видно что во втором случае спереди отрезан кусок данных, а в остальном они идентичны.
Воспользовавшись онлайн декодером ASN1 данных можно заметить, что в C# приложении "отрезано все лишнее", но такой вариант мне не подходит. Возможно ли как-нибудь получить идентичный openssl результат? (желательно без написания своего ASN кодера/декодера). Что только не пробовал - не получается( А ключ нужен именно как в первом варианте, т.к. дальше считается хеш
PS: С использованием Chillkat либы мне удалось получить нужный ключ, но она не бесплатная. Для моих целей не подходит.

21 Авг 2019 в 07:12
185 +1
0
Ответы
1

Для получения Public Key сертификата в формате, аналогичном выводу openssl, вам нужно использовать метод ExportSubjectPublicKeyInfo класса X509Certificate2. Вот пример кода:

X509Certificate2 certificate = new X509Certificate2(certificateBlob);
byte[] publicKeyBytes = certificate.GetRSAPublicKey().ExportSubjectPublicKeyInfo();
string publicKeyBase64 = Convert.ToBase64String(publicKeyBytes);

Этот код экспортирует открытый ключ сертификата в формате SubjectPublicKeyInfo, который будет совпадать с выводом openssl. Надеюсь, это поможет вам получить нужный результат без использования сторонних библиотек.

20 Апр в 13:05
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир