我有一台运行 Apache 2.4 的服务器,其中有各种提供 https:// 连接的虚拟主机。
这些设置看似正确,并且在所有浏览器中运行良好。
但是使用 wget 时有一个虚拟主机验证失败。不幸的是我需要 wget 来做一些服务器端编程。
ERROR: cannot verify myvirtualhost.ca's certificate, issued by ‘/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2’:
Unable to locally verify the issuer's authority.
经过进一步调查,使用此命令进行调试:
openssl s_client -connect myvirtualhost.ca:443 -CApath /etc/ssl/certs
验证失败的原因似乎是因为服务器的另一个证书以某种方式参与其中。
CONNECTED(00000003)
depth=0 OU = Domain Control Validated, CN = defaultdomain.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 OU = Domain Control Validated, CN = defaultdomain.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 OU = Domain Control Validated, CN = defaultdomain.com
verify error:num=21:unable to verify the first certificate
verify return:1
因此,CN 与服务器上的另一个虚拟主机(服务器回退到的“defaultdomain.com”)相关。
有什么想法可以解决这个问题吗?
答案1
如果您的服务器在一个 IP 地址上有多个 HTTPS 站点,则必须使用 SNI 来区分每个站点。
为了openssl s_client
使用 SNI,您需要添加以下-servername <your fqdn>
参数:
openssl s_client -connect myvirtualhost.ca:443 -servername myvirtualhost.ca -CApath /etc/ssl/certs
答案2
如果目的是让 wget 工作,请使用标志“--no-check-certificate”,可能不安全,但如果您需要 wget 尽快工作,则可以使用它。
wget --no-check-certificate ...