我正在尝试解析 SSL 客户端的一些输出,以检查一组服务器是否具有有效证书。我正在查看此命令的输出:
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -subject -dates
我注意到 Let's Encrypt 颁发的通配符证书仅在“主题”字段中列出“CN = example.com”,而其他 CA 颁发的通配符证书使用“CN = *.example.com”
这是正常的吗?在“主题”字段中,是否会有一些证书被列为“CN = example.com”,但它们不是通配符,如果我尝试打开“subdomain.example.com”,它们会在浏览器中崩溃?
或者是否有更好的方法来在命令行上验证证书是否适用于正确的域?
谢谢。
答案1
证书对于证书中包含的主题有效,但当有任何主题备用名称条目时,它对这些条目有效。
因此,将输出仅限openssl x509
于主题是一个不确定的测试。
带有证书
Subject: CN=*.example.com
X509v3 Subject Alternative Name:
DNS:*.example.com, DNS:example.com
实际上相当于
Subject: CN=example.com
X509v3 Subject Alternative Name:
DNS:example.com, DNS:*,example.com
尽管主题只能列出一个名称,但两个证书对于裸域和子域通配符均有效。
据我所知,没有惯例或技术原因会偏向上述选项之一,您可以同时看到这两个选项。您看到的内容取决于请求证书的管理员最初使用的选项。
www.example.com
当使用一个或多个完全不同的域名时,您在请求证书时通常会看到完全不同的主题:
Subject: CN=example.NET
X509v3 Subject Alternative Name:
DNS:example.NET, DNS:*.example.NET, DNS:*.example.com, DNS:example.com
在旧版本的 openssl 中显示 SAN 条目并不是一件简单的事情,因为还不支持该-ext subjectAltName
选项:https://stackoverflow.com/q/20983217
CN = example.com
如果我尝试打开“subdomain.example.com”,那么在“主题”字段中列出的某些证书是否不是通配符,并且会在浏览器中中断?
的出现服务器名称指示 (SNI)意味着服务器不仅限于使用单个 TLS 证书,还可以配置多个证书,每个证书对不同的 DNS 名称、DNS 通配符和可能的 IP 地址有效。
事实上,当您使用 SNI 连接时https://www.example.net:443
会导致证书仅有效www.example.net
(并且没有 SAN 条目),并不意味着对不同主机名的请求会导致错误。
除非您真正尝试,否则您不会事先知道使用其他名称的 SNI 请求连接到同一台服务器是否会导致证书错误。
如果服务器为 subdomain.example.net 配置了单独的附加有效证书,则在实际请求之前你不会知道https://subdomain.example.net:443