К сожалению, команды, запущенные в фоне, установлены оболочкой проигнорировать 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.
Вы могли просто записать это:
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).
К сертификату сервера печати как текст с помощью 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
openssl x509
только дисплеи это с-text
– Stéphane Chazelas 11.12.2013, 00:40-text
. wiki.cacert.org/FAQ/subjectAltName. Я думаю, что обеспечил Stephane, Ваш ответ. специя – slm♦ 11.12.2013, 04:56openssl
команда. (обычно, Вам не нужно-in
какopenssl
берет его вход от stdin, и можно получить (немного) отдельные параметры, не имея необходимость анализировать вывод-text
). – Stéphane Chazelas 11.12.2013, 11:57