openssl获取并保存网站的证书

获取并保存网站的证书

你可以使用以下命令将目标网站(例如 example.com)的证书抓取下来并保存为 PEM 格式的文件:

bash 复制代码
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -outform PEM > cert.pem

参数说明:

echo |:通过管道传递一个空行,相当于模拟客户端发送一个 EOF,这样 s_client 执行完握手后会自动退出,不会一直卡住等待输入。

openssl s_client:OpenSSL 的一个工具,用于实现通用的 SSL/TLS 客户端。

-connect example.com:443:指定要连接的目标主机和端口(HTTPS 默认端口是 443)。

-servername example.com:设置 SNI(Server Name Indication)。由于目前大部分服务器都使用 SNI 来区分同一个 IP 上的不同证书,这个参数非常重要,不加的话可能会获取到错误的证书或握手失败。

2>/dev/null:将标准错误输出丢弃,避免把连接过程的日志信息混入到证书文件中。

openssl x509 -outform PEM:将 s_client 抓取到的数据解析为 X.509 标准证书,并以 PEM 格式输出。

查看证书的详细信息

获取到 cert.pem 文件后,你可以使用以下命令查看证书的详细信息(如颁发者、有效期、域名等):

bash 复制代码
openssl x509 -in cert.pem -text -noout

参数说明:

-text:以可读文本格式输出证书内容。

-noout:不输出编码后的证书内容本身,只显示解析后的文本信息。

获取整个证书链(包含中间证书)

上面的命令默认只抓取服务器的实体证书。如果你想抓取完整的证书链(服务器证书 + 中间证书),可以加上 -showcerts 参数:

bash 复制代码
echo | openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null > full_chain.txt

注意:这样输出的文件包含日志和多个证书文本,如果需要纯净的证书链文件,可能需要手动提取其中的 -----BEGIN CERTIFICATE----- 到 -----END CERTIFICATE----- 部分。

快速查看证书到期时间

如果你只想查看证书的过期时间,可以直接使用以下命令组合:

bash 复制代码
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates