Создать открытый ключ формата DER из сертификата формата PEM и открытого ключа формата PEM - PullRequest
0 голосов
/ 17 сентября 2018

Я сделал следующие шаги, прежде чем получить удар

1) Я получил сертификат сервера, используя

 s_client -connect hostname.org:443 -showcerts

Сертификаты выглядят хорошо

-----BEGIN CERTIFICATE-----
MIIICTCCBvGgAwIBAgIQA8mdxgOCgSdtPdwJY/c3FzANBgkqhkiG9w0BAQsFADBk
MQswCQYDVQQGEwJOTDEWMBQGA1UECBMNTm9vcmQtSG9sbGFuZDESMBAGA1UEBxMJ
and so on
-----END CERTIFICATE-----

2) Я сохранил его как файл myCert.pem. (Я не уверен, должен ли я сохранить его как файл .cer)

3) Я извлек открытый ключ в формате PEM, сформировав вышеупомянутый сохраненный файл сертификата,использование

openssl x509 -pubkey -noout -in myCert.pem > pubkey.pem

Публичный ключ формата PEM тоже выглядит хорошо

-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwFQpwmpIDxhGeuKGxn1a
oWOytrvD5m6dQLv9EUEWkCZPNr48su3G2vGxWtUNNU5kA8lYxGo4kqo1R2J8nM6I
CXANY3tO6/j82AueiK93qTTFdJVDTjtYUd8CI9frzxQ+XyJvBeIj3l0tNLsND4HD
hSV+dteikKGiAwXOR0SA4pUyMCNuO1xqyK0YI2eZvQCOLpXd1DMyV7bmPUJINvwV
nT3iweeaBiX6HHXbSb/zHvAQZzOti939D/NTbLbJwSBYxnUR9uBR/JtcfZaoSjEa
1QHCIPgLJ2oQT/udCdb66IHEZfrjNHArQC3prXvuV25S043VlqssdVQnSz0bV+Tk
+CK3D2Ht42QKewVx6/uFzuf0btkMvhxvY6zLmM4UhRDFhMKbewsI9tAV7tKBdwtc
qYSuFvRLFdJWx1WsUsHhMWE34AVYUu/ocAOsiTBtsLfLR0OPNB05RZI7x6XJL3XV
PCnkIw4nfHf8fqyXfBkqkSBlNVL26t+bVW9E3ksl9eqh4VxZl6XGLOy0jBc8/96E
iRJaydsutraiqevdAwvRkebj2SR0pXLwigZFXm1hPSrtI7cuytsfqNE4DNwD+yQw
d/iMyiPgxG0Mv9fmmpx8VHNNkchhrtDRIvZx6C11eaZ0Ng7Y4JCFtnAfL3XbBCXB
Y8y052YLhGd+lE4/J76bAokCAwEAAQ==
-----END PUBLIC KEY-----

Сейчас я пытаюсь декодировать этот открытый ключ формата PEM в формат der.Как я могу это сделать?

1 Ответ

0 голосов
/ 17 сентября 2018

Файл в кодировке PEM - это заголовок, нижний колонтитул и содержимое в кодировке base64 (которое для сертификатов, ключей и прочего представляет собой данные в кодировке BER / DER).

Когда OpenSSL записывает данные, он использует ограничения из DER (насколько я видел), поэтому для данных, записанных OpenSSL, вам просто нужно base64-декодировать содержимое. openssl base64 -d сделает это (игнорируя верхний / нижний колонтитулы PEM)

openssl base64 -d -in pubkey.key -out pubkey.der

Если вы обеспокоены тем, что содержимое PEM является допустимым BER, но не допустимым DER (например, что в нем используются построенные значения неопределенной длины), вы можете попросить OpenSSL прочитать и записать его.

openssl rsa -pubin -in pubkey.key -outform der -out pubkey.der

или программно

FILE* fp = fopen("pubkey.key", "r");
EVP_PKEY* pkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL);
fclose(fp);
fp = fopen("pubkey.der", "wb");
i2d_PUBKEY_fp(fp, pkey);
fclose(fp);
EVP_PKEY_free(pkey);

Опционально с проверкой ошибок.

...