ColdFusion的https连接失败

22

我有一个 API,在其中一个 Web 服务器上运行良好,但在另一个服务器或我的本地机器上无法运行,当我发送 https 请求作为登录过程的一部分时,出现连接失败。

这些请求非常简单,在其中三个服务器之一上运行时没有问题。第一个请求如下所示:

<cfhttp url="https://accounts.ea.com/connect/auth?response_type=code&client_id=EASFC-web&state=59c5a8f1c4e7a991c1da0b54504c38e45f4d8d78&redirect_uri=http%3A%2F%2Fwww.easports.com%2Ffifa%2Ffootball-club%2Flogin_check&locale=uk&scope=basic.identity+basic.persona+signin+offline " method="GET" result="Stage2" redirect="false">
    <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
    <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
    <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
    <cfhttpparam type="header" name="Connection" value="keep-alive" />
    <cfhttpparam type="header" name="Host" value="accounts.ea.com" />
    <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
</cfhttp>

我看了一下,这似乎是一个常见的问题,但是提供的解决方法没有成功。

我猜测可能是我忽略了某些安全设置?如果有帮助的话,我能够在我的本地机器上通过浏览器访问该页面并登录。

有人有什么建议吗?

这是在CFDUMP中返回的内容:

Debugging Information 
ColdFusion Server Developer 9,0,0,251028
Template    /CraigTest/FUT/FIFACPB/logInSearchAccount17.cfm
Time Stamp  09-Dec-13 11:40 AM
Locale  English (UK)
User Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0
Remote IP   127.0.0.1
Host Name   127.0.0.1
________________________________________
Execution Time
Total Time  Avg Time    Count   Template
608 ms  608 ms  1   C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\logInSearchAccount17.cfm
5 ms    5 ms    1   CFC[ C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\Application.cfc | onRequestStart(/CraigTest/FUT/FIFACPB/logInSearchAccount17.cfm) ] from C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\Application.cfc
1 ms    1 ms    1   CFC[ C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\cfcs\Player.cfc | init([complex value]) ] from C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\cfcs\Player.cfc
0 ms    0 ms    1   CFC[ C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\cfcs\Bid.cfc | init([complex value]) ] from C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\cfcs\Bid.cfc
0 ms    0 ms    1   CFC[ C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\cfcs\Club.cfc | init([complex value]) ] from C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\cfcs\Club.cfc
0 ms    0 ms    1   CFC[ C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\cfcs\Connect.cfc | init([complex value]) ] from C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\cfcs\Connect.cfc
0 ms    0 ms    1   CFC[ C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\cfcs\Search.cfc | init([complex value]) ] from C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\cfcs\Search.cfc
0 ms    0 ms    1   CFC[ C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\cfcs\doLogin.cfc | init([complex value]) ] from C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\cfcs\doLogin.cfc
4 ms        STARTUP, PARSING, COMPILING, LOADING, & SHUTDOWN
617 ms      TOTAL EXECUTION TIME
red = over 250 ms average execution time 
________________________________________
Scope Variables
CGI Variables:
AUTH_PASSWORD=
AUTH_TYPE=
AUTH_USER=
CERT_COOKIE=
CERT_FLAGS=
CERT_ISSUER=
CERT_KEYSIZE=
CERT_SECRETKEYSIZE=
CERT_SERIALNUMBER=
CERT_SERVER_ISSUER=
CERT_SERVER_SUBJECT=
CERT_SUBJECT=
CF_TEMPLATE_PATH=C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\logInSearchAccount17.cfm
CONTENT_LENGTH=
CONTENT_TYPE=
CONTEXT_PATH=
GATEWAY_INTERFACE=
HTTPS=
HTTPS_KEYSIZE=
HTTPS_SECRETKEYSIZE=
HTTPS_SERVER_ISSUER=
HTTPS_SERVER_SUBJECT=
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_ENCODING=gzip, deflate
HTTP_ACCEPT_LANGUAGE=en-US,en;q=0.5
HTTP_CONNECTION=keep-alive
HTTP_COOKIE=cf_debug_general=block; cf_debug_template_stack=block; CFID=15108; CFTOKEN=12249080; CFAUTHORIZATION_cfadmin=YWRtaW4NRTg5NzE2OTdCODczMUI0MDVBM0UxRTZCMjI2N0I1MDA5M0QzQkE4MQ1jZmFkbWlu; CFADMIN_LASTPAGE_ADMIN=%2FCFIDE%2Fadministrator%2Fdebugging%2Findex%2Ecfm
HTTP_HOST=127.0.0.1:8500
HTTP_REFERER=
HTTP_USER_AGENT=Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0
PATH_INFO=
PATH_TRANSLATED=C:\Services\web\wwwroot\CraigTest\FUT\FIFACPB\logInSearchAccount17.cfm
QUERY_STRING=reinit=1
REMOTE_ADDR=127.0.0.1
REMOTE_HOST=127.0.0.1
REMOTE_USER=
REQUEST_METHOD=GET
SCRIPT_NAME=/CraigTest/FUT/FIFACPB/logInSearchAccount17.cfm
SERVER_NAME=127.0.0.1
SERVER_PORT=8500
SERVER_PORT_SECURE=0
SERVER_PROTOCOL=HTTP/1.1
SERVER_SOFTWARE=
WEB_SERVER_API=
Cookie Variables:
CFADMIN_LASTPAGE_ADMIN=/CFIDE/administrator/debugging/index.cfm
CFAUTHORIZATION_cfadmin=YWRtaW4NRTg5NzE2OTdCODczMUI0MDVBM0UxRTZCMjI2N0I1MDA5M0QzQkE4MQ1jZmFkbWlu
CFID=15108
CFTOKEN=12249080
cf_debug_general=block
cf_debug_template_stack=block
Session Variables:
biddingaccountloggedin=0
biddingaccountloginattempts=0
cfid=15108
cftoken=12249080
mainaccountloggedin=0
mainaccountloginattempts=0
pricingaccountloggedin=0
pricingaccountloginattempts=0
searchaccount10loggedin=0
searchaccount10loginattempts=0
searchaccount11loggedin=0
searchaccount11loginattempts=0
searchaccount12loggedin=0
searchaccount12loginattempts=0
searchaccount13loggedin=0
searchaccount13loginattempts=0
searchaccount14loggedin=0
searchaccount14loginattempts=0
searchaccount15loggedin=0
searchaccount15loginattempts=0
searchaccount16loggedin=0
searchaccount16loginattempts=0
searchaccount17gamertag=ZappyShrimp8
searchaccount17loggedin=0
searchaccount17loginattempts=0
searchaccount18loggedin=0
searchaccount18loginattempts=0
searchaccount19loggedin=0
searchaccount19loginattempts=0
searchaccount1loggedin=0
searchaccount1loginattempts=0
searchaccount20loggedin=0
searchaccount20loginattempts=0
searchaccount21loggedin=0
searchaccount21loginattempts=0
searchaccount22loggedin=0
searchaccount22loginattempts=0
searchaccount23loggedin=0
searchaccount23loginattempts=0
searchaccount24loggedin=0
searchaccount24loginattempts=0
searchaccount25loggedin=0
searchaccount25loginattempts=0
searchaccount26loggedin=0
searchaccount26loginattempts=0
searchaccount27loggedin=0
searchaccount27loginattempts=0
searchaccount28loggedin=0
searchaccount28loginattempts=0
searchaccount29loggedin=0
searchaccount29loginattempts=0
searchaccount2loggedin=0
searchaccount2loginattempts=0
searchaccount30loggedin=0
searchaccount30loginattempts=0
searchaccount3loggedin=0
searchaccount3loginattempts=0
searchaccount4loggedin=0
searchaccount4loginattempts=0
searchaccount5loggedin=0
searchaccount5loginattempts=0
searchaccount6loggedin=0
searchaccount6loginattempts=0
searchaccount8loggedin=0
searchaccount8loginattempts=0
sessionid=FIFAAUTOBUYER_15108_12249080
urltoken=CFID=15108&CFTOKEN=12249080
URL Parameters:
reinit=1
Debug Rendering Time: 21 ms

