¿Mensaje SSL no reconocido, conexión de texto sin formato? Excepción


172

Tengo un paquete compatible con Java para hablar con el servidor https en la red. Ejecutar la compilación da la siguiente excepción:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
    at com.sun.net.ssl.internal.ssl.InputRecord.handleUnknownRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.InputRecord.read(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)

Creo que esto se debe a que la conexión establecida con la máquina cliente no es segura. ¿Hay alguna forma de configurar la máquina o los puertos locales para conectarse al servidor https remoto?

Respuestas:


239

Creo que esto se debe a que la conexión establecida con la máquina cliente no es segura.

Se debe al hecho de que está hablando con un servidor HTTP, no con un servidor HTTPS. Probablemente no utilizó el número de puerto correcto para HTTPS.


77
Tengo el mismo error y resolví cuando comencé a usar http en lugar de https. Pero cuando coloco el enlace en el navegador con https, ¡funciona! Y necesito realizar una consulta segura. ¿Alguna idea sobre cómo puedo resolver el problema?
ccoutinho

9
@rsy Cuando 'colocaste el enlace ... con https', el navegador habría cambiado al puerto 443 por ti. Puedes hacer lo mismo tú mismo. Indeed lo HttpURLConnectionhará automáticamente por usted, si no especifica un puerto en absoluto.
Marqués de Lorne

Supongo que puede configurar cualquier puerto en su servidor para que sea HTTPS, ¿no tiene que ser un puerto específico?

1
@KarlSherwin Puede ser cualquier puerto que desee, sujeto a reservas, pero si no es 443, tendrá que cargarlo a su alrededor en todas sus URL.
Marqués de Lorne

18
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

Debe tener un nombre de dominio SMTP local que se pondrá en contacto con el servidor de correo y establecerá una nueva conexión, también debe cambiar la propiedad SSL en su programación a continuación

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection

 props.put("mail.smtp.socketFactory.fallback", "true"); // Should be true

10
Él está hablando HTTPS, no SMTP. -1
Marqués de Lorne

2
En mi caso eso funcionó, gracias! javax.mail.MessagingException: no se pudo conectar al host SMTP: mail.livemusicgo.com, puerto: 25; la excepción anidada es: javax.net.ssl.SSLException: ¿Mensaje SSL no reconocido, conexión de texto sin formato?
surfealokesea

1
@surfealokesea La pregunta es sobre HTTP y HTTPS, y una respuesta o una experiencia personal sobre SMTP no es relevante.
Marqués de Lorne

1
Sí, pero esto no es solo para él, es para otros usuarios que tienen este mismo 'mensaje ssl no reconocido'. +1 para ti, Thobith
sam1370

9

Recibí el mismo mensaje de error cuando olvidé iniciar sesión en el firewall de la compañía, antes de realizar una solicitud POST a través de un proxy.


¡Tenía que hacer lo mismo aunque estaba dentro de la empresa!
MonoThreaded

1
¿podría explicarme brevemente cómo resolverlo? Yo también enfrento el mismo problema en mi empresa ahora mismo
Nitesh

3

Tengo el mismo error. fue porque estaba accediendo al puerto https usando http .. El problema se resolvió cuando cambié http a https.


11
No, recibió el error al acceder al puerto HTTP a través de HTTPS. Lee el mensaje de error. Se conectó a un objetivo de texto sin formato. La situación que describió no habría causado una excepción SSLE, ya que no habría estado utilizando SSL.
Marqués de Lorne

1

Me enfrento al mismo problema con la aplicación Java integrada en Jdevelopr 11.1.1.7 IDE. Resolví el problema desmarcando el uso de las propiedades del proyecto de formulario proxy.

Puede encontrarlo en lo siguiente: Propiedades del proyecto -> (desde el panel izquierdo) Ejecutar / Depurar / Perfil -> Haga clic (editar) en el panel derecho -> Configuración de herramienta desde el panel izquierdo -> desactive la opción (Usar proxy).


1

Agregar esto como respuesta, ya que podría ayudar a alguien más tarde.

Tuve que forzar a jvm a usar la pila IPv4 para resolver el error. Mi aplicación solía funcionar dentro de la red de la empresa, pero mientras se conectaba desde casa daba la misma excepción. No hay proxy involucrado. Se agregó el argumento jvm -Djava.net.preferIPv4Stack=truey todas las httpssolicitudes se comportaron normalmente.


1

Si está ejecutando local usando Spring, le sugiero que use:

@Bean
public AmazonDynamoDB amazonDynamoDB() throws IOException {
    return AmazonDynamoDBClientBuilder.standard()
            .withCredentials(
                    new AWSStaticCredentialsProvider(
                            new BasicAWSCredentials("fake", "credencial")
                    )
            )
            .withClientConfiguration(new ClientConfigurationFactory().getConfig().withProtocol(Protocol.HTTP))
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("localhost:8443", "central"))
            .build();
}

A mí me funciona usando la prueba unitaria.

Espero que sea de ayuda!


0

