2011-12-20 17 views
3

で私たちは、JAX-RPCのクライアントライブラリを使用するとJavaのレガシーバージョン(1.4.2)上で実行されていると、次のSSLエラーを受信して​​いるアプリケーションがあります。JavaのNoClassDefFoundErrorがSSL接続

java.lang.NoClassDefFoundError 
    javax.crypto.Cipher.a(DashoA6275) 
    javax.crypto.Cipher.getInstance(DashoA6275) 
    com.sun.net.ssl.internal.ssl.SunJSSE_i.a(DashoA12275) 
    com.sun.net.ssl.internal.ssl.CipherBox$JCECipherBox.<init>(DashoA12275) 
    com.sun.net.ssl.internal.ssl.CipherRC4.a(DashoA12275) 
    com.sun.net.ssl.internal.ssl.SunJSSE_h.a(DashoA12275) 
    com.sun.net.ssl.internal.ssl.CipherSuite$BulkCipher.a(DashoA12275) 
    com.sun.net.ssl.internal.ssl.SunJSSE_ax.c(DashoA12275) 
    com.sun.net.ssl.internal.ssl.SSLSocketImpl.f(DashoA12275) 
    com.sun.net.ssl.internal.ssl.SunJSSE_ax.a(DashoA12275) 
    com.sun.net.ssl.internal.ssl.SunJSSE_az.j(DashoA12275) 
    com.sun.net.ssl.internal.ssl.SunJSSE_az.a(DashoA12275) 
    com.sun.net.ssl.internal.ssl.SunJSSE_az.a(DashoA12275) 
    com.sun.net.ssl.internal.ssl.SunJSSE_ax.a(DashoA12275) 
    com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA12275) 
    com.sun.net.ssl.internal.ssl.SSLSocketImpl.j(DashoA12275) 
    com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(DashoA12275) 
    sun.net.www.protocol.https.HttpsClient.afterConnect(DashoA12275) 
    sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(DashoA12275) 
    sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:569) 
    sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(DashoA12275) 
    com.sun.xml.rpc.client.http.HttpClientTransport.writeMessageToConnection(HttpClientTransport.java:278) 
    com.sun.xml.rpc.client.http.HttpClientTransport.invoke(HttpClientTransport.java:64) 
    com.sun.xml.rpc.client.StreamingSender._send(StreamingSender.java:69) 
    [ ... trace continues into internal application code ... ] 

これを以前は私たちのために働いていました。クライアントライブラリの唯一の変更は、使用された認証プロトコルに関連するものであり、BouncyCastleの最新ビルドへの更新が必要でした。これらの変更はすべてSSLプロトコルよりも高いレベルであり、このエラーはBouncyCastleに関係していないようです。

これまでにこのようなエラーが発生したことがありましたら、ぜひご意見やご提案をお持ちですか? cacertsに証明書を追加しようとしました。残念ながら、これを実行している本稼動システムはJava1.4にまだ当てられていますが、これはJava 1.6に対して実行するとうまくいきます。

また、SSLを使用しない開発システムに接続すると、JAX-RPCコードと認証が正しく機能します。

[編集 - 追加情報]問題の原因となるBouncyCastleの新しいバージョンでいくつかの競合が発生していることがわかりました。私は古代(1.18)のバージョンを使用しようとしましたが、私はSSLエラーを取得しないようですが、より新しいアルゴリズムが必要なため、アプリケーションから1つを取得します。

+0

あなたはJREセキュリティポリシーファイルを見てすることをお勧めします(%JAVA_HOME%/ JRE/libに/セキュリティ/ java.securityおよびjava.policyの)クラスは、Java 1.4で使用されて参照するには...おそらく、SSL証明書はJava 1.4で利用できなかった新しいCypherを使用しているかもしれません。Javaが使用しているクラスの違いを見れば、それを見つけることができます。 – Renato

+0

Java 1.4用のBouncyCastleライブラリを使用していることを確認しましたか(これは、同じバージョンのライブラリ自体に対してさまざまなビルドで提供されています)。 – Bruno

+1

はい、1.4のライブラリがあります。 – Michael

答えて

1

ので、多くの研究の後、私は最終的に深いが、我々のコードで、我々は、プロバイダ番号1

Security.insertProviderAt(prov, 1); 

だけではなく、プロバイダを追加するために変更することで問題を修正しましたことをやってBCプロバイダを挿入することを発見しました。

Security.addProvider(prov); 
0

javax.crypto.Cipherjce.jarと呼ばれる別個の(からrt.jarの)JARファイルに配置されています。おそらく、クラスローダーがこのファイルを見つけられなかったり、実稼働アプリケーションサーバー用にこのファイルに読み取りアクセス権が設定されていない可能性があります。

+2

'NoClassDefFoundError'は、クラスを見つけることができますが、そのクラスによってインポートされたクラスは見つけることができないことを意味します。したがって、 'Cipher'クラスが見つかりました。あなたは間違っている。 – gigadot

+0

良い点。私はCipherが例外のメッセージに入っていると思った。とにかく、この問題は他のセキュリティ関連のjarファイルによって引き起こされる可能性があります。 –

+1

私が見つけたことをもう少し試してみると、BouncyCastleライブラリには間違いなく関連しています。前に使用した(実際には)古いバージョンに戻ってしまい、そのエラーを受け取らなくなりました。代わりに古いライブラリでアプリケーションから受け取ると予想されるエラーを受け取ります。少なくともそれはいくつかの進歩です! – Michael