CFDUMP第2阶段:

struct
Charset     [empty string]
ErrorDetail     I/O Exception: peer not authenticated
Filecontent     Connection Failure
Header  [empty string]
Mimetype    Unable to determine MIME type of file.
Responseheader  
struct [empty]
Statuscode  Connection Failure. Status code unavailable.
Text    YES 

在 http 标签后,尝试使用 <cfdump var="#Stage2#"> 打印 http 结果变量,并提交堆栈跟踪。 - Dungeon Hunter
看起来您在信任商店中没有https URL的CA证书。 - Dungeon Hunter
我在转储输出中看不到变量stage2,请在http标签后像这样转储变量:<cfdump var="#stage2#">。 - Dungeon Hunter
抱歉 @Sunny - 现在添加了 stage2 的 cfdump - CPB07
升级到CF10解决了这个问题,我的API在本地机器上运行没有任何问题。 - CPB07
显示剩余7条评论
8个回答

26
如果您使用cfhttp通过SSL(https)连接,则ColdFusion服务器必须安装证书才能成功连接。以下是我先前在类似问题上给出的答案:
下面是为了将证书安装到ColdFusion的Java密钥库中而需要执行的步骤。首先,请确保您正在更新ColdFusion正在使用的正确cacerts文件。如果该服务器上安装了多个JRE,则可以从管理员下的“系统信息”中验证ColdFusion所使用的JRE。查找Java Home行。
默认的信任存储库是JRE的cacerts文件。此文件通常位于以下位置:
- 服务器配置:
cf_root/runtime/jre/lib/security/cacerts
- Multiserver/J2EE on JRun 4 配置:
jrun_root/jre/lib/security/cacerts
- Sun JDK 安装:
jdk_root/jre/lib/security/cacerts
- 其他 J2EE 应用服务器和 JVMs 的文档说明。
要安装证书,您需要首先获取证书副本。这可以通过使用Internet Explorer完成。请注意,不同版本的Internet Explorer表现略有不同,但应与这些步骤非常相似。例如,早期版本的IE可能会在我提到的不同选项卡下保存证书。
1. 在Internet Explorer中浏览到SSL URL - https://xyz/infoLookup.php?wsdl。 2. 单击锁图标并单击查看证书以查看证书 3. 然后单击“安装证书...”按钮(注意:如果您看不到此按钮,则必须关闭IE并首先以管理员身份运行它) 4. 单击IE的Internet选项,然后单击内容选项卡。
  • 单击“证书”按钮
  • 在“中间证书颁发机构”选项卡下找到服务器的证书,选择证书并单击“导出...”按钮
  • 使用DER格式进行导出
  • 将导出的证书文件复制到您的ColdFusion服务器(如果需要,您可以从IE中删除该证书)

    1. 以管理员身份在ColdFusion服务器上运行cmd提示符
    2. 备份原始cacerts文件以防万一

    keytool是Java SDK的一部分,可以在以下位置找到:

    • 服务器配置:

      cf_root/runtime/bin/keytool

    • Multiserver/J2EE on JRun 4 Configuration:

      jrun_root/jre/bin/keytool

    • Sun JDK installation:

      jdk_root/bin/keytool

    • 请查阅其他J2EE应用服务器和JVM的文档

    安装证书:

    1. 更改目录到信任库的位置(即cacerts文件所在的位置)
    2. 键入此命令(使用当前jvm和当前jvm的keytool)"c:\program files\java\jre7\bin\keytool" -import -v -alias your_cert_alias_name -file C:\wherever_you_saved_the_file\cert_file.cer -keystore cacerts -storepass changeit
    3. 在提示框中键入yes以“信任此证书?”

    注意: *your_cert_alias_name* 是您自己定义的名称
    注意: *C:\wherever_you_saved_the_file\cert_file.cer* 更改这些值以匹配服务器文件夹和证书文件名

    验证证书:

    1. 输入以下命令(使用当前的JVM和当前JVM的keytool):"c:\program files\java\jre7\bin\keytool" -list -v -keystore cacerts -alias your_cert_alias_name -storepass changeit

    注意:*your_cert_alias_name* 在这里使用与您上面安装证书时相同的名称

    重新启动ColdFusion服务,否则它不会读取更新后的cacerts文件。

    如果需要,您可以从服务器删除导入的证书文件。


    谢谢您的建议,但我仍然收到连接失败的消息 :( - CPB07
    2
    @CPB07 - 如果您正在通过SSL与网站通信,则需要证书。 您无法在没有证书的情况下使用HTTPS进行通信,因此我不明白另一个服务器是如何工作的。 它也在使用HTTPS吗? 证书可能已经被导入了吗? 证书是否来自像Verisign这样的受信任机构? 如果是这种情况,则您不需要导入证书,因为它来自受信任的机构(假设您的密钥库已更新)。 您还必须确保将证书导入到服务器上的正确密钥库中。 - Miguel-F
    从CF管理中的系统信息中,JVM主目录为C:\Services\web\runtime\jre,我使用此处的keytool导入了证书。另一个服务器也在使用HTTPS,但证书尚未被导入。该证书是用于accounts.ea.com的,但我不确定它是否来自Verisign。@Miguel-F,有没有办法可以检查一下呢? - CPB07
    是的,这就是问题所在,登录可以在其中一个服务器上运行,但不能在其他服务器或我的本地机器上运行。 - CPB07
    1
    你尝试过使用 Fiddler(https://fiddler2.com/)来查看本地机器上登录成功时请求的样子吗?试着将其与通过 cfhttp 发送的参数进行比较。 - Russ
    显示剩余6条评论

    5
    我没有足够的积分来评论@Miguel-F的答案,所以我需要发布这个回答并附上我的经验和更多细节...
    按照添加证书的说明后,CFHTTP仍无法为我获取https网站。我找到了这篇文章,最终帮助我解决了这个问题。它描述了如何将SSL调试输出添加到coldfusion-out.log文件中,该文件指定您缺少的证书的确切下载URL。我缺少的证书是“Let's Encrypt”,在日志文件中显示为: accessLocation: URIName: http://cert.int-x3.letsencrypt.org/ 我访问了该URL,并使用keytool将下载的文件添加到密钥库中。恭喜!理智恢复了。
    我既爱又恨ColdFusion。

    是的,我之前也不得不使用过那个SSL调试输出。+1 帮你获得更多声望。 - Miguel-F

    4

    我有一台装有Coldfusion 10 (使用Java版本:1.7.0_15)和Windows Server 2008的服务器。我已经为我的API URL添加了证书,但是我仍然遇到错误。

    连接失败:状态代码不可用。

    然后我在Coldfusion管理员中的Coldfusion JVM配置中添加了以下配置,它开始正常工作。

    -Dhttps.protocols=TLSv1.1,TLSv1.2
    

    1
    大多数证书正在升级到tslv1.2而不是1.1,因此必须将其添加到jvm配置中才能正常工作。 注意:要使TSLV1.2正常工作,JRE版本应为1.7或更高版本,如果不是,则必须升级JRE,还要确保您的CF为11或更高版本,否则JRE升级可能会成为问题。 - Deepak Yadav

    4

    这里有几种情况可能会出现这个错误信息。

    同时,有一些详细的博客文章和帖子可以帮助您调查问题。

    1)DNS解析问题--确保您可以访问端点URL,否则将出现此错误。

    2)确保在cfhttp请求中设置用户代理,服务器很容易检测到非标准用户代理并将其过滤掉。

    enter code here
    

    3) 在请求中禁用压缩。在与某些服务器交互时,这种方法是有效的。在某些IIS配置下可能会出现这种情况。通过搜索可以找到很多相关的网站和示例,我也曾经成功地使用过这种方法。

    <cfhttp url="https://yourUrlHere.com" method="get">
        <cfhttpparam type="Header" name="Accept-Encoding" value="*"> 
        <cfhttpparam type="Header" name="TE" value="deflate;q=0">
    </cfhttp>
    

    另一种你可以尝试发送的头部取决于另一端的http服务器:

    <cfhttpparam type="header" name="Accept-Encoding" Value="no-compression"> 
    

    参考资料

    4) 如果问题是由SSL证书引起的,您可以手动将证书添加到服务器。如果可能的话,我更倾向于不采用这种方法,但您可以尝试搜索一下。

    5) 另一个连接到https网址的场景是可能需要禁用默认的证书提供程序(Java中有很多,而默认的可能不符合需要)。这并不影响安全性,只使用了一个不同但等效的库。

    示例5的参考资料

    6) 最后,您可能会成为重写规则的牺牲品。我没有经验,但看起来很有趣。

    在使用mod_rewrite时出现的CFHTTP“连接失败”问题


    第5点对我有用。不确定是否存在其他安全隐患。有人有什么想法吗? - nasaa

    2

    如果您在使用cfhttp和Google的安全验证服务(就像我一样)时遇到了问题,那么本页面上关于将Google的安全证书添加到JRE的cacerts文件中的帖子是必不可少的。

    同样重要(且不易找到的)是要添加:

    <cfhttpparam type="CGI" encoded="false" name="Content_Type" value="application/json; charset=utf-8">
    

    对于你的cfhttp请求,可以这样处理。这将解决“无法确定内容类型。无效的MIME”错误,该错误看起来像是连接错误。(补充Jas上面的答案)

    感谢Adobe ColdFusion社区论坛上的12Robots提供的解决方案!


    1

    0

    我曾经遇到过类似的问题,@Miguel-F的回答对我非常有效。

    但是我想补充一点的是,第一次尝试时它并没有起作用,因为我从浏览器中下载的证书被我的卡巴斯基杀毒软件替换了。所以将其添加到信任存储中没有任何作用。

    第二次尝试时,我从另一个没有安装该杀毒软件的系统中下载了证书,并将其添加到信任存储中,这样问题就得到了解决。


    0
    谢谢David。 我已经添加了以下3个标题标签,一切正常。
    <cfhttpparam type="header" name="Content-Type" value="application/json" />
    <cfhttpparam type="header" name="Accept-Encoding" Value="*">
    <cfhttpparam type="Header" name="TE" value="deflate;q=0">
    

    谢谢 - Hitesh


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接