我有大量的网站,我需要测试SSL/TLS设置。我需要执行的一些测试是:
- 服务器证书是否已过期?
- 是否使用旧的加密(即SSLv 2、SSLv 3、TLS 1.0)?
- 证书链是否缺少任何中间证书?如果有,是哪一个?
- 链的根证书是否已过期?
我觉得这是可行的与Bash,cURL,也许OpenSSL。我已经做了一些测试与cURL,但解释输出在某些情况下是混乱的。此外,我一直无法使用任何这些方法来检测根证书的链是否过期,这是一个常见的问题,我试图追查。
范例:
curl -v --cert-status https://someserver.somedomain.com/
* Trying xx.yy.zz.aa:443...
* Connected to someserver.somedomain.com (xx.yy.zz.aa) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.**
字符串
这是一个已知缺少中间证书的服务器。我可以从"TLSv1.2 (OUT), TLS alert, unknown CA (560)" or "SSL certificate problem: unable to get local issuer certificate"
行安全地推断出来吗?如果可以,我可以使用此输出来确定缺少哪个中间证书吗?
另外,上面的方法似乎没有告诉我链的根证书何时过期,除非它被埋在某处。
2条答案
按热度按时间ijxebb2r1#
Meta:这不是真正的编程或开发,但我还没有看到任何反对票,我需要广泛的格式。我将删除这如果numberary。
旁白:检查过期与证书的“彻底测试有效性”完全不同,检查网站并不总是与其他SSL/TLS应用程序相同。证书有效性必须满足 * 许多 * 其他条件;
openssl
和curl
使用OpenSSL(就像你的版本一样,但不是所有的版本),检查其中的 * 一些 *,而不是其他的。curl
检查网站/主机名(给定一个https URL),但openssl s_client
默认情况下不这样做,因为OpenSSL可以用于除了web/HTTPS之外的许多其他应用程序,有些应用程序不处理相同的主机名,甚至没有主机名。除了基本的链接(签名、阿基=SKI(如果存在)、BasicConstraints和KeyUsage)和NameConstraints,openssl会检查链中所有证书(包括根证书)的过期时间(RFC 5280没有正式要求,但很常见). OTOH如果您使用的是跟踪主要“root-cert”程序之一的信任存储库(Microsoft/Windows,Apple,Google/Android,Java,Mozilla)它们通常会完全删除过期的根,因此使用实际存在且过期的根通常会在客户端上显示为 unknown-not-trusted root而不是过期的root。
目前,有一个易于演示和方便的案例:LetsEncrypt是still using a 'cross' cert aka bridge到过期的Identrust/Trustid/DST X3根(尽管它们是plan to stop soon)和堆栈使用LE。几乎所有的现代设备都忽略了这个交叉认证,并将(非过期)至少ISRG根X1证书,可能还有ISRG根X2,允许证书成功验证,但是使用openssl(或curl/openssl),你可以强制一个使用它的case:
字符串
(
s_client
是一个测试工具,它忽略了cert验证错误并继续连接,但它确实显示了错误,如图所示。示例显示为1.1.1;对于1.1.0以下的许多服务器,包括Stack-which-is-really-Cloudflare,需要指定-servername $host
,至少对我来说,回调显示停止在错误点。)相比之下,如果我使用最新的信任库-其中包括ISRG X1 * 和 * X2,但不包括DST X3 -它使用未过期的X2根,并且非常高兴:
型
(The第二个显示是从服务器接收到的链 * 的摘要--只有主题和颁发者名称--而不是验证的链;这表明服务器仍然像上面的情况一样发送X2-cross-to-X1和X1-cross-to-DST证书,但现在
s_client
正在丢弃它们并使用X2根。kb5ga3dv2#
使用
openssl
可以帮助您字符串
通过这种方式,您可以下载证书,然后处理证书以获取您试图获取的信息