CFHTTP无法找到到请求目标的有效证书路径



我想从一个网站上抓取数据,其他https网站也可以,上周也可以,但现在失败了

<cfhttp url="https://www.cliftoncameras.co.uk/all-brands-and-types-of-used-cameras/"></cfhttp>

如果我运行cfhttp 的转储

异常:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到到请求目标的有效认证路径

我已尝试使用最新的JRE版本12运行-没有更改

https://helpx.adobe.com/coldfusion/kb/import-certificates-certificate-stores-coldfusion.html

还原回CF原始JRE,下载目标SSL证书并使用密钥工具进行安装-无更改

c:\ColdFusion2018\jre\bin\keytool-import-keystore cacerts-aliascliftoncameras-文件c: \ColdFusion2018\jre\lib\security\cliftoncameras.cer

我将CFAdmin中的websocket更改为proxy-没有更改

我每次都重新启动CF应用程序服务器。

我还能做什么?

我以前也在Java和Coldfusion网站上看到过这个java.security.cert.CertPathBuilderException错误,这些网站在常规浏览器中加载正常,但即使在将证书添加到CF密钥库并重新启动后,cfhttp仍然会出错。

当目标站点服务器证书配置存在信任链问题时,即当一个或多个信任链路径要求浏览器执行证书的"额外下载"时,就会发生这种情况。这可能是因为单个信任链路径中缺少中间证书,也可能是因为信任链中有多个分支具有不同的指纹,而其中一个或多个分支的一个或更多证书没有得到服务。

如果你通过像sslabs.com这样的SSL分析器运行目标站点,例如https://globalsign.ssllabs.com/analyze.html?d=www.cliftoncameras.co.uk&hideResults=on-你会看到他们的中间证书Starfield Secure Certificate Authority - G2没有由他们的服务器提供,这迫使客户端进行"额外下载"-这对大多数合适的浏览器来说都不是问题,但cfhttp使用的Java客户端需要服务器直接提供几乎所有的中间证书和根证书。直到几年前,大多数移动操作系统都是如此。

因此,理想的解决方案是联系cliftoncameras,让他们的服务器管理员安装正确的Starfield中级证书,以便正确提供证书。

一个可能的解决方法是在CF密钥库中安装Starfield Secure Certificate Authority - G2中间证书。

在我的开发平台上,我添加了

-Dcom.sun.security.enableAIAcaIssuers=true

到ColdFusion2018\cfusion\bin\jvm.config 中文件中的java.args

然后重新启动CF应用程序服务器,现在我的CFHTTP调用成功了。

感谢@agreax提供此解决方案

感谢@sevroberts,尽管我无法让它发挥作用,但他的答案可能是正确的。生产主机将SSL证书安装到密钥库中,并通过这种方式成功解决了该问题。他们说:

如果您使用FireFox浏览器,并在浏览想要访问cfhttp请求的URL时单击锁定图标,则可以获取更多信息并单击"查看证书"选项。您将需要下载PEM(证书),而不是链。下载后,您需要运行密钥工具,以便将其导入密钥库。

如果您在用于ColdFusion的JVM中使用默认JRE,则需要在开发机器上安装JDK。您可以从命令提示符中看到我们在wiki上列出的有关将SSL导入存储的命令的详细信息和步骤。https://wiki.hostek.com/ColdFusion_Tips_%26_Tricks#Fixing_cfhttp_Connection_Failures_with_Keytool

感谢@alexaban的变通方法,虽然它有效,但由于需要使用标记cfexecute,我无法实现它。

如果您不能让密钥库工作,也许您会想尝试一下。

创建一个专用的命令行可执行文件(.exe),它将读取网页并将源文件保存到文本文件中。然后可以使用ColdFusion读取文件并处理数据。

这是ColdFusion代码:

<cfscript>
_execPath = "c:/bin/clifton.exe";
_filePath = "c:/bin/clifton.txt";
// run your command-line app (clifton.exe)
cfexecute(name="#_execPath#");  
// wait for the file
do {
sleep(100);
} while ( not fileExists(_filePath) ) 
// wait for write to finish
do {
sleep(100);
_fileInfo = getFileInfo(_filePath);
writeOutput(" ## ");
cfflush();
} while ( _fileInfo.size eq 0 || dateDiff("s", _fileInfo.lastmodified, now()) lte 3 )
writeOutput("<hr />")
_result = fileRead(_filePath);
writeDump(_result);
</cfscript>

正如您所看到的,它依赖于clifton.exe并读取clifton.txt(clifton.txt是执行clifton.exe的结果)


如何制作clifton.exe

您将使用Dart SDK和dart2native工具在开发计算机上创建可执行文件。您可以将可执行文件作为独立程序部署在生产服务器上(生产服务器上不需要安装Dart SDK)。

  • 在C驱动器上创建一个bin文件夹
  • 发件人https://ssl-ccp.secureserver.net/repository/?origin=CALLISTO下载证书CCD_ 9并将其保存在CCD_
  • c:bin内部创建一个文本文件clifton.dart,其中包含以下代码:
// clifton.dart
import 'dart:convert';
import 'dart:io';
main() {
//
const String _certFilePath = 'c:/bin/sfig2.crt.pem';
const String _responseFilePath = 'c:/bin/clifton.txt';
const String _uri =
'https://www.cliftoncameras.co.uk/all-brands-and-types-of-used-cameras/';
final File _file = new File(_responseFilePath);
final IOSink _sink = _file.openWrite();
final SecurityContext _context = new SecurityContext();
_context.setTrustedCertificates(_certFilePath);
final HttpClient _client = new HttpClient(context: _context);
saveSourceToFile(_client, _uri, _sink);
_client.close();
//
}
// get web page source then write it to file
void saveSourceToFile(HttpClient _client, String _uri, IOSink _sink) {
//
_client
.getUrl(Uri.parse(_uri))
.then((req) => req.close())
.then((res) => res.transform(Utf8Decoder()).listen((data) {
// as data is received write to file
_sink.write(data);
}, onDone: () {
_sink.close();
}));
//
}
  • 从下载并安装Dart SDKhttps://dart.dev/
  • 打开一个终端窗口,用dart --version测试Dart的安装(您应该能够从任何文件夹运行Dart,如果需要,请将Dart添加到您的PATH中)
  • 在终端窗口中,用cd c:bin将目录更改为c:bin
  • 接下来,运行dart2native clifton.dart -o clifton.exe
  • 如果编译顺利,c:bin内部应该有三个文件:clifton.dartclifton.exe和证书sfig2.crt.pem
  • 如果希望,可以在终端窗口中测试运行clifton.exe,该窗口应创建clifton.txt文件
  • 测试ColdFusion页面,该页面调用clifton.exe,等待clifton.txt,然后输出内容

如果在生产环境中部署,则需要文件clifton.exesfig2.crt.pem(证书)。

祝你好运

最新更新