0

curl查看HTTPS证书信息命令:查看证书有效期、颁发机构和SAN的3种实用方法

2026.05.25 | youres | 16次围观

目录

  • 为什么需要查看HTTPS证书信息
  • 方法一:openssl直接查看证书详情(最全面)
  • 方法二:curl -v 查看握手过程中的证书信息
  • 方法三:curl查看证书有效期一键脚本
  • 实战:批量检测多个域名证书到期时间
  • 常见问题排查

为什么需要查看HTTPS证书信息

运维过程中,查看HTTPS证书信息是高频操作。常见场景包括:证书快到期了需要续期、排查HTTPS访问异常、确认证书是否覆盖了正确域名(SAN字段)、验证证书链是否完整。

很多人习惯点浏览器地址栏的小锁图标查看,但服务器端没有图形界面,必须靠命令行。curl配合openssl是最直接的方式,一条命令就能拿到证书的完整信息。

方法一:openssl直接查看证书详情(最全面)

openssl是查看证书信息最全面的工具,能拿到证书的所有字段,包括颁发机构、有效期、SAN(多域名)、签名算法等。

# 查看证书完整信息(文本格式)
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null | openssl x509 -noout -text

# 只看有效期
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null | openssl x509 -noout -dates

# 只看颁发机构(Issuer)
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null | openssl x509 -noout -issuer

# 只看证书主题(Subject,即域名)
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null | openssl x509 -noout -subject

# 查看SAN(证书覆盖的所有域名)
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null | openssl x509 -noout -ext subjectAltName

# 查看证书序列号和指纹
echo | openssl s_client -connect www.youres.cn:443 2>/dev/null | openssl x509 -noout -serial -fingerprint

参数说明:

  • s_client -connect 域名:443:模拟TLS客户端连接,获取对端证书
  • x509:x509证书处理子命令
  • -noout:不输出证书本身(PEM编码),只输出指定字段
  • -text:以可读文本格式输出完整证书内容
  • -dates:只输出有效期(notBefore / notAfter)
  • -subject:输出证书CN和DN信息
  • -ext subjectAltName:输出SAN扩展,即证书绑定的所有域名/IP

输出示例(有效期):

notBefore=Jan 15 00:00:00 2024 GMT
notAfter=Jan 14 23:59:59 2025 GMT

方法二:curl -v 查看握手过程中的证书信息

curl的-v(verbose)模式会在SSL握手阶段打印证书信息,适合快速查看,不需要记住openssl的复杂参数。

# 查看证书基本信息(curl -v)
curl -v https://www.youres.cn 2>&1 | findstr /i "certificate subject expire issuer"

# Linux/macOS 下用 grep
curl -v https://www.youres.cn 2>&1 | grep -i "certificate\|subject\|expire\|issuer"

输出示例:

* Server certificate:
*  subject: C=CN; ST=Beijing; L=Beijing; O=Youres; CN=www.youres.cn
*  start date: Jan 15 00:00:00 2024 GMT
*  expire date: Jan 14 23:59:59 2025 GMT
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.

优点:一条curl命令搞定,不需要额外安装openssl(Windows 10+和macOS/Linux都自带curl)
缺点:信息不如openssl全面,看不到SAN、证书链、签名算法等细节

方法三:curl查看证书有效期一键脚本

把openssl和curl组合起来,写一个一键脚本,直接输出证书还有多少天到期,非常适合做监控告警。

#!/bin/bash
# 查看证书到期剩余天数
domain="www.youres.cn"
port=443

echo | openssl s_client -connect "${domain}:${port}" 2>/dev/null \
  | openssl x509 -noout -dates | grep notAfter \
  | sed 's/notAfter=//'

# 计算剩余天数(需要GNU date)
expire_date=$(echo | openssl s_client -connect "${domain}:${port}" 2>/dev/null \
  | openssl x509 -noout -enddate | sed 's/notAfter=//')
remaining_days=$(( $(date -d "${expire_date}" +%s) - $(date +%s) ))
remaining_days=$(( remaining_days / 86400 ))
echo "证书剩余天数: ${remaining_days} 天"

PowerShell版本(Windows)

# PowerShell 查看证书到期时间
$domain = "www.youres.cn"
$tcpClient = New-Object System.Net.Sockets.TcpClient
$tcpClient.Connect($domain, 443)
$tcpClient.Close()

# 使用 .NET 获取证书信息
$req = [System.Net.HttpWebRequest]::Create("https://$domain")
$req.GetResponse().Close()
# 更完善的方案是用 System.Security.Cryptography.X509Certificates

实战:批量检测多个域名证书到期时间

实际运维中经常需要一次性检查几十个域名的证书状态。下面是两个实用脚本。

Bash版:批量检查证书到期时间

#!/bin/bash
# 批量检查域名证书到期时间
domains=("example.com" "www.youres.cn" "github.com")

for domain in "${domains[@]}"; do
    echo "=== $domain ==="
    if timeout 5 bash -c "echo | openssl s_client -connect $domain:443 2>/dev/null \
        | openssl x509 -noout -dates,subject"; then
        echo "OK"
    else
        echo "连接失败或超时"
    fi
    echo ""
done

PowerShell版:批量检查(Windows服务器首选)

# PowerShell 批量检查HTTPS证书到期时间
$domains = @("www.youres.cn", "example.com", "github.com")

foreach ($domain in $domains) {
    Write-Host "=== $domain ===" -ForegroundColor Cyan
    try {
        $tcp = New-Object System.Net.Sockets.TcpClient($domain, 443)
        $tcp.Close()
        # 用curl获取证书信息
        $output = curl -v "https://$domain" 2>&1
        ($output | Select-String "expire date").ToString()
    } catch {
        Write-Host "连接失败: $_" -ForegroundColor Red
    }
    Write-Host ""
}

常见问题排查

1. curl: (60) SSL certificate problem: certificate has expired

原因:证书已过期,或者服务器系统时间不正确,或者系统CA证书包太旧无法验证新证书。

解决:确认证书确实过期则去续期;如果是CA包太旧,更新CA证书:

# Debian/Ubuntu
sudo apt update && sudo apt install -y ca-certificates

# CentOS/RHEL
sudo yum install -y ca-certificates

# Alpine
apk add --no-cache ca-certificates

2. 如何确认证书是否包含www和不带www两个域名?

查看证书的SAN扩展字段:

echo | openssl s_client -connect www.youres.cn:443 2>/dev/null \
    | openssl x509 -noout -ext subjectAltName

输出示例:DNS:www.youres.cn, DNS:youres.cn — 两个都有说明配置正确。

3. curl忽略证书错误后如何恢复默认安全行为?

只需要去掉-k--insecure参数即可恢复。这个参数的原理是跳过证书验证,生产过程严禁使用。详见:curl忽略SSL证书错误参数详解

4. 自签名证书怎么让curl信任?

--cacert参数指定自签名CA证书路径:

curl --cacert /path/to/ca.crt https://internal-site.local

5. 如何查看证书链是否完整?

# 显示完整证书链(包括中间证书)
echo | openssl s_client -connect www.youres.cn:443 -showcerts 2>/dev/null \
    | grep -E "s:|i:|subject=|issuer="

总结

查看HTTPS证书信息,最推荐的组合是openssl s_client + openssl x509,信息最全。如果只想快速确认有效期,用curl -v更高效。生产环境建议把证书到期检查写入定时任务,提前告警,避免证书过期导致网站无法访问。


相关阅读:

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论
883文章数 0评论数
作者其它文章