CFX抛出错误:“;java.io.IOException:HTTPS主机名错误“;

CFX抛出错误:“;java.io.IOException:HTTPS主机名错误“;,java,coldfusion,Java,Coldfusion,我开发了一个JavaCFX标记,用于ColdFusion 10。 有一个Java类获取一个URL作为参数,它应该返回该URL后面的网站内容 我们正在使用https协议,我需要忽略证书错误。因此,我实施了此处建议的解决方案: 我已经按照Adobe推荐的方式测试了我的方法: 一切正常 但是,当我将CFX标记附加到ColdFusion实例并尝试从ColdFusion使用它时,我会出现如下错误: java.io.IOException:HTTPS主机名错误 我的问题是,为什么?调试我的CFX标记不会显示

我开发了一个JavaCFX标记,用于ColdFusion 10。 有一个Java类获取一个URL作为参数,它应该返回该URL后面的网站内容

我们正在使用https协议,我需要忽略证书错误。因此,我实施了此处建议的解决方案:

我已经按照Adobe推荐的方式测试了我的方法:

一切正常

但是,当我将CFX标记附加到ColdFusion实例并尝试从ColdFusion使用它时,我会出现如下错误:

java.io.IOException:HTTPS主机名错误

我的问题是,为什么?调试我的CFX标记不会显示错误,但在ColdFusion中使用它会带来错误。对我来说,ColdFusion似乎在运行时覆盖了我的一些类声明。有人有什么想法吗?这种现象已知吗?还有其他人经历过这种奇怪的行为吗?还是我做错了什么

为了理解我的问题,这里还有一些事实:

  • 操作系统:Suse Linux企业服务器
  • CF:ColdFusion 10多服务器
  • Java开发环境:NetBeans 7.1.2
  • CF的开发环境:ColdFusion Builder 2.1
一些用于演示的源代码:

...
url = new URL("https://domainname/path/file.type");
HostnameVerifier hv = new HostnameVerifier() {
    @Override
    public boolean verify(String urlHostName, SSLSession ssls) {
       System.out.println("Warning: URL HOST: " + urlHostName + " vs. " + ssls.getPeerHost());
        return true;
    }
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
URLConnection conn = url.openConnection();
...(Do something)...
问题:

  • 用主方法去毛刺效果很好
  • 以同样的方式在ColdFusion中使用CFX标记也会失败

好的,我终于成功地让它工作了-以下是方法:

首先,我重建了一些代码,如下所示

SSLContext sc = SSLContext.getInstance("SSLv3");
sc.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
SSLContext.setDefault(sc);

URL url = new URL(URLStr);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
/**
* Create our own hostname verifier which always returns true
* to guarantee that our certificates are accepted
*/
conn.setHostnameVerifier(new HostnameVerifier(){
@Override
public boolean verify(String string, SSLSession ssls) {
    return true;
}
});
DefaultTrustManager内容如下:

 private static class DefaultTrustManager implements X509TrustManager { 
@Override public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} 
@Override public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} 
@Override public X509Certificate[] getAcceptedIssuers() { 
return null; 
} 
}
如您所见,我已将自己的HostnameVerifier设置为具体连接(conn.setHostNameVerifier()),而不是默认设置。此外,我必须 将url.openConnection转换为HttpsURLConnection

到目前为止。然后再一次-调试器像一个魔咒一样工作,Cfx部署在CF服务器上-什么也没发生,只是日志中出现了奇怪的错误:

"Error","ajp-bio-8013-exec-1","12/07/12","16:53:07","sys_bdr","com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl cannot be cast to javax.net.ssl.HttpsURLConnection The specific sequence of files included or processed is: /path/to/test/file/test.cfm, line: 61 "
 java.lang.ClassCastException: com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl cannot be cast to javax.net.ssl.HttpsURLConnection
最后一个问题可以通过使用下面描述的解决方案来解决:

ColdFusion需要使用另一个JVM参数启动:

-Djava.protocol.handler.pkgs=javax.net.ssl


总之:这里有一些编码问题,可以修复,另外还有一个缺少的ColdFusion JVM参数。

你也尝试过imran tariq的解决方案吗?这与
有什么不同?@Travis更改某种主机文件对我来说不是解决方案,因为我想知道,为什么ColdFusion会这样做。@JamesMohler最初的意图是,cfhttp像。。。好吧,这是没有选择的,因为有四件事:1。使用cfhttp时,CPU使用率增加到非常高的级别2。除了线程之外,我还构建了cfhttp,但它没有多大帮助。3.cfhttp从服务器获取数据时速度非常慢,即使两台服务器位于同一网络中。4.因此,我用Java构建了我自己的cfhttp,而且,获取数据的速度提高了40倍(!!)