所以我有两个站点在运行,每个站点都位于一个 Amazon ELB 后面。
出于本文的目的(以及我公司的隐私),每个主机使用以下主机名:
- 示例.com
- anotherexample.com
已为两者安装证书。两个证书都是可信的(从 CA 购买)。
它们通过浏览器等完美运行,并且在请求站点时使用适当的证书(ELB 的预期行为)。已通过各种浏览器和请求确认每个站点访问时都加载并验证了适当的证书。
然而,当我尝试使用 Nagios 监控证书过期时,发现了一个奇怪的现象。
证书监控工作,但仅适用于 ELB 中的默认证书,无论访问哪个主机。
这是命令定义,标准设置:
define command{
command_name check_cert_expire
command_line $USER1$/check_http -S -H $HOSTADDRESS$ -C $ARG1$
}
然后在主机/服务定义中:
define host{
host_name example.com
use docker-container
display_name Example Site 1
check_command check_https_page!/
}
define host{
host_name anotherexample.com
use docker-container
display_name Example Site 2
check_command check_https_page!/
}
define service{
host_name example.com
use generic-service
service_description Cert Expiry Site1
check_command check_cert_expire!45
}
define service{
host_name anotherexample.com
use generic-service
service_description Cert Expiry Site2
check_command check_cert_expire!45
}
但是,对于这两次服务检查,我得到了相同的答复:
SSL OK - 证书“*.example.com”将于 2020-03-08 23:59 +0000/UTC 到期。HTTP OK:HTTP/1.1 302 Found - 572 字节,响应时间为 0.016 秒
因此,无论主机名是什么,它都只检查 ELB 侦听器内的 example.com 证书。
我附上了 ELB 证书设置的屏幕截图。安装了 2 个证书,除了这个 Nagios 监控之外,它们在所有情况下都运行良好:
我确信这与发送到 ELB 的请求有关,不会触发 ELB 内部正在进行的任何数据包路由来解密主机,但甚至不确定从哪里开始找出原因。
我知道这个问题非常具体且模糊,但希望有人有任何想法或已知的解决方案。
编辑:我知道这是不言而喻的,但请尝试手动检查:
./check_http -S -H anotherexample.com -C 45
给了我相同的结果,返回了一个有效的响应,但对于 example.com 证书!
答案1
使用check_http --sni
当在同一个 ip:port 上使用多个证书时,客户端必须使用服务器名称识别 (SNI)选择正确的一个。现代浏览器默认这样做,但是check_http
必须告知 nagios 使用 执行 SNI --sni
。