我有两个在Apache Web服务器上运行的coldfusion应用程序
两者都拥有自己的SSL证书,并在httpd-ssl.conf
文件中配置了每个站点的基于名称的虚拟主机。
当我从Site1.com到Site2.com进行HTTPS调用时,
httpService = new http();
httpService.setMethod("get");
httpService.setUrl("https://site2.com/comp.cfc?method=amethod&ID=12");
result = httpService.send().getPrefix();
它出现以下错误
I/O Exception: hostname in certificate didn't match: <site2.com> != <site1.com>
实际上它应该使用site2的SSL证书。但不确定为什么它使用Site1的SSL证书并给出错误。
答案 0 :(得分:3)
这看起来像服务器名称指示(SNI)问题。 SNI是一个TLS扩展,允许在同一台服务器上托管多个HTTPS服务器。
您可以使用以下方式确认此问题:
echo "" | openssl s_client -connect site2.com:443 | openssl x509 -noout -subject
如果您看到类似CN=site1.com
的内容,请尝试以下操作:
echo "" | openssl s_client -connect site2.com:443 -servername site2.com | openssl x509 -noout -subject
如果你得到CN=site2.com
,这是一个SNI问题。
您可以查看此bug,更具体地说是此评论:
在ColdFusion 11中添加了SNI支持。支持此功能所需的更改非常大,因此无法向后移植到ColdFusion 10。
其他解决方法可能是在 2个单独的服务器上托管您的2个HTTPS站点,以设置对两个名称都有效的唯一SSL证书(使用X509 SubjectAltName扩展名)或禁用证书CN验证(如果可能)。
答案 1 :(得分:0)
您需要将SSL证书导入ColdFusion / Java密钥库。如果这没有帮助,请在jvm.config中为ColdFusion添加-Djavax.net.debug = all。这将需要重新启动CF服务。然后尝试SSL调用。