首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CFHTTP无法找到被请求目标的有效证书路径

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

Stack Overflow用户
提问于 2020-05-27 11:18:48
回答 3查看 1.3K关注 0票数 3

我希望从一个网站上删除数据,其他https站点也在工作,这在上周已经开始工作,但现在失败了。

代码语言:javascript
运行
复制
<cfhttp url="https://www.cliftoncameras.co.uk/all-brands-and-types-of-used-cameras/"></cfhttp>

如果我运行cfhttp的转储

sun.security.provider.certpath.SunCertPathBuilderException:异常: PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到被请求的目标的有效证书路径

我尝试使用最新的JRE版本12 - no change运行。

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

返回到CF原始JRE,下载目标SSL证书并使用keytool - no change安装它。

c:\ColdFusion2018\jre\lib\security\cliftoncameras.cer c:\ColdFusion2018\jre\bin\keytool -import -keystore仙人掌-alias剪贴机-file -file

我将CFAdmin中的websocket更改为proxy - no changed

我每次都重新启动了。

我还能做什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-10 08:53:50

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

代码语言:javascript
运行
复制
-Dcom.sun.security.enableAIAcaIssuers=true

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

然后重新启动,现在我的CFHTTP调用成功了。

感谢@agreax提供了这个解决方案

感谢@sevroberts,尽管我无法让它工作,但答案可能是正确的。生产主机将SSL证书安装到密钥存储库,并以这种方式成功地解决了它。他们说:

--如果您使用FireFox浏览器并在浏览您希望拥有cfhttp请求访问权限的URL时单击锁图标,那么您可以获得更多信息并单击查看证书选项。您需要下载PEM (证书)而不是链。下载完之后,您需要运行keytool才能将其导入到keystore。

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

感谢@alexbaban他的解决方案,虽然它有效,但由于需要使用标记cfexecute,这是我无法实现的解决方案。

票数 3
EN

Stack Overflow用户

发布于 2020-06-01 10:13:44

我以前在普通浏览器中加载ok的站点上也看到过这个java.security.cert.CertPathBuilderException错误,但是即使在将证书添加到cfhttp并重新启动之后,cfhttp仍然有错误。

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

如果您通过像ssllabs.com这样的ssllabs.com运行目标站点--比如https://globalsign.ssllabs.com/analyze.html?d=www.cliftoncameras.co.uk&hideResults=on --您将看到他们的中间证书Starfield Secure Certificate Authority - G2没有由他们的服务器提供,这迫使客户机进行“额外下载”--这对大多数正确的浏览器来说都不是问题,但是cfhttp使用的Java需要服务器直接提供几乎所有的中间证书和根证书。直到几年前,大多数移动开放源码软件都是一样的。

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

您可能的解决办法之一是在CF中安装Starfield Secure Certificate Authority - G2中间证书。

票数 3
EN

Stack Overflow用户

发布于 2020-06-06 14:29:00

如果您不能让keystore的功能发挥作用,也许您会想试试这个。

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

以下是ColdFusion代码:

代码语言:javascript
运行
复制
<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和dart2native工具在开发计算机上创建可执行文件。您可以将可执行文件部署到生产服务器上,作为一个独立的(您不需要在生产中安装Dart )。

c:\bin.

  • Inside

  • 下载证书sfig2.crt.pem (PEM)并保存在sfig2.crt.pem (PEM)中,创建一个文本文件clifton.dart,代码如下:H 221F 222

代码语言:javascript
运行
复制
// 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();
          }));
  //
}

https://dart.dev/

  • Open的终端窗口下载并安装dart SDK,并用dart --version测试dart的安装(您应该能够从任何文件夹运行Dart,如果需要将省道添加到您的路径中)在终端窗口中的

  • ,使用cd c:\bin

  • Next,run dart2native clifton.dart -o clifton.exe

  • If编译将目录转换为c:\bin,您应该在c:\bin中拥有以下三个文件:clifton.dartclifton.exe和您希望在终端窗口中测试运行的证书sfig2.crt.pem.

  • If <代码>D45sfig2.crt.pem.

  • If>,它应该创建clifton.txt文件.

  • 测试调用clifton.exe的ColdFusion页面,等待clifton.txt,然后输出内容.

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

祝你好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62041842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档