0

ColdFusion 10 で使用する Java CFX タグを開発しました。パラメータとして URL を取得し、その URL の背後にある Web サイトのコンテンツを返す Java クラスがあります。

https プロトコルを使用しており、証明書エラーを無視する必要があります。そのため、ここで提案されているソリューションを実装しました: HTTPS ホスト名が間違っています: する必要があります。これは何が原因ですか?

Adobe がここで推奨する方法でメソッドをテストしました: Java CFX タグのデバッグへのアプローチ

すべて正常に動作します。

しかし、CFX タグを ColdFusion インスタンスにアタッチして ColdFusion から使用しようとすると、次のようなエラーが発生します。

java.io.IOException: HTTPS ホスト名が間違っています

私の質問は、なぜですか?CFX タグをデバッグしてもエラーは表示されませんが、ColdFusion で使用するとエラーが発生します。私にとっては、ColdFusion が実行時にクラス宣言の一部を上書きしているように見えます。誰かアイデアはありますか?この現象は知られていますか?他の誰かがその奇妙な行動を経験しましたか? それとも私は何か間違っていますか?

ここで私の問題を理解するために、いくつかの事実があります:

  • OS: 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 タグを使用すると失敗します。
4

1 に答える 1

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 にキャストする必要があります。

ここのところ。そして再び - デバッガーは魔法のように動作し、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 パラメータが欠落しています。

于 2012-12-10T12:04:06.033 に答える