web-dev-qa-db-ja.com

認識されないSSLメッセージ、プレーンテキスト接続?例外

私はネット上の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サーバーに接続するためにローカルマシンまたはポートを設定する方法はありますか?

132
karthi

これは、クライアントマシンとの間で確立された接続が安全ではないためと考えられます。

これは、あなたがHTTPSサーバーではなくHTTPサーバーと話しているという事実によるものです。おそらくHTTPSに正しいポート番号を使用していません。

194
user207421
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
16
Thobith

プロキシ経由でPOST要求を実行する前に、会社のファイアウォールにログインするのを忘れたときに同じエラーメッセージが表示されました。

8
Jay

私は同じエラーを受けました。これは、httpを使用してhttpsポートにアクセスしていたためです。httpをhttpsに変更すると問題は解決しました。

3
Soumyajit Swain

後で誰かに役立つかもしれないので答えとしてこれを追加する。

私はエラーを解決するためにjvmにIPv4スタックを使わせる必要がありました。私のアプリケーションは以前は会社のネットワーク内で動作していましたが、自宅から接続している間に同じ例外が発生しました。関与しているプロキシはありません。 jvm引数-Djava.net.preferIPv4Stack=trueを追加し、すべてのhttpsリクエストは正常に動作していました。

1
basiljames

Jdevelopr 11.1.1.7 IDEでビルドされたJavaアプリケーションからも同じ問題に直面します。私はこの問題をプロキシフォームプロジェクトプロパティの使用のチェックを外して解決しました。

プロジェクトプロパティ - >(左から)実行/デバッグ/プロファイル - >右パネルからクリック(編集) - >左パネルからツール設定 - >(プロキシ使用)オプションのチェックを外します。

1
Salman

キャメルメールコンポーネントを使用して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:[email protected]&amp;password=mypw&amp;[email protected]&amp;debugMode=true&amp;mail.smtp.starttls.enable=true"/>
</route>
0

Gmailを使用しているとき、私はこの例外に直面していました。

Gmailを使用するには、「安全性の低いアプリを許可する」をオンにする必要がありました。

このGmail設定は、gmailアカウントにログインした後の https://www.google.com/settings/security/lesssecureapps にあります。

0
Jose1755

これでうまくいきました。Googleアカウントの設定を次のように変更しました。

        System.out.println("Start");
        final String username = "[email protected]";
        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("[email protected]"));//formBean.getString("fromEmail")
            message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("[email protected]"));
            message.setSubject("subject");//formBean.getString(
            message.setText("mailBody");
            transport.connect();
            transport.send(message, InternetAddress.parse("[email protected]"));//(message);

            System.out.println("Done");

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

        }

同じポストのこの link でプログラムを実行している間にSSLとTSLを有効にしましたが。私は多くの時間を費やしていますが、このリンクに気付いて見つけました。そして、Googleで次の2つの手順と制御の設定を行いました。 :

  • 2段階認証(パスワードとOTP)を無効にします

  • 安全性の低いアプリへのアクセスを許可することを有効にする(安全性の低いアプリを許可する:ON。

これで、上記のプログラムを使用してメールを送信できるようになりました。

0
Laxman G

EJPが言ったように、それは非httpsプロトコルへの呼び出しのために示されたメッセージです。 HTTPSであることが確実な場合は、バイパスプロキシ設定を確認し、WebサービスのホストURLをバイパスプロキシリストに追加してください。

0

あなたが春を使ってローカルで走っているならば、私は使用を提案するでしょう:

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

接続がFTPSテストの場合

FTPSClient ftpClient = new FTPSClient(プロトコル、false);

protocol = TLS、SSL、およびfalse = isImplicit。

0
Faxon