Как получить 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
200 +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 Апр 2024 в 13:05
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир