我想从一个网站上抓取数据,其他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.dart
、clifton.exe
和证书sfig2.crt.pem
- 如果希望,可以在终端窗口中测试运行
clifton.exe
,该窗口应创建clifton.txt
文件 - 测试ColdFusion页面,该页面调用
clifton.exe
,等待clifton.txt
,然后输出内容
如果在生产环境中部署,则需要文件clifton.exe
和sfig2.crt.pem
(证书)。
祝你好运