最近、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) {
}
}
私は困惑し、どんな助けでも大歓迎です!
protocol is disabled or cipher suites are inappropriate
問題の鍵はその声明にあります。基本的には次のいずれかです。
これにより、TLSでハンドシェイクが失敗し、接続が失敗します。上記の3つのシナリオの1つまたはすべてを確認してください。
$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。