인식 할 수없는 SSL 메시지, 일반 텍스트 연결? 예외


172

net에서 https 서버와 통신하기 위해 Java 호환 패키지가 있습니다. 컴파일을 실행하면 다음 예외가 발생합니다.

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)

클라이언트 컴퓨터와의 연결이 안전하지 않기 때문입니다. 원격 https 서버에 연결하기 위해 로컬 시스템을 구성 할 수있는 방법이 있습니까?

답변:


238

클라이언트 컴퓨터와의 연결이 안전하지 않기 때문입니다.

HTTPS 서버가 아닌 HTTP 서버와 통신하고 있기 때문입니다. 아마도 HTTPS에 올바른 포트 번호를 사용하지 않았을 것입니다.


7
동일한 오류가 발생하여 https 대신 http를 사용하기 시작했을 때 해결되었습니다. 그러나 https로 브라우저에 링크를 넣으면 작동합니다! 안전한 쿼리를 수행해야합니다. 문제를 어떻게 해결할 수 있습니까?
— ccoutinho

9
@rsy 'https로 링크를 배치했을 때'브라우저가 포트 443으로 변경되었을 것입니다. 당신도 똑같이 할 수 있습니다. HttpURLConnection포트를 전혀 지정하지 않으면 실제로 자동으로 처리합니다.
— Lorne의 후작

서버의 모든 포트를 HTTPS로 설정할 수 있다고 가정합니다. 특정 포트 일 필요는 없습니까?

1
@KarlSherwin 예약에 따라 원하는 포트가 될 수 있지만 443이 아닌 경우 모든 URL에서 주변을 카트로 가져와야합니다.
— Lorne의 후작

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

메일 서버에 접속하고 새 연결을 설정하는 로컬 SMTP 도메인 이름이 있어야하며 아래 프로그래밍에서 SSL 특성을 변경해야합니다.

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

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

10
SMTP가 아니라 HTTPS를 사용하고 있습니다. -1
— Lorne의 후작

2
제 경우에는 효과가있었습니다. 감사합니다! javax.mail.MessagingException : SMTP 호스트에 연결할 수 없습니다 : mail.livemusicgo.com, 포트 : 25; 중첩 예외는 다음과 같습니다. javax.net.ssl.SSLException : 인식 할 수없는 SSL 메시지, 일반 텍스트 연결?
— surfealokesea

1
@surfealokesea 질문은 HTTP와 HTTPS에 관한 것이며 SMTP에 대한 답변이나 개인적인 경험은 관련이 없습니다.
— Lorne의 후작

1
예. 그러나 이것은 그에게만 해당되는 것이 아니며 동일한 '인식되지 않은 ssl 메시지'를 가진 다른 사용자를위한 것입니다. +1 당신에게, Thobith
— sam1370

9

프록시를 통해 POST 요청을 수행하기 전에 회사 방화벽에 로그인하는 것을 잊었을 때 동일한 오류 메시지가 나타납니다.


나는 회사 안에 있었지만 똑같이해야했다!
— MonoThreaded

1
어떻게 해결해야하는지 간단히 설명해 주시겠습니까? 저의 회사에서도 같은 문제에 직면했습니다.
— Nitesh

3

같은 오류가 발생했습니다. http를 사용하여 https 포트에 액세스했기 때문입니다. http를 https로 변경하면 문제가 해결되었습니다.


11
아니요, HTTPS를 통해 HTTP 포트에 액세스 할 때 오류가 발생했습니다. 오류 메시지를 읽으십시오. 일반 텍스트 대상에 연결했습니다. SSL을 사용하지 않았기 때문에 설명 한 상황에서 SSLException이 발생하지 않았을 것입니다.
— Lorne의 후작

1

Jdevelopr 11.1.1.7 IDE에 내장 된 Java 응용 프로그램에서 동일한 문제가 발생합니다. 프록시 양식 프로젝트 속성 사용을 선택 취소하여 문제를 해결했습니다.

다음에서 찾을 수 있습니다 : 프로젝트 속성-> (왼쪽 창에서) 실행 / 디버그 / 프로필-> 오른쪽 패널에서 클릭 (편집)-> 왼쪽 패널에서 도구 설정-> (프록시 사용) 옵션을 선택 취소하십시오.


1

나중에 누군가에게 도움이 될 수 있으므로 이것을 답변으로 추가하십시오.

jvm이 IPv4 스택을 사용하여 오류를 해결하도록 강요했습니다. 내 응용 프로그램은 회사 네트워크 내에서 작동했지만 집에서 연결하는 동안 동일한 예외가 발생했습니다. 프록시가 필요하지 않습니다. jvm 인수를 추가했으며 -Djava.net.preferIPv4Stack=true모든 https요청이 정상적으로 작동했습니다.


1

스프링을 사용하여 로컬을 실행하는 경우 사용을 제안합니다.

