web-dev-qa-db-ja.com

SSLHandShakeException適切なプロトコルがありません

最近、SSLをウェブサイトに追加しました。https経由でアクセスできます。ここで、私のJavaアプリケーションが私のWebサイトにリクエストを作成し、バッファ付きリーダーで読み取ろうとすると、このスタックトレースが生成されます

自己署名証明書を使用していません。証明書は、私の証明書に署名するCAとしてCOMODO SSLを使用するNamecheapからのものです。 im Java 8

javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
at Sun.security.ssl.Handshaker.activate(Handshaker.Java:503)
at Sun.security.ssl.SSLSocketImpl.kickstartHandshake(SSLSocketImpl.Java:1482)
at Sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1351)
at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1403)
at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1387)
at Sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.Java:559)

私のコードは非常に基本的で、バッファ付きリーダーを使用して自分のサイトのページを読み取ろうとします

 private void populateDataList() {
    try {
        URL url = new URL("https://myURL.com/Data/Data.txt");
        URLConnection con = url.openConnection();
        con.setRequestProperty("Connection", "close");
        con.setDoInput(true);
        con.setUseCaches(false);

        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String line;
        int i = 0;
        while((line = in.readLine()) != null) {
            this.url.add(i, line);
            i++;
        }
    }   catch (Exception e) {
        e.printStackTrace();
    }

}

私は自分のSSL証明書をJVMのキーストアに追加しようとしました。また、このコードを使用してすべての証明書(私が知っているSSLの目的に反する)を受け入れようとしました

 private void trustCertificate() {
    TrustManager[] trustAllCerts = new TrustManager[] {
            new X509TrustManager() {
                public Java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
                public void checkClientTrusted(
                        Java.security.cert.X509Certificate[] certs, String authType) {
                }
                public void checkServerTrusted(
                        Java.security.cert.X509Certificate[] certs, String authType) {
                }
            }
    };
    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new Java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (GeneralSecurityException e) {
    }
    try {
        URL url = new URL("https://myURL.com/index.php");
        URLConnection con = url.openConnection();
        BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String line;
        while((line = br.readLine()) != null) {
            System.out.println(line);
        }

    } catch (Exception e) {

    }
}

私は困惑し、どんな助けでも大歓迎です!

10
ChrisianBartram
protocol is disabled or cipher suites are inappropriate

問題の鍵はその声明にあります。基本的には次のいずれかです。

  1. クライアントが使用するTLS実装は、サーバーの証明書が使用する暗号スイートをサポートしていません。
  2. サーバーのTLS構成で、クライアントがサポートする暗号スイートが無効になっています。
  3. クライアントのTLS構成は、サーバーが提供する暗号スイートを無効にします。
  4. クライアントとサーバー間のTLSバージョンの非互換性。

これにより、TLSでハンドシェイクが失敗し、接続が失敗します。上記の3つのシナリオの1つまたはすべてを確認してください。

4
automaton

$JRE/lib/security/Java.security

jdk.tls.disabledAlgorithms=SSLv3, TLSv1, RC4, DES, MD5withRSA, DH keySize < 1024, \
EC keySize < 224, 3DES_EDE_CBC, anon, NULL

この行は有効になっています。この行をコメントにした後、すべてが正常に動作しています。どうやらjre1.8.0_181の前後で、この行は有効になっています。

私のJavaバージョンは "1.8.0_201。

2
wwjih123