gpt4 book ai didi

java - CFX 抛出错误 : "java.io.IOException: HTTPS hostname wrong"

转载 作者:行者123 更新时间:2023-12-01 15:00:14 26 4
gpt4 key购买 nike

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

我们正在使用 https 协议(protocol),我需要忽略证书错误。因此,我实现了此处建议的解决方案:HTTPS hostname wrong: should be . What causes this?

我已经按照 Adob​​e 推荐的方式测试了我的方法:Approaches to debugging Java CFX tags

一切正常。

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

java.io.IOException: HTTPS hostname wrong

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

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

  • 操作系统:Suse Linux Enterprise Server
  • 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)...

问题:

  • 使用 main 方法进行调试效果很好
  • 以同样的方式在 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-Server 上 - 没有任何反应,但日志中出现奇怪的错误:

"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/

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

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

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

关于java - CFX 抛出错误 : "java.io.IOException: HTTPS hostname wrong",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13761859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com