java - SSLHandShakeException 没有合适的协议(protocol)

标签 java ssl bufferedreader

我最近在我的网站上添加了 SSL,可以通过 https 访问它。现在,当我的 Java 应用程序尝试向我的网站发出请求并使用缓冲读取器从中读取时,它会生成此堆栈跟踪

我没有使用自签名证书,该证书来自 Namecheap,他使用 COMODO SSL 作为 CA 来签署我的证书。我正在使用 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();
    }

}

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

    }
}

我很难过,任何帮助将不胜感激!

最佳答案

$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 之后/在 jre1.8.0_181 中启用了这一行。

我的 Java 版本是“1.8.0_201。

关于java - SSLHandShakeException 没有合适的协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38205947/

相关文章:

java - 如何检测文件已从 br.readline() 循环中删除

java - 识别字符串中单词的第一个字符

java - 客户端-服务器应用程序 : can't connect to java server from android mobile phone

c# - 使用 HttpClientCertificate 与 X509Certificate2 检查证书有效性

java - 如何拆分同一列上的日期和时间并将它们存储在 ArrayList 中?

java - 从网页源读取随机失败 - Java

简化代码时Java切换错误

java - 根据文本字段中的文本从数据库填充 jcombobox

ssl - AlphaSSL - "CA Bundle does not match the certificate"- 在 CPanel 中

ssl - 使用 HTTPS 调用 REST 服务的 Oracle BPEL (Java 8U92) 会产生 SSL 握手异常