скачать сертификат с curl, эхо-значение сертификата в openssl - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь получить промежуточный сертификат, используя curl, и обработать сертификат, не записывая его в файл.

Я выяснил, как обработать листовой сертификат и получить точку распространения, но вот где я застрял.

Для примера, давайте возьмем stackoverflow (кажется уместным).Первый промежуточный сертификат для SO - от http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt.

. В интерактивной оболочке я могу сделать что-то подобное, чтобы сохранить значение сертификата в переменной:

DigiCertIntermediateCert= $ (curl http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt)

Тогда я могу проверить значение сертификата, выполнив что-то вроде этого:

echo "$ DigiCertIntermediateCert" | openssl x509 -informDER-outform PEM

Выводит приятный и дружелюбный PEM-сформированный сертификат. Он выглядит следующим образом:

-----BEGIN CERTIFICATE-----
MIIEsTCCA5mgAwIBAgIQBOHnpNxc8vNtwCtCuF0VnzANBgkqhkiG9w0BAQsFADBs
...
cPUeybQ=
-----END CERTIFICATE-----

(Примечание: это изменится при изменении промежуточного сертификата,если это не совсем то значение, которое вы видите, не волнуйтесь)

Аккуратно! Похоже, это должно сработать. Давайте бросим всю эту логику в скрипт с некоторой базовой обработкой падежа (например, еслиcert находится в другой форме, тогда мы должны интерпретировать его как эту форму), и мы должны быть готовы, верно?

#! /bin/bash

cert_content=$(curl -s "$1")
echo "$cert_content"

if echo "$cert_content" | openssl x509 -text -noout; then
    echo "Not converting"
    echo "$cert_content"
else
    echo "Converting"
    echo "$cert_content" | openssl x509 -inform DER -outform PEM
fi

Что выводит, когда мы передаем URL?

...
[binary contents of a certificate]
...
unable to load certificate
4667577964:error:09FFF06C:PEM routines:CRYPTO_internal:no start line:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.230.1/libressl-2.6/crypto/pem/pem_lib.c:683:Expecting: TRUSTED CERTIFICATE
Converting
unable to load certificate
4421875308:error:0DFFF08E:asn1 encoding routines:CRYPTO_internal:not enough data:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.230.1/libressl-2.6/crypto/asn1/a_d2i_fp.c:251:

Так что довольно легко увидеть, что сертификатicate находится в форме DER (из-за строки «Converting»), но похоже, что сертификат не завершен - обратите внимание на ошибку:

unable to load certificate
4421875308:error:0DFFF08E:asn1 encoding routines:CRYPTO_internal:not enough data:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.230.1/libressl-2.6/crypto/asn1/a_d2i_fp.c:251:

говорит о том, что данных недостаточно.

Почему это отличается между сценарием и действиями, которые я выполняю в оболочке?Как я могу передать бинарный сертификат через инструмент openssl, чтобы получить сертификат PEM-формы?

1 Ответ

0 голосов
/ 23 февраля 2019

Как показывает вопрос, я не был достаточно строг в использовании своей оболочки.«Интерактивный» сеанс был выполнен с использованием zsh, а сценарий был запущен с bash.zsh добавит EOF к переменным, переданным через его каналы, в то время как bash (очевидно) этого не сделает.Теперь мой квест заключается в том, как добавить EOF к переменной в bash (что, по-видимому, нетривиально).

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