ColdFusion CFHTTP I / O异常:对等体未经过身份验证 - 即使在将证书添加到Keystore之后也是如此

时间:2009-10-23 12:12:34

标签: authentication coldfusion certificate certificate-authority cfhttp

我目前正在使用付款处理器。我可以从我们的服务器浏览到支付URL,因此它不是防火墙问题,但是当我尝试使用CFHTTP时,我得到一个I / O异常:peer未经过身份验证。我已经下载并安装了他们最新的安全证书到cacerts密钥库并重新启动了CF,但仍然遇到同样的错误。我不仅安装了提供者证书,还安装了证书链中的其他2个Verisign证书颁发机构证书。该证书是较新的3类扩展验证证书之一。

以前是否有人遇到此问题并找到解决方案?

8 个答案:

答案 0 :(得分:9)

我的一位同事在连接到第三方时遇到同样的问题后发现了以下情况。

<击> http://www.coldfusionjedi.com/index.cfm/2011/1/12/Diagnosing-a-CFHTTP-issue--peer-not-authenticated

https://www.raymondcamden.com/2011/01/12/Diagnosing-a-CFHTTP-issue-peer-not-authenticated/

我们在页面的下方使用了Pete Freitag评论中提供的解决方案。它可以工作,但我认为应该谨慎使用,因为它涉及动态删除和添加回JsafeJCE提供程序的特定属性。

为了存档,以下是Pete Freitag评论的原始内容:

  

我把它缩小了一点,然后删除了   来自RSA JsafeJCE提供商的KeyAgreement.DiffieHellman(其中   导致使用默认的sun实现代替)接缝   工作,并且可能对您的服务器的影响小于删除   整个提供者会。这是你如何做到的:

<cfset objSecurity = createObject("java", "java.security.Security") />
<cfset storeProvider = objSecurity.getProvider("JsafeJCE") />
<cfset dhKeyAgreement = storeProvider.getProperty("KeyAgreement.DiffieHellman")>
<!--- dhKeyAgreement=com.rsa.jsafe.provider.JSA_DHKeyAgree --->
<cfset storeProvider.remove("KeyAgreement.DiffieHellman")>

Do your http call, but pack the key agreement if you want:

<cfset storeProvider.put("KeyAgreement.DiffieHellman", dhKeyAgreement)>
     

我通过使用SSLSocketFactory来创建https来解决这个问题   连接,在堆栈跟踪中提供了更多细节,而不是   使用cfhttp时:

yadayadayada Caused by: java.security.InvalidKeyException: Cannot
build a secret key of algorithm TlsPremasterSecret at
com.rsa.jsafe.provider.JS_KeyAgree.engineGenerateSecret(Unknown
Source) at javax.crypto.KeyAgreement.generateSecret(DashoA13*..) at
com.sun.net.ssl.internal.ssl.DHCrypt.getAgreedSecret(DHCrypt.java:166)
     

如果从ColdFusion抛出的异常少一点,那将会很棒   通用的。

答案 1 :(得分:3)

您是否将其添加到正确的密钥库?请记住,ColdFusion使用它自己的Java实例。在记住这个事实之前,我曾花了几个小时的时间。你想要的是/ ColdFusion8 / runtime / jre / lib / security /

答案 2 :(得分:3)

特定于coldfusion 8与具有现代ssl密码的网络服务器:

我在JDK 1.6.45上使用coldfusion 8并且在给我红色十字架而不是图像时遇到问题,而且cfhttp也无法使用ssl连接到本地网络服务器。

我的测试脚本用coldfusion 8重现

<CFHTTP URL="https://www.onlineumfragen.com" METHOD="get" ></CFHTTP>
<CFDUMP VAR="#CFHTTP#">

这给了我一个非常一般的错误:“I / O例外:对等体未经过身份验证”。 然后我尝试将服务器的证书(包括根证书和中间证书)添加到java密钥库以及coldfusion密钥库,但没有任何帮助。 然后我用

调试了问题
java SSLPoke www.onlineumfragen.com 443

得到了

javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair

Caused by: java.security.InvalidAlgorithmParameterException: Prime size must be
multiple of 64, and can only range from 512 to 1024 (inclusive)
    at com.sun.crypto.provider.DHKeyPairGenerator.initialize(DashoA13*..)
    at java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:627)
    at com.sun.net.ssl.internal.ssl.DHCrypt.<init>(DHCrypt.java:107)
    ... 10 more

然后我认为网络服务器(在我的情况下为apache)具有非常现代的ssl密码并且是非常严格的(qualys得分+)并使用超过1024位的强diffie hellmann密钥。显然,coldfusion和java jdk 1.6.45无法管理这个。 odysee的下一步是考虑为java安装另一个安全提供程序,我决定使用充气城堡。 另见http://www.itcsolutions.eu/2011/08/22/how-to-use-bouncy-castle-cryptographic-api-in-netbeans-or-eclipse-for-java-jse-projects/

然后我下载了

bcprov-ext-jdk15on-156.jar

来自http://www.bouncycastle.org/latest_releases.html并将其安装在。{ C:\ jdk6_45 \ jre \ lib \ ext或者你的jdk在哪里,在原始安装的coldfusion 8中,它将在C:\ JRun4 \ jre \ lib \ ext下,但我使用的是位于外面的更新的jdk(1.6.45) coldfusion目录。将bcprov-ext-jdk15on-156.jar放在\ ext目录中是非常重要的(这花费了我大约两个小时和一些头发;-) 然后我编辑了文件C:\ jdk6_45 \ jre \ lib \ security \ java.security(使用wordpad而不是editor.exe!)并为新提供程序添加一行。之后列表看起来像

