我开发了一个用于ColdFusion 10的Java CFX标记。 有一个Java类,它获取一个URL作为param,并且应该返回该URL后面的网站内容。
我们正在使用https协议,我需要忽略证书错误。因此,我已经实现了这里建议的解决方案:HTTPS hostname wrong: should be . What causes this?
我已经按照Adobe推荐的方式测试了我的方法:Approaches to debugging Java CFX tags
一切正常。
但是当我将我的CFX标签附加到我的ColdFusion实例并尝试从ColdFusion中使用它时,我将变成这样的错误:
java.io.IOException:HTTPS主机名错误
我的问题是,为什么?调试我的CFX标签没有显示错误,但在ColdFusion中使用它会带来该错误。对我来说,看起来ColdFusion会在运行时覆盖我的一些类声明。有没有人有想法?这种现象是否已知?还有其他人经历过这种奇怪的行为吗?或者我得错了什么?
要理解我的问题,还有一些事实:
用于演示目的的一些源代码:
...
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)...
问题:
答案 0 :(得分:1)
好的,最后我设法让它工作 - 这是如何:
首先,我重建了一些代码,如下所示。
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。
到目前为止。然后再次 - 调试器就像一个魅力,部署在CF-Server上的Cfx - 没有任何反应,但日志中的奇怪错误:
"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
使用此处描述的解决方案可以解决最后一个问题:http://danwatt.org/2012/06/making-java-coldfusion-tomcat-and-payflowpro-play-nicely/
需要使用另一个JVM参数启动ColdFusion:
-Djava.protocol.handler.pkgs=javax.net.ssl
总之:这里有一些编码问题,可以修复,另外还有一个缺少的ColdFusion JVM参数。