2011-12-20 2 views
3

У нас есть приложение, которое использует клиентскую библиотеку JAX-RPC и работает на устаревшей версии Java (1.4.2) и получают следующее сообщение об ошибке SSL:Java NoClassDefFoundError С SSL Connection

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. Это отлично работает, если вы работаете против Java 1.6, но, к сожалению, работающая на нем система пока еще привязана к Java 1.4.

Кроме того, наш код JAX-RPC и аутентификация он работает правильно, если мы подключаемся к нашим системам разработки без SSL.

[edit - дополнительная информация] Теперь я вижу, что существует конфликт, связанный с новыми версиями BouncyCastle, чтобы вызвать проблему. Я пробовал использовать старую версию (1.18), и, похоже, я не получаю ошибку SSL, но вместо этого получаю ее от нашего приложения, потому что для нее требуются более новые алгоритмы.

+0

Вы можете взглянуть на файлы политики безопасности JRE (% JAVA_HOME%/JRE/Библиотека/безопасность/java.security и java.policy), чтобы увидеть классы используются Java 1.4 ... возможно, сертификат SSL использует какой-то новый Cypher, который не был доступен для Java 1.4, и вы можете найти это, посмотрев разницу между классами, которые использует Java. – Renato

+0

Вы убедились, что используете библиотеку BouncyCastle для Java 1.4 (она поставляется в разных сборках для той же самой версии самой библиотеки). – Bruno

+1

Да, у меня есть библиотека 1.4. – Michael

ответ

1

Итак, после долгих исследований я, наконец, обнаружил, что глубоко в нашем коде мы вставили поставщик BC как поставщик число 1.

Security.insertProviderAt(prov, 1); 

Вместо того чтобы делать что изменения просто добавив поставщик исправило проблему.

Security.addProvider(prov); 
0

javax.crypto.Cipher находится в отдельной (от rt.jar) файл JAR называется jce.jar. Может быть, загрузчик классов не находит этот файл или нет разрешений на чтение, установленных в этом файле для вашего рабочего сервера приложений.

+2

'NoClassDefFoundError' означает, что он может найти класс, но не классы, которые импортируются этим классом. Таким образом, он нашел класс «Cipher». Вы неправы. – gigadot

+0

Хорошая точка. Я думал, что шифр был в сообщении об исключении. В любом случае проблема может быть вызвана некоторым другим, связанным с безопасностью файлом jar. –

+1

После нескольких экспериментов с вещами, которые я нашел, это определенно связано с нашей библиотекой BouncyCastle. Я переключился на (действительно) старую версию, которую мы использовали раньше, и больше не получал эту ошибку, но вместо этого получал ошибки, которые я ожидал бы получить от нашего приложения в старой библиотеке. По крайней мере, это какой-то прогресс! – Michael