#
# List of providers and their preference orders (see above):
#
security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.2=sun.security.provider.Sun
security.provider.3=sun.security.rsa.SunRsaSign
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI

(见第1位的新人)

然后完全重启coldfusion服务。 你可以

java SSLPoke www.onlineumfragen.com 443 (or of course your url!)

享受这种感觉...... 而且当然

一个晚上什么一天。希望这将有助于(部分或全部)到那里的人。如果您有任何疑问,请将信息邮寄给我...(上面的域名)。

答案 3 :(得分:2)

在CMD中试试这个

<强> C:\ ColdFusion9 \运行时\ JRE \ BIN&GT; keytool -import -keystore ../lib/security/cacerts  -alias uniquename -file certificatename.cer

注意:我们必须选择安全文件夹中存在的正确密钥库,因为bin中存在其他密钥库文件。如果我们将证书导入这些密钥存储区,它将无法工作。

答案 4 :(得分:0)

我刚发现的内容在本文中被引用:http://kb2.adobe.com/cps/400/kb400977.html以及经过大量挖掘后的其他一些地方。

如果您正在查看本文,您很可能在正确的根位置插入了“server.crt”证书,并且您可能已将其插入/ ColdFusion9 / runtime / jre / lib / security中的cacerts文件中使用命令

\ColdFusion9\runtime\jre\bin\keytool -import -v -alias someServer-cert -file someServerCertFile.crt -keystore cacerts -storepass changeit

(如果你还没有这样做,现在就去做)。 我遇到的是我在我的localhost上设置了ssl所以在执行这些步骤后我仍然遇到同样的错误。

事实证明,您还需要使用命令

将“server.crt”插入通常位于/ ColdFusion9 / runtime / jre / lib中的“trustStore”文件中。
\ColdFusion9\runtime\jre\bin\keytool -import -v -alias someServer-cert -file someServerCertFile.cer -keystore trustStore -storepass changeit

希望这会节省一些时间。

答案 5 :(得分:0)

我正在使用JRun。在尝试了很多不同的事情后,我遇到了一些适用于我的设置的信息片段。我已经使用自己的信任库文件配置了(1)HTTPS SSLService。这导致以下链接中的信息变得重要。

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

  

注意:如果您使用JRun作为底层J2EE服务器(或者   服务器配置或带有JRun配置的Multiserver / J2EE)   并且已经为内部JRun Web服务器(JWS)启用了SSL   需要将证书导入到中定义的信任库   安全JWS的jrun.xml文件而不是JRE密钥库。通过   默认情况下,该文件名为“trustStore”,通常位于此位置   在带有JRun配置的Multiserver / J2EE的jrun_root / lib下   或cf_root / runtime / lib用于ColdFusion Server配置。您   使用相同的Java keytool来管理trustStore。

以下是我的jrun.xml文件的摘录:

<service class="jrun.servlet.http.SSLService" name="SSLService">
  <attribute name="port">8301</attribute>
  <attribute name="keyStore">/app/jrun4/cert/cfusion.jks</attribute>
  <attribute name="trustStore">/app/jrun4/cert/truststore.jks</attribute>
  <attribute name="name">SSLService</attribute>
  <attribute name="bindAddress">*</attribute>
  <attribute name="socketFactoryName">jrun.servlet.http.JRunSSLServerSocketFactory</attribute>
  <attribute name="interface">*</attribute>
  <attribute name="keyStorePassword">cfadmin</attribute>
  <attribute name="deactivated">false</attribute>
</service>

将证书导入此信任库(/app/jrun4/cert/truststore.jks)后,重新启动ColdFusion后就可以了。


(1)http://helpx.adobe.com/legacy/kb/ssl-jrun-web-server-connector.html

答案 6 :(得分:0)

在CF9 Enterprise上,将证书添加到密钥库并不适用于我。

使用CFX标记CFX_HTTP5结束。

答案 7 :(得分:0)

我意识到这是一个非常古老的讨论,但是由于它仍然出现在寻找CF中“对等未认证”错误的顶部附近,因此我想向大多数人分享这个简单的解决方案是要更新CF使用的JVM 。 (稍后会详细介绍如何操作。)

问题的原因通常是服务BEING CALLED进行了更改,从而需要更高版本的TLS或SSL(可能还更改了受支持的算法)。较新的JVM提供了,而较早的JVM不提供。由于CF在JVM上运行,因此CF的调用(va cfhttp,cfldap,cfmail等)“突然”开始失败。

并且可以肯定的是,有时需要进行证书更新(即使如此,您也必须仔细进行),但这并不是始终需要的。并且更新JVM在错误修复等方面也带来了其他好处。

唯一的挑战是知道您的CF版本将支持哪种JVM。 (但是,即使仍然使用旧CF版本运行的人也发现,更新JVM CF使用可以解决此问题,并且不会引起任何其他问题。)

我将在2019年的一篇文章中讨论所有这些问题

https://coldfusion.adobe.com/2019/06/error-calling-cf-via-https-solved-updating-jvm/

希望可以帮助某人。