متصفّحُك يحتفظ بشهاداتٍ وسيطة مخزَّنة، ويتذكّر زياراتٍ سابقة، وهو متسامح. فهو آخرُ ما تختبر به لا أوّله. وهذه الأوامر تسأل الخادم مباشرةً ولا شيء فيها مخزَّن.
١. أتتحقّق أصلًا
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com < /dev/null 2>/dev/null \
| grep -E 'Verify return code|^ *[0-9]+ s:'
Verify return code: 0 (ok) وشهادتان مدرَجتان على الأقلّ. وما عدا ذلك سلسلةٌ ناقصة.
٢. أيَّ الأسماء تغطّي
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com < /dev/null 2>/dev/null \
| openssl x509 -noout -text | grep -A1 "Subject Alternative Name"
٣. متى تنتهي
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null \
| openssl x509 -noout -dates
٤. كلُّ نطاقٍ فرعيّ لا الرئيس وحده
for h in www shop api mail staging; do
printf '%-8s ' "$h"
echo | openssl s_client -connect "$h.yourdomain.com:443" -servername "$h.yourdomain.com" 2>/dev/null \
| openssl x509 -noout -enddate 2>/dev/null || echo "no certificate"
done
٥. بلا مخزن، بصفة غريب
curl -sS -o /dev/null -w '%{http_code} %{ssl_verify_result}\
' https://yourdomain.com/
# ssl_verify_result 0 is correct
٦. البروتوكولات القديمة، وحقُّها الرفض
openssl s_client -connect yourdomain.com:443 -tls1_1 < /dev/null 2>&1 | tail -3
# a handshake failure here is the CORRECT result
TLS 1.0 و1.1 مسحوبان، و3DES وRC4 لا ينبغي أن يتفاوضا. فإن اتّصل أيٌّ منها فالإعدادُ قديم — اضبط
ssl_protocols TLSv1.2 TLSv1.3; وقائمةَ تشفيرٍ حديثة.ثمّ راقب تاريخ الانتهاء
0 8 * * * /usr/local/bin/check-cert.sh yourdomain.com 21 # warn 21 days out
وافحص الشهادة من خارج شبكتك أيضًا. فقد يقدّم جدارٌ ناريّ أو وسيطٌ شهادةً مختلفة في الداخل، فينجح اختبارٌ داخليّ والموقعُ العامّ مكسور.