Eu tive o mesmo problema e escrevi isso ... É rápido e sujo, mas deve funcionar. Ele registra (e imprime na tela com a depuração) quaisquer documentos que ainda não são válidos ou expiram nos próximos 90 dias. Pode conter alguns bugs, mas fique à vontade para arrumá-lo.
#!/bin/sh
DEBUG=false
warning_days=90 # Number of days to warn about soon-to-expire certs
certs_to_check='serverA.test.co.uk:443
serverB.test.co.uk:8140
serverC.test.co.uk:443'
for CERT in $certs_to_check
do
$DEBUG && echo "Checking cert: [$CERT]"
output=$(echo | openssl s_client -connect ${CERT} 2>/dev/null |\
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' |\
openssl x509 -noout -subject -dates 2>/dev/null)
if [ "$?" -ne 0 ]; then
$DEBUG && echo "Error connecting to host for cert [$CERT]"
logger -p local6.warn "Error connecting to host for cert [$CERT]"
continue
fi
start_date=$(echo $output | sed 's/.*notBefore=\(.*\).*not.*/\1/g')
end_date=$(echo $output | sed 's/.*notAfter=\(.*\)$/\1/g')
start_epoch=$(date +%s -d "$start_date")
end_epoch=$(date +%s -d "$end_date")
epoch_now=$(date +%s)
if [ "$start_epoch" -gt "$epoch_now" ]; then
$DEBUG && echo "Certificate for [$CERT] is not yet valid"
logger -p local6.warn "Certificate for $CERT is not yet valid"
fi
seconds_to_expire=$(($end_epoch - $epoch_now))
days_to_expire=$(($seconds_to_expire / 86400))
$DEBUG && echo "Days to expiry: ($days_to_expire)"
warning_seconds=$((86400 * $warning_days))
if [ "$seconds_to_expire" -lt "$warning_seconds" ]; then
$DEBUG && echo "Cert [$CERT] is soon to expire ($seconds_to_expire seconds)"
logger -p local6.warn "cert [$CERT] is soon to expire ($seconds_to_expire seconds)"
fi
done
Se estiver usando no OS X, você poderá descobrir que o date
comando não funciona corretamente. Isso ocorre devido a diferenças na versão Unix e Linux deste utilitário. A postagem vinculada tem opções para fazer esse trabalho.
-servername
argumento da seguinte maneira:openssl s_client -servername example.com -connect example.com:443
Basta executar o comando abaixo e ele fornecerá a data de validade:
Você pode usar este comando em um arquivo em lotes, para reunir essas informações para mais servidores remotos.
fonte
-servername
argumento da seguinte maneira:openssl s_client -servername google.com.br -connect google.com.br:443
Abaixo está o meu script que, como uma verificação dentro dos nagios. Ele se conecta a um host específico, verifica se o certificado é válido dentro de um limite definido pelas opções -c / -w. Pode verificar se o CN do certificado corresponde ao nome que você espera.
Você precisa da biblioteca openssl do python, e eu fiz todos os testes com o python 2.7.
Seria trivial ter um script de shell chamar isso várias vezes. O script retorna os valores de saída padrão dos nagios para o status crítico / aviso / ok.
Uma simples verificação do certificado do Google pode ser realizada assim.
check_ssl_certificate
fonte
get_pem
Conecte-se ao host: port, extraia o certificado com sed e grave-o em /tmp/host.port.pem.
get_expiration_date
Leia o arquivo pem fornecido e avalie a chave notAfter como uma variável bash. Em seguida, imprima o nome do arquivo e a data em que ele expira em um determinado local.
get_pem_expiration_dates
Itere algum arquivo de entrada e execute as funções acima.
check.pems.sh
saída de amostra
E para responder sua pergunta:
fonte
-servername
argumento da seguinte maneira:openssl s_client -servername example.com -connect example.com:443
Aqui está uma versão de uma linha da resposta aceita, que apenas gera o número restante de dias:
( export DOMAIN=example.com; echo $(( ( $(date +%s -d "$( echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -enddate | sed 's/.*notAfter=\(.*\)$/\1/g' )" ) - $(date +%s) ) / 86400 )) )
Exemplo com www.github.com:
fonte
( ... )
sintaxe do subshell pode ser específica do Bash; Eu acho que você está usando um shell diferente?Forneça uma lista de nomes de host com a porta 443 no formato hostname: port no arquivo e dê-o como nome do arquivo.
! / bin / bash
filename = / root / kns / certs
date1 = $ (data | corte -d "" -f2,3,6)
currentDate = $ (data-d "$ date1" + "% Y% m% d")
enquanto lê a linha -r
dcert = $ (echo | openssl s_client -servername $ line -connect $ line 2> / dev / null | openssl x509 -noout -dates | grep notAfter | cut -d = -f2)
echo Nome do host: $ line endDate = $ (data-d "$ dcert" + "% Y% m% d")
d1 = $ (data -d "$ endDate" +% s) d2 = $ (data -d "$ currentDate" +% s) eco Nome do host: $ line - Dias restantes $ (((d1 - d2) / 86400))
echo $ dcert done <"$ filename"
fonte