Как получить сертификат SSL сервера в человекочитаемой форме?

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

(trap - INT; exec process1) &
(trap - INT; exec process2) &
trap '' INT
wait

Поскольку process1 и process2 получили бы SIGINT при нажатии Ctrl-C, так как они - часть той же группы процесса, которая является группой приоритетного процесса терминала.

Код выше будет работать с pdksh и zsh, которые в том отношении не являются совместимым POSIX.

С другими оболочками необходимо было бы использовать что-то еще для восстановления обработчика по умолчанию для SIGINT как:

perl -e '$SIG{INT}=DEFAULT; exec "process1"' &

или используйте другой сигнал как SIGTERM.

5
01.09.2017, 22:26
2 ответа

Вы могли просто записать это:

openssl s_client -showcerts -connect encrypted.google.com:443 < /dev/null \
   2> /dev/null | openssl x509 -noout -enddate

Другие опции, чем -enddate может использоваться для получения других полей. -text выводы большая часть информации.

См. также keytool от Java:

keytool -printcert -sslserver encrypted.google.com:443

Это распечатает целую цепочку сертификата, если возможный (часть сертификата возможно получила от хранилища сертификатов Java).

8
27.01.2020, 20:33
  • 1
    что относительно Подчиненных Альтернативных Имен? –  jfs 11.12.2013, 00:23
  • 2
    @J.F.Sebastian, openssl x509 только дисплеи это с -text –  Stéphane Chazelas 11.12.2013, 00:40
  • 3
    @J.F.Sebastian - Я не видел никакой другой метод в Wiki ни один вне -text. wiki.cacert.org/FAQ/subjectAltName. Я думаю, что обеспечил Stephane, Ваш ответ. специя –  slm♦ 11.12.2013, 04:56
  • 4
    @slm, обратите внимание, что J.F.Sebastian ответил на его собственный вопрос, он просто совместно использовал свой хороший сценарий для получения информации о сертификате полезным способом. Я просто упоминал альтернативный способ звонить openssl команда. (обычно, Вам не нужно -in как openssl берет его вход от stdin, и можно получить (немного) отдельные параметры, не имея необходимость анализировать вывод -text). –  Stéphane Chazelas 11.12.2013, 11:57
  • 5
    @StephaneChazelas - я не дал другому ответу полный взгляд, так как он был похож на очень большое количество кода, теперь смотря на него я вижу то, что Вы говорите.Спасибо. –  slm♦ 11.12.2013, 14:49

К сертификату сервера печати как текст с помощью openssl:

#!/bin/bash
#
# Show server's certificate in a human-readable form.
#
# Usage: $ show-cert HOST [PORT]
#
exec <&- # close stdin to suppress `read:errno=0` from openssl
exec openssl x509 -noout -text \
     -in <(openssl s_client -connect "$1":"${2:-443}" -showcerts)

Или использование Python, который будет произведен в json формате:

#!/usr/bin/env python3
"""Show server's certificate as json.

Usage:
  $ %(prog)s HOST [PORT]
"""
import json
import socket
import ssl
import sys

def getcert(addr, timeout=None):
    """Retrieve server's certificate at the specified address (host, port)."""
    # it is similar to ssl.get_server_certificate() but it returns a dict
    # and it verifies ssl unconditionally, assuming create_default_context does
    with socket.create_connection(addr, timeout=timeout) as sock:
        context = ssl.create_default_context()
        with context.wrap_socket(sock, server_hostname=addr[0]) as sslsock:
            return sslsock.getpeercert()

def main(argv):
    host = argv[1]
    port = int(argv[2]) if len(argv) > 2 else 443
    print(json.dumps(getcert((host, port)), indent=2, sort_keys=True))

if __name__ == "__main__":
    main(sys.argv)

Пример:

$ getcert encrypted.google.com | jq -r '.notAfter, .subjectAltName[][1]'
Mar 20 00:00:00 2014 GMT
*.google.com
*.android.com
*.appengine.google.com
*.cloud.google.com
...

Последняя версия: getcert.py

5
27.01.2020, 20:33

Теги

Похожие вопросы