인식 할 수없는 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.