2010-05-20 26 views
10

Encontré un error cuando mi aplicación intenta cargar una clase de proveedor de Algoritmo RSA de JAVA. La pila de excepción es la siguiente:SunTlsRsaPremasterSecret KeyGenerator no disponible

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 el mensaje de error y la mayoría de los mensajes dice que es porque JVM no puede encontrar sunjce_provider.jar. Sin embargo, puedo encontrar el archivo en la carpeta/Library/Java/Home/lib/ext.

La plataforma es Mac OS X 10.6 y la versión de Java es 1.6.0_17.

Mis preguntas son:

  1. Por qué JVM no busca en/Library/Java/Home/lib/ext para los archivos jar?
  2. ¿Podemos cambiar la propiedad CLASSPATH o java.ext.dirs modificando cualquier archivo de configuración?
  3. ¿Alguna sugerencia para resolver este problema?

Gracias de antemano.

Respuesta

2

Creo que encontramos la causa raíz así que aquí está la respuesta a mi propia pregunta.

  1. los "java.ext.dirs" Java propiedad del sistema en Mac OS X 10.5 es: /Library/Java/Extensiones:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM .framework/Versions/1.6.0/Home/lib/ext. Sunjce_provider.jar debe estar en /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/ext pero también se puede encontrar en/Library/Java/Extensions/en el mac problemático.

  2. sunjce_provider.jar en/Library/Java/Extensions/pertenece a Java Cryptography Extension (JCE) 1.2.2, que se ha instalado en el mac. JCE 1.2.2 es un paquete opcional de J2SE 1.3.1 y puede no incluir suficientes bibliotecas para J2SE 1.4 y posterior.

  3. la aplicación Java funciona normalmente después de que todos los archivos jar relacionados con JCE 1.2.2 hayan sido eliminados de/Library/Java/Extensions /.

18

He tenido el mismo problema después de actualizar a la nueva versión de Java en Mac. Mi proyecto (maven) funcionó bien desde la línea de comandos pero recibí el error "SunTlsRsaPremasterSecret" en Eclipse.

La solución fue eliminar los JRE instalados en la configuración de Eclipse y agregarlos nuevamente (usando el botón "Buscar ...").

+2

Esto también funcionó para mí. Tuve que eliminar todas las entradas de JRE de Preferencias -> Java -> JRE instalados. No me permitió eliminar el último así que tuve que agregar uno con un nombre diferente y luego eliminar el original. Luego vuelve a agregarlos a todos. – Gray

+0

Tenía mi eclipse puntiagudo a una carpeta de enlace simbólico que apuntaba al JDK. Eliminar y leer las carpetas verdaderas a Eclipse resolvió el problema por mí. –

+0

Tuve el mismo problema en Eclipse Luna en Windows 7, JDK 1.8.0_05; esta solución funcionó, aunque tuve que reiniciar Eclipse después antes de que entrara en vigor. – Sbodd

6

tenía un problema similar. Agregar el classpath al directorio ext lo solucionó por mí. Esta solución funcionó para mí en Windows 7 con java 1.6

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

Gracias, hombre; ¡Salvaste mi mundo! esto también solucionó mis problemas después de un par de horas de frustraciones. – alpha

+0

Estoy enfrentando el mismo problema. ¿pueden echar un vistazo a mi publicación? http: //stackoverflow.com/questions/19432051/ssl-ioexceptionjavax-net-ssl-sslkeyexception-rsa-premaster-secret-error? noredirect = 1 # comment28809828_19432051 –

1

Me sucedió al lanzar el servidor tomcat desde eclipse. Lo resolví cambiando la configuración en Windows -> Preferencias -> Java -> JRE instalados -> Editar.Tenía que actualizar todas las bibliotecas del sistema de JRE con los frascos correspondientes de las carpetas en:

  • % JAVA_HOME%/jre/lib/ext
  • % JAVA_HOME%/jre/lib/

Parece que después de la última actualización he cambiado el JRE_Home pero olvidé esas bibliotecas.

enter image description here

0

tenido que pasar casi un día en este al intentar utilizar JavaMail en Eclipse de Luna. Ha intentado todos los enfoques sugeridos en varios foros, pero no hubo suerte.

cavado en el flujo completo y encontró la excepción que se genera debido a la Clase está en bootclasspath

de KeyAgreement.getInstance() -> JceSecurity.canUseProvider() -> JceSecurity.getVerificationResult() -> JarVerifier. verificar()

vacío verificar() tiros JarException, IOException { si (jarURL == null) {throw new JarException ("Clase está en bootclasspath"); } .......

Quité sunjce_provider jar de la carpeta \ ext \ y ahora puedo enviar el correo. Esto puede no ser correcto, pero al menos es una solución rápida.

Consulte Eclipse bug.

0

También tuve este problema, noté que el problema estaba en mi configuración de Eclipse.

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

El camino de mi sunjce_provider.jar apuntaba a jdk8_64bit\lib\ext\sunjce.provider.jar. Debe señalar el equivalente de JRE en jdk8_64bit\jre\lib\ext\sunjce.provider.jar.

Cuestiones relacionadas