@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();
}

단위 테스트를 사용하여 작동합니다.

도움이 되길 바랍니다!


0

그것은 지금 나를 위해 일했습니다. 아래와 같이 Google 계정 설정을 변경했습니다.

        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);

        }

동일한 게시물 의이 링크 에서 프로그램을 실행하는 동안 SSL 및 TSL을 활성화했지만 나는 많은 시간을 소비하지만이 링크를 깨닫고 발견 한 것보다. 그리고 Google에서 2 단계를 수행하고 제어를 설정했습니다. :

  • 2 단계 인증 비활성화 (암호 및 OTP)

  • 보안 수준이 낮은 앱에 액세스 할 수 있도록 설정 (보안 수준이 낮은 앱 허용 : ON )

이제 위의 프로그램을 사용하여 메일을 보낼 수 있습니다.


3
문제는 HTTPS에 관한 것입니다.
— Lorne의 후작

0

EJP가 말했듯이, 비 https 프로토콜에 대한 호출로 인해 표시되는 메시지입니다. HTTPS인지 확실하면 바이 패스 프록시 설정을 확인하고 웹 서비스 호스트 URL을 바이 패스 프록시 목록에 추가하는 경우


0

연결이 FTPS 테스트 인 경우 :

FTPSClient ftpClient = 새로운 FTPSClient (프로토콜, 거짓);

프로토콜 = TLS, SSL 및 false = isImplicit.



0

매우 중요한 답변이 있습니다 :

API URL 문자열 (메서드에서)을 https에서 http로 변경하기 만하면됩니다.이 또한 원인 일 수 있습니다.

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

대신에

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

-1

같은 문제가 발생하여 시스템 속성에서 "proxyUser"및 "proxyPassword"를 설정하여 해결했습니다.

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

"proxyHost"및 "proxyPort"와 함께

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

그것이 효과가 있기를 바랍니다.


Apache HTTP 클라이언트를 사용 중이고 권한 부여 예외가있는 경우 작동합니다. OP에 명시된 문제를 해결하는 것은 효과 가 없습니다 .
— Lorne의 후작

-1

포트 25와 팔로 잉을 사용하여 문제를 해결했습니다.

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

-1

당신이 실행중인 경우

  • Cisco AnyConnect Secure Mobility Agent
  • Cisco AnyConnect 웹 보안 에이전트

서비스를 중지하십시오.

왜이 답변에 대해 투표권을 얻었는지 잘 모르겠습니다. 회사 네트워크에서 이것은 문제에 대한 해결책입니다.


-1

낙타 메일 구성 요소를 사용하여 gmail smtp로 전자 메일을 보내는 비슷한 오류가 있습니다.

솔루션은 아래와 같이 TLS 포트 (587)에서 SSL 포트 (465)로 변경되었습니다.

<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>

아니요, 솔루션이 일반 텍스트 포트 로 변경되었습니다 .
— Lorne의 후작

-2

Java 6 또는 이전 버전의 명령 행에서 Java 프로세스를 실행중인 경우이 스위치를 추가하면 위의 문제가 해결되었습니다.

-Dhttps.protocols = "TLSv1"


-3

기본 인증이 만료되었을 수 있습니다. 관리 콘솔을 통해 갱신하려면 "보안> SSL 인증서 및 키 관리> 키 저장소 및 인증서> NodeDefaultKeyStore> 개인 인증서"로 이동하여 "기본"별명을 선택하고 "갱신"을 클릭 한 후 WAS를 다시 시작하십시오.


1
만료 된 인증서는이 예외를 발생시키지 않습니다.
— Lorne의 후작

-3

또 다른 이유는 "액세스 거부"일 수 있습니다. 어쩌면 내부 네트워크 액세스에 대한 URI 및 액세스 차단 응답 페이지에 액세스 할 수 없습니다. 응용 프로그램 영역에 방화벽 규칙이 필요한지 확실하지 않으면 터미널, 명령 줄에서 연결을 시도하십시오. GNU / Linux 또는 Unix의 경우이 명령과 같이 실행하면 규칙 또는 실제 원격 주소 차단 결과가 나오는 것을 확인할 수 있습니다.echo | nc -v yazilimcity.net 443


어떤 종류의 페이지를 받으면 SSL 부분이 완벽하게 작동하고 OP에서 인용 한 예외를 얻지 못했을 것입니다.
— Lorne의 후작

SSL 페이지의 어떤 종류의 페이지도 수신하지 않고 특별 준비된 페이지 인 내부 네트워크 HTTP 응답을 받았습니다. 이 시나리오에서는 HTTPS 요청을 통해 HTTP 페이지에 액세스하므로이 예외를 받았습니다. 네트워크 규칙이 변경된 후이 예외도 자체 해결되었습니다.
— oguzhankinik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.