Определить, является ли сертификат TLS/SSL «доверенным» из командной строки?

Я хотел бы иметь возможность определить, является ли сертификат TLS/SSL удаленного домена «доверенным» из командной строки.

Вот пример openssl, с которым я играл несколько недель назад, здесь я использую openssl для получения сертификата, а затем передаю его команде openssl «проверить». Я предположил, что команда «verify» проверит сертификат, однако, насколько я понимаю сейчас, команда «verify» просто проверяет цепочку сертификатов (я думаю). (cdn.pubnub.com — это просто домен, который я нашел в результате быстрого поиска в Твиттере в качестве примера для использования)

echo "GET /" | openssl s_client -connect cdn.pubnub.com:443 | openssl x509 -text | openssl verify

Как видно из домена cdn.pubnub.com (на момент написания), браузер (Chrome по крайней мере) не доверяет сертификату (поскольку домен сертификата не совпадает), однако команда openssl «verify» не выводит «доверенный» или «не доверенный» или что-то еще, из чего мы можем вывести эту информацию.

Еще один способ, который я придумал для этого, — это использование безголового браузера (например, PhantomJS) и разбор любых ошибок, которые они возвращают. Получается, что PhantomJS просто выдает ошибки, но не дает никаких подробностей, поэтому это нельзя использовать, так как ошибка могла быть вызвана чем-то другим.

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

Есть ли библиотека или какой-либо другой способ определить, является ли сертификат удаленного домена доверенным из командной строки?


person ethicalhack3r    schedule 13.01.2013    source источник


Ответы (2)


curllibcurl) использует OpenSSL для URL-адресов https и проверяет действительность сертификата, если не включена опция -k, --insecure.

zsh 29354 % curl https://cdn.pubnub.com/
curl: (51) SSL peer certificate or SSH remote key was not OK

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

person Anton Kovalenko    schedule 13.01.2013
comment
Похоже, это должно работать, я проведу несколько тестов, чтобы увидеть, как это масштабируется. Спасибо вам большое за ваш ответ. - person ethicalhack3r; 13.01.2013

Это зависит от того, что вы считаете «доверенным». Помимо основных криптографических проверок (например, проверки цифровой подписи) клиент обычно выполняет следующие действия:

  1. Убедитесь, что сертификат связан с доверенным корнем

  2. Убедитесь, что текущее время находится между атрибутами notValidBefore и not validAfter.

  3. Сертификат не отзывается.

  4. keyUsage и другие ограничения сертификата совпадают.

  5. Объект, с которым мы общаемся, каким-то образом находится в субъекте сертификата (для серверов это обычно означает, что имя хоста указано как CN или subjectAlternativeName).

В вашем случае информация для проверки шага 5 (а именно имя хоста) отсутствует, поэтому ее нельзя проверить. Вам придется сделать этот шаг самостоятельно. Обратите внимание, что разные клиенты выполняют разные проверки, чтобы определить, является ли сертификат доверенным, поэтому один ответ может не применяться ко всем возможным клиентам. Если вы хотите тщательно проверить свою установку, рассмотрите возможность использования проверки от ssl labs https://www.ssllabs.com/ssltest. /

person Drunix    schedule 14.01.2013