IBM Maximo: Script to check router certificates on MAS
Jump to navigation
Jump to search
Script para coletar todas as Routes em mas-dev01-core e mas-dev01-manage e verificar detalhadamente os certificados TLS associados.
Script
#!/usr/bin/env bash
set -uo pipefail
NAMESPACES=("mas-dev01-core" "mas-dev01-manage")
OUTPUT_FILE="report-certificates-routes.txt"
exec > >(tee -i "${OUTPUT_FILE}") 2>&1
echo "========================================================================"
echo " RELATÓRIO DE CERTIFICADOS TLS DAS ROUTES"
echo " Namespaces: ${NAMESPACES[*]}"
echo " Data/Hora: $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================================================"
echo ""
for ns in "${NAMESPACES[@]}"; do
echo "########################################################################"
echo " NAMESPACE: $ns"
echo "########################################################################"
ROUTES=$(oc get routes -n "$ns" -o jsonpath='{.items[*].metadata.name}' 2>/dev/null || echo "")
if [ -z "$ROUTES" ]; then
echo "Nenhuma Route encontrada no namespace $ns."
echo ""
continue
fi
for route in $ROUTES; do
echo "------------------------------------------------------------------------"
echo " Route: $route"
HOST=$(oc get route "$route" -n "$ns" -o jsonpath='{.spec.host}')
TERMINATION=$(oc get route "$route" -n "$ns" -o jsonpath='{.spec.tls.termination}')
INSECURE_POLICY=$(oc get route "$route" -n "$ns" -o jsonpath='{.spec.tls.insecureEdgeTerminationPolicy}')
echo " Host: $HOST"
echo " Terminação TLS: ${TERMINATION:-'Nenhuma (HTTP/Sem TLS)'}"
echo " Política Insegura: ${INSECURE_POLICY:-'None'}"
# Extrai certificado embutido na Route
CERT=$(oc get route "$route" -n "$ns" -o jsonpath='{.spec.tls.certificate}')
CA_CERT=$(oc get route "$route" -n "$ns" -o jsonpath='{.spec.tls.caCertificate}')
DEST_CA=$(oc get route "$route" -n "$ns" -o jsonpath='{.spec.tls.destinationCACertificate}')
if [ -n "$CERT" ]; then
echo ""
echo " [✓] Certificado Customizado Presente na Route:"
echo "$CERT" | openssl x509 -noout -subject -issuer -dates 2>/dev/null || echo " Erro ao parsear certificado com OpenSSL."
# SANs
SANS=$(echo "$CERT" | openssl x509 -noout -ext subjectAltName 2>/dev/null | grep -v "X509v3" | sed 's/^[ \t]*//' || true)
if [ -n "$SANS" ]; then
echo " SANs: $SANS"
fi
# Validação de data
if ! echo "$CERT" | openssl x509 -checkend 0 -noout 2>/dev/null; then
echo " [!] STATUS: CERTIFICADO EXPIRADO!"
else
echo " [✓] STATUS: VÁLIDO"
fi
else
if [ -z "$TERMINATION" ]; then
echo " [!] Sem terminação TLS configurada."
elif [ "$TERMINATION" == "passthrough" ]; then
echo " [i] Terminação Passthrough (Certificado gerenciado diretamente pelo Pod/Backend)."
else
echo " [i] Usa o Certificado Padrão do Ingress do OpenShift (*.apps...)."
fi
fi
if [ -n "$CA_CERT" ]; then
echo ""
echo " [i] CA Certificate na Route:"
echo "$CA_CERT" | openssl x509 -noout -subject -issuer -dates 2>/dev/null || echo " Erro ao parsear CA cert."
fi
if [ -n "$DEST_CA" ]; then
echo ""
echo " [i] Destination CA Certificate (para reencrypt):"
echo "$DEST_CA" | openssl x509 -noout -subject -issuer -dates 2>/dev/null || echo " Erro ao parsear Destination CA."
fi
echo ""
done
echo ""
done
echo "========================================================================"
echo " Resumo e Verificação de Conectividade TLS Externa (via OpenSSL s_client)"
echo "========================================================================"
for ns in "${NAMESPACES[@]}"; do
ROUTES=$(oc get routes -n "$ns" -o jsonpath='{.items[*].metadata.name}' 2>/dev/null || echo "")
for route in $ROUTES; do
HOST=$(oc get route "$route" -n "$ns" -o jsonpath='{.spec.host}')
TERMINATION=$(oc get route "$route" -n "$ns" -o jsonpath='{.spec.tls.termination}')
if [ -n "$TERMINATION" ] && [ -n "$HOST" ]; then
echo -n "Testando handshake TLS em $HOST:443 ... "
# Tenta conectar via porta 443 com timeout de 3s
RESP=$(timeout 3 openssl s_client -connect "${HOST}:443" -servername "$HOST" </dev/null 2>&1 || true)
if echo "$RESP" | grep -q "CONNECTED"; then
EXP_DATE=$(echo "$RESP" | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2 || echo "N/A")
SUBJECT=$(echo "$RESP" | openssl x509 -noout -subject 2>/dev/null || echo "N/A")
echo "OK (Expira em: $EXP_DATE | $SUBJECT)"
else
echo "FALHA / TIMEOUT na conexão externa."
fi
fi
done
done
echo ""
echo "========================================================================"
echo " Check Complete. See file: $OUTPUT_FILE"
echo "========================================================================"