验证SSL证书指纹需比对公钥SHA-256哈希值,用OpenSSL从证书和私钥分别提取公钥并计算指纹,二者一致才证明配对;还可检查有效期、签发者、SAN及Java truststore中证书指纹。
验证 SSL 证书指纹,核心是比对证书公钥的哈希值,而不是证书文件本身或私钥内容。Apache 不提供内置命令直接输出指纹,必须借助 OpenSSL 工具提取并计算——这是判断证书是否真实、未被篡改、且与私钥配对的最可靠方式。
从 PEM 格式证书(如 server.crt)中提取公钥,并计算其 SHA-256 指纹:
openssl x509 -in server.crt -noout -pubkey | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256注意:若证书含完整链(含中间 CA),需先分离出服务器证书(即第一个 BEGIN CERTIFICATE 到对应 END CERTIFICATE 的部分),否则指纹会不一致。
从私钥(如 server.key)推导出公钥,并计算相同算法的指纹:
openssl rsa -in server.key -noout -pubkey | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256
-passin pass:yourpassword,例如openssl rsa -in server.key -passin pass:123456 -noout -pubkey | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256
两个命令输出的十六进制哈希值必须完全一致,才说明该私钥与证书真正配对。
指纹验证之外,常需确认证书基础状态:
openssl x509 -in server.crt -noout -dates
openssl x509 -in server.crt -noout -issuer -subject
openssl x509 -in server.crt -noout -ext subjectAltName
这些信息可辅助排查浏览器提示“证书不受信任”或“域名不匹配”等问题。
若证书已导入 Java truststore(如 cacerts),可用 keytool 验证其指纹:
keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts -alias your_alias注意:keytool 默认使用 SHA-256,但显示格式为带冒号分隔的大写十六进制,OpenSSL 输出为无分隔小写;比对前建议统一格式或用脚本清洗。