使用cURL和OpenSSL彻底测试所有网站的证书有效性

7cjasjjr  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(107)

我有大量的网站,我需要测试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"行安全地推断出来吗?如果可以,我可以使用此输出来确定缺少哪个中间证书吗?
另外,上面的方法似乎没有告诉我链的根证书何时过期,除非它被埋在某处。

ijxebb2r

ijxebb2r1#

Meta:这不是真正的编程或开发,但我还没有看到任何反对票,我需要广泛的格式。我将删除这如果numberary。
旁白:检查过期与证书的“彻底测试有效性”完全不同,检查网站并不总是与其他SSL/TLS应用程序相同。证书有效性必须满足 * 许多 * 其他条件; opensslcurl使用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:

openssl s_client -connect stackoverflow.com:443 <NUL -CAfile trustid.DSTRoot3.pem
CONNECTED(000001C4)
depth=4 O = Digital Signature Trust Co., CN = DST Root CA X3
verify error:num=10:certificate has expired
notAfter=Sep 30 14:01:15 2021 GMT
verify return:1
depth=4 O = Digital Signature Trust Co., CN = DST Root CA X3
notAfter=Sep 30 14:01:15 2021 GMT
verify return:1
depth=3 C = US, O = Internet Security Research Group, CN = ISRG Root X1
notAfter=Sep 30 18:14:03 2024 GMT
verify return:1
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X2
notAfter=Sep 15 16:00:00 2025 GMT
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = E1
notAfter=Sep 15 16:00:00 2025 GMT
verify return:1
depth=0 CN = stackoverflow.com
notAfter=Feb 14 15:32:32 2024 GMT
verify return:1
---
[rest snipped except for]
Verify return code: 10 (certificate has expired)
---

字符串
s_client是一个测试工具,它忽略了cert验证错误并继续连接,但它确实显示了错误,如图所示。示例显示为1.1.1;对于1.1.0以下的许多服务器,包括Stack-which-is-really-Cloudflare,需要指定-servername $host,至少对我来说,回调显示停止在错误点。)
相比之下,如果我使用最新的信任库-其中包括ISRG X1 * 和 * X2,但不包括DST X3 -它使用未过期的X2根,并且非常高兴:

c:\work>openssl s_client -connect stackoverflow.com:443 <NUL -CAfile (curlMoz)cacert-2023-01-10.pem
CONNECTED(000001AC)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X2
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = E1
verify return:1
depth=0 CN = stackoverflow.com
verify return:1
---
Certificate chain
 0 s:CN = stackoverflow.com
   i:C = US, O = Let's Encrypt, CN = E1
 1 s:C = US, O = Let's Encrypt, CN = E1
   i:C = US, O = Internet Security Research Group, CN = ISRG Root X2
 2 s:C = US, O = Internet Security Research Group, CN = ISRG Root X2
   i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
 3 s:C = US, O = Internet Security Research Group, CN = ISRG Root X1
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
...
Verify return code: 0 (ok)
---


(The第二个显示是从服务器接收到的链 * 的摘要--只有主题和颁发者名称--而不是验证的链;这表明服务器仍然像上面的情况一样发送X2-cross-to-X1和X1-cross-to-DST证书,但现在s_client正在丢弃它们并使用X2根。

kb5ga3dv

kb5ga3dv2#

使用openssl可以帮助您

openssl s_client -connect server:port -showcerts

字符串
通过这种方式,您可以下载证书,然后处理证书以获取您试图获取的信息

相关问题