Funcionó para mí ahora, he cambiado la configuración de mi cuenta de Google de la siguiente manera:

        System.out.println("Start");
        final String username = "myemail@gmail.com";
        final String password = "************";

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "465");
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

         Session session = Session.getInstance(props,
                  new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password);
                    }
                  });


        try {
            Transport transport=session.getTransport();
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("myemail@gmail.com"));//formBean.getString("fromEmail")
            message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("myemail@gmail.com"));
            message.setSubject("subject");//formBean.getString(
            message.setText("mailBody");
            transport.connect();
            transport.send(message, InternetAddress.parse("myemail@gmail.com"));//(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            System.out.println("e="+e);
            e.printStackTrace();
            throw new RuntimeException(e);

        }

Aunque he habilitado SSL y TSL mientras ejecuto el programa en este enlace de la misma publicación. Paso mucho tiempo pero me di cuenta y encontré este enlace. Y hecho 2 pasos siguientes y control de configuración en google. :

  • Deshabilite la verificación en dos pasos (contraseña y OTP)

  • Habilitación para permitir el acceso a aplicaciones menos seguras ( Permitir aplicaciones menos seguras: ON ) .

Ahora puedo enviar correos usando el programa anterior.


3
La pregunta es sobre HTTPS.
Marqués de Lorne

0

Como dijo EJP, es un mensaje que se muestra debido a una llamada a un protocolo que no es https. Si está seguro de que es HTTPS, verifique la configuración del proxy de omisión y, en caso de que agregue la URL del host del servicio web a la lista de proxy de omisión


0

si la conexión es la prueba FTPS:

FTPSClient ftpClient = nuevo FTPSClient (protocolo, falso);

protocolo = TLS, SSL y falso = isImplicit.



0

AQUÍ UNA RESPUESTA MUY IMPORTANTE:

Simplemente cambie la cadena de URL de su API (en su método) de https a http .. Esto también podría ser la causa:

client.resource("http://192.168.0.100:8023/jaxrs/tester/tester");

en vez de

client.resource("https://192.168.0.100:8023/jaxrs/tester/tester");

-1

Recibí el mismo problema y se resolvió configurando "proxyUser" y "proxyPassword" en las propiedades del sistema.

System.setProperty("http.proxyUser", PROXY_USER);
System.setProperty("http.proxyPassword", PROXY_PASSWORD);

junto con "proxyHost" y "proxyPort"

System.setProperty("http.proxyHost", PROXY_ADDRESS);
System.setProperty("http.proxyPort", PROXY_PORT);

Espero que funcione.


Funcionará si está utilizando el cliente HTTP Apache y obtuvo una excepción de autorización. Será no trabajar para resolver el problema planteado por la OP.
Marqués de Lorne

-1

Resolví mi problema usando el puerto 25 y siguiendo el accesorio

mailSender.javaMailProperties.putAll([
                "mail.smtp.auth": "true",
                "mail.smtp.starttls.enable": "false",
                "mail.smtp.ssl.enable": "false",
                "mail.smtp.socketFactory.fallback": "true",
        ]);

-1

En caso de que estés corriendo

  • Agente de movilidad segura de Cisco AnyConnect
  • Agente de seguridad web de Cisco AnyConnect

intente detener los servicios.

No estoy seguro de por qué obtuve un voto negativo por esta respuesta. En nuestra red corporativa, esta es la solución al problema.


-1

Tengo un error similar al usar el componente de correo de camello para enviar correos electrónicos por gmail smtp.

La solución estaba cambiando del puerto TLS (587) al puerto SSL (465) de la siguiente manera:

<route id="sendMail">
  <from uri="jason:toEmail"/>
  <convertBodyTo type="java.lang.String"/>
  <setHeader headerName="Subject"><constant>Something</constant></setHeader>
  <to uri="smtps://smtp.gmail.com:465?username=myemail@gmail.com&amp;password=mypw&amp;to=someemail@gmail.com&amp;debugMode=true&amp;mail.smtp.starttls.enable=true"/>
</route>

No, la solución estaba cambiando a un puerto de texto sin formato .
Marqués de Lorne

-2

Si está ejecutando el proceso Java desde la línea de comandos en Java 6 o anterior, agregar este interruptor resolvió el problema anterior para mí:

-Dhttps.protocols = "TLSv1"


-3

Tal vez su certificado predeterminado ha expirado. para renovarlo a través de la consola de administración, vaya a "Seguridad> Certificado SSL y administración de claves> Almacenes de claves y certificados> NodeDefaultKeyStore> Certificados personales", seleccione el alias "predeterminado" y haga clic en "renovar" después de reiniciar WAS.


1
Un certificado caducado no causa esta excepción.
Marqués de Lorne

-3

Otra razón es tal vez "acceso denegado", tal vez no pueda acceder al URI y reciba la página de respuesta de bloqueo para el acceso a la red interna. Si no está seguro de que su zona de aplicación necesita una regla de firewall, intente conectarse desde la terminal, línea de comando. Para GNU / Linux o Unix, puede intentar ejecutar este comando y ver que el resultado proviene de una regla de bloqueo o una dirección realmente remota:echo | nc -v yazilimcity.net 443


Si recibió algún tipo de página, la parte SSL funcionaba perfectamente y no habría obtenido la excepción citada por el OP.
Marqués de Lorne

No estoy recibiendo ningún tipo de página de la parte SSL, recibí una respuesta HTTP de red interna en esa página preparada especial. Para este escenario, estoy accediendo a la página HTTP a través de la solicitud HTTPS, así que recibí esta excepción. Después de que la regla de red cambia, esta excepción también se resuelve automáticamente.
oguzhankinik
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.