Подтвердить что ты не робот

SunTlsRsaPremasterSecret KeyGenerator недоступен

Я столкнулся с ошибкой, когда мое приложение пытается загрузить класс поставщика алгоритма RSA из JAVA. Стек исключения выглядит следующим образом:

javax.jms.JMSException: RSA premaster secret error
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49)
at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1255)
at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1350)
at org.apache.activemq.ActiveMQConnection.setClientID(ActiveMQConnection.java:388)
at com.trendmicro.tmsm.TMSMAgent.open(TMSMAgent.java:63)

Caused by: javax.net.ssl.SSLKeyException: RSA premaster secret error
at com.sun.net.ssl.internal.ssl.RSAClientKeyExchange.<init>(RSAClientKeyExchange.java:97)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:634)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:226)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:623)
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
at org.apache.activemq.transport.tcp.TcpBufferedOutputStream.flush(TcpBufferedOutputStream.java:115)
at java.io.DataOutputStream.flush(DataOutputStream.java:106)
at org.apache.activemq.transport.tcp.TcpTransport.oneway(TcpTransport.java:167)
at org.apache.activemq.transport.InactivityMonitor.oneway(InactivityMonitor.java:237)
at org.apache.activemq.transport.WireFormatNegotiator.sendWireFormat(WireFormatNegotiator.java:168)
at org.apache.activemq.transport.WireFormatNegotiator.sendWireFormat(WireFormatNegotiator.java:84)
at org.apache.activemq.transport.WireFormatNegotiator.start(WireFormatNegotiator.java:74)
at org.apache.activemq.transport.failover.FailoverTransport.doReconnect(FailoverTransport.java:715)
at org.apache.activemq.transport.failover.FailoverTransport$2.iterate(FailoverTransport.java:115)
at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:122)
at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:43)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:637)

Caused by: java.security.NoSuchAlgorithmException: SunTlsRsaPremasterSecret KeyGenerator not available
at javax.crypto.KeyGenerator.<init>(DashoA13*..)
at javax.crypto.KeyGenerator.getInstance(DashoA13*..)
at com.sun.net.ssl.internal.ssl.JsseJce.getKeyGenerator(JsseJce.java:223)
at com.sun.net.ssl.internal.ssl.RSAClientKeyExchange.<init>(RSAClientKeyExchange.java:89)
... 22 more

Я отправил сообщение об ошибке в googled, и большинство сообщений говорит об этом, потому что JVM не может найти sunjce_provider.jar. Однако я могу найти файл в папке /Library/Java/Home/lib/ext.

Платформа Mac OS X 10.6 и версия Java 1.6.0_17.

Мои вопросы:

  • Почему JVM не ищет /Library/Java/Home/lib/ext для файлов jar?
  • Можно ли изменить свойство CLASSPATH или java.ext.dirs, изменив любой файл конфигурации?
  • Любое предложение решить эту проблему?

Спасибо заранее.

4b9b3361

Ответ 1

Я думаю, что мы находим основную причину, так что вот ответ моего собственного вопроса.

  • Системное свойство Java "java.ext.dirs" в Mac OS X 10.5: /Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/ext. Файл sunjce_provider.jar должен находиться в /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/ext, но также может быть найден в/Library/Java/Extensions/в проблеме mac.

  • sunjce_provider.jar в/Library/Java/Extensions/принадлежит Java Cryptography Extension (JCE) 1.2.2, который был установлен на Mac. JCE 1.2.2 является дополнительным пакетом J2SE 1.3.1 и может не содержать достаточно библиотек для J2SE 1.4 и более поздних версий.

  • Java-приложение работает нормально после того, как все jar файлы JCE 1.2.2 были удалены из /Library/Java/Extensions/.

Ответ 2

У меня была такая же проблема после перехода на новую версию Java на Mac. Мой (maven) проект работал нормально из командной строки, но получил сообщение "SunTlsRsaPremasterSecret" в Eclipse.

Решение заключалось в том, чтобы удалить установленные JRE в конфигурации Eclipse и добавить их снова (с помощью кнопки "Поиск..." ).

Ответ 3

имел аналогичную проблему. Добавление classpath в каталог ext исправило это для меня. Это исправление работало для меня в Windows 7 с java 1.6

java -Djava.ext.dirs=lib -classpath "%java_home%\lib\ext\*" myapp.jar 

Ответ 4

Это случилось со мной при запуске сервера tomcat из eclipse. Я решил это, изменив конфигурацию в Windows → Настройки → Java → Установленные JREs → Редактировать. Мне пришлось обновить все системные библиотеки JRE соответствующими банками из папок в папке

  • % JAVA_HOME%/JRE/Library/вн
  • % JAVA_HOME%/JRE/Library/

Кажется, что после последнего обновления я изменил JRE_Home, но забыл эти библиотеки.

введите описание изображения здесь

Ответ 5

У меня также была эта проблема, заметили, что проблема была в моей конфигурации Eclipse.

Window > Preferences > Java > Installed JREs > jdk8_64bit > Edit...

Путь моего sunjce_provider.jar указывал на jdk8_64bit\lib\ext\sunjce.provider.jar. Он должен указывать на эквивалент JRE в jdk8_64bit\jre\lib\ext\sunjce.provider.jar.

Ответ 6

Пришлось потратить почти целый день на это, пытаясь использовать JavaMail в Eclipse Luna. Пробовал все подходы, предлагаемые на разных форумах, но не повезло.

Выкопанный в полный поток и нашел исключение, возникающее из-за класса на BootClassPath

from KeyAgreement.getInstance() → JceSecurity.canUseProvider() → JceSecurity.getVerificationResult() → JarVerifier.verify()

void verify()         бросает JarException, IOException       {    if (jarURL == null) {      throw new JarException ( "Класс находится на пути bootclass" );    }.......

Я удалил банку sunjce_provider из папки\ext\и теперь могу отправить почту. Это может быть неправильно, но по крайней мере быстрое решение.

Обратитесь Ошибка Eclipse.

Ответ 7

Я знаю, я присоединяюсь поздно здесь. Но для меня эта ошибка возникла внезапно, как только я изменил Предпочтение → Java → Установленные JREs → Среды выполнения с JavaSE-1.8 на путь jdk1.8. Но это должен быть путь jre1.8.

Я не знаю, почему это происходит сейчас. Но это решило проблему.