Saya memutakhirkan dari Java 1.6 ke Java 1.7 hari ini. Sejak itu terjadi kesalahan ketika saya mencoba membuat koneksi ke server web saya melalui SSL:
javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name
at sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1288)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1904)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1027)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1262)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1289)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1273)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:523)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1296)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at java.net.URL.openStream(URL.java:1035)
Ini kodenya:
SAXBuilder builder = new SAXBuilder();
Document document = null;
try {
url = new URL(https://some url);
document = (Document) builder.build(url.openStream());
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(DownloadLoadiciousComputer.class.getName()).log(Level.SEVERE, null, ex);
}
Ini hanya proyek pengujian, itulah sebabnya saya mengizinkan dan menggunakan sertifikat yang tidak dipercaya dengan kode:
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
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("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
Logger.getLogger(DownloadManager.class.getName()).log(Level.SEVERE, null, e);
}
Saya berhasil mencoba terhubung ke https://google.com . dimana salahku?
Terima kasih.
Saya memiliki apa yang saya yakini masalah yang sama. Saya menemukan bahwa saya perlu menyesuaikan konfigurasi Apache untuk memasukkan ServerName atau ServerAlias untuk host.
Kode ini gagal:
Dan kode ini berfungsi:
Wireshark mengungkapkan bahwa selama TSL / SSL Hello Alert peringatan (Level: Peringatan, Deskripsi: Nama Tidak Dikenali), Server Hello sedang dikirim dari server ke klien. Itu hanya peringatan, namun, Java 7.1 kemudian segera merespons kembali dengan "Fatal, Deskripsi: Pesan Tak Terduga", yang saya anggap berarti perpustakaan SSL Java tidak suka melihat peringatan nama yang tidak dikenal.
Dari Wiki di Transport Layer Security (TLS):
112 Hanya TLS peringatan nama yang tidak dikenal; Indikator Nama Server klien menentukan nama host yang tidak didukung oleh server
Ini mengarahkan saya untuk melihat file konfigurasi Apache saya dan saya menemukan bahwa jika saya menambahkan ServerName atau ServerAlias untuk nama yang dikirim dari sisi klien / java, itu berfungsi dengan benar tanpa kesalahan.
sumber
ServerAlias
berfungsi untuk saya. Saya telah melihat peringatan TLS yang sama di Wireshark.ServerName
s, Apache merespons denganunrecognized_name
peringatan (yang juga bisa menjadi peringatan fatal ). RFC 6066 dengan tepat mengatakan ini pada topik ini: " TIDAK DIREKOMENDASIKAN untuk mengirimkan peringatan tingkat-tingkat yang tidak dikenal (112), karena perilaku klien dalam menanggapi peringatan tingkat peringatan tidak dapat diprediksi. ". Satu-satunya kesalahan yang dilakukan oleh karyawan ini adalah menganggap bahwa ini adalah peringatan fatal . Ini adalah bug JRE sama seperti bug Apache.Anda dapat menonaktifkan pengiriman catatan SNI dengan properti System jsse.enableSNIExtension = false.
Jika Anda dapat mengubah kode, sebaiknya gunakan
SSLCocketFactory#createSocket()
(tanpa parameter host atau dengan soket yang terhubung). Dalam hal ini tidak akan mengirim indikasi server_name.sumber
System.setProperty ("jsse.enableSNIExtension", "false");
-Djsse.enableSNIExtension=false
. Tapi apa lagi fungsinya? Apakah itu berbahaya bagi keamanan Jawa lainnya?Kami juga mengalami kesalahan ini pada build server Apache baru.
Memperbaiki dalam kasus kami adalah untuk mendefinisikan
ServerAlias
dihttpd.conf
yang sesuai dengan nama host yang mencoba terhubung ke Jawa. KamiServerName
ditetapkan ke nama host internal. Sertifikat SSL kami menggunakan nama host eksternal, tetapi itu tidak cukup untuk menghindari peringatan.Untuk membantu debug, Anda dapat menggunakan perintah ssl ini:
openssl s_client -servername <hostname> -connect <hostname>:443 -state
Jika ada masalah dengan nama host itu, maka itu akan mencetak pesan ini di dekat bagian atas output:
SSL3 alert read: warning:unrecognized name
Saya juga harus mencatat bahwa kami tidak mendapatkan kesalahan itu ketika menggunakan perintah itu untuk terhubung ke nama host internal, meskipun itu tidak cocok dengan sertifikat SSL.
sumber
openssl
. Ini sangat membantu.SSL3 alert read: warning:unrecognized name
? Saya melihat lansiran dicetak, tetapi hasilnya tidak membantu saya untuk benar-benar melihat perbedaan penamaan iniOpenSSL 1.0.1e-fips 11 Feb 2013
,OpenSSL 1.0.2k-fips 26 Jan 2017
danLibreSSL 2.6.5
.Alih-alih mengandalkan mekanisme host virtual default di apache, Anda dapat menentukan satu virtualhost catchall terakhir yang menggunakan ServerName sewenang-wenang dan wildcard ServerAlias, misalnya
Dengan cara itu Anda dapat menggunakan SNI dan apache tidak akan mengirim kembali peringatan SSL.
Tentu saja, ini hanya berfungsi jika Anda dapat menggambarkan semua domain Anda dengan mudah menggunakan sintaks wildcard.
sumber
*.mydomain.com
sintaks untuk ServerAlias. Perhatikan bahwa Anda dapat menambahkan beberapa alias menggunakanServerAlias
, misalnyaServerAlias *.mydomain.com mydomain.com *.myotherdomain.com
.Itu harus bermanfaat. Untuk mencoba lagi kesalahan SNI di Apache HttpClient 4.4 - cara termudah yang kami buat (lihat HTTPCLIENT-1522 ):
dan
dan
sumber
verifyHostname(sslsock, target)
diSSLConnectionSocketFactory.createLayeredSocket
? Karenatarget
diubah menjadi string kosong,verifyHostname
tidak akan berhasil. Apakah saya melewatkan sesuatu yang jelas di sini?Menggunakan:
sumber
Mengalami masalah ini dengan spring boot dan jvm 1.7 dan 1.8. Pada AWS, kami tidak memiliki opsi untuk mengubah ServerName dan ServerAlias agar sesuai (mereka berbeda) sehingga kami melakukan yang berikut:
Di build.gradle kami menambahkan yang berikut:
Itu memungkinkan kami untuk mengatasi masalah dengan "Nama Tidak Dikenal".
sumber
Sayangnya, Anda tidak dapat memasok properti sistem ke alat jarsigner.exe.
Saya telah mengirimkan defect 7177232 , mereferensikan defect @eckes 7127374 dan menjelaskan mengapa itu ditutup karena kesalahan.
Cacat saya secara khusus tentang dampak pada alat jarsigner, tapi mungkin itu akan menyebabkan mereka membuka kembali cacat lainnya dan mengatasi masalah dengan benar.
PEMBARUAN: Sebenarnya, Anda BISA memasok properti sistem ke alat Jarsigner, hanya saja tidak ada dalam pesan bantuan. Menggunakan
jarsigner -J-Djsse.enableSNIExtension=false
sumber
Saya mengalami masalah yang sama dan ternyata reverse dns tidak diatur dengan benar, itu menunjuk ke nama host yang salah untuk IP. Setelah saya memperbaiki dns terbalik dan memulai kembali httpd, peringatan itu hilang. (jika saya tidak memperbaiki dns terbalik, menambahkan ServerName juga membantu saya)
sumber
Saya
VirtualHost
'sServerName
itu komentar secara default. Itu bekerja setelah komentar.sumber
Jika Anda membangun klien dengan Resttemplate, Anda hanya dapat mengatur titik akhir seperti ini: https: // IP / path_to_service dan mengatur requestFactory.
Dengan solusi ini Anda tidak perlu RESTART TOMCAT atau Apache Anda:
sumber
Saya juga menemukan masalah ini sementara meningkatkan dari Java 1.6_29 ke 1.7.
Yang mengkhawatirkan, pelanggan saya telah menemukan pengaturan di panel kontrol Java yang menyelesaikan ini.
Di Tab Tingkat Lanjut Anda dapat memeriksa 'Gunakan format ClientHello yang kompatibel dengan SSL 2.0'.
Ini sepertinya menyelesaikan masalah.
Kami menggunakan applet Java di browser Internet Explorer.
Semoga ini membantu.
sumber
Saya memiliki masalah yang sama dengan server Linux Ubuntu menjalankan subversi ketika diakses melalui Eclipse.
Itu telah menunjukkan bahwa masalahnya ada pada peringatan ketika Apache (re) mulai:
Ini karena entri baru
ports.conf
, di manaNameVirtualHost
arahan lain dimasukkan di samping arahan dalamsites-enabled/000-default
.Setelah menghapus arahan dalam
ports.conf
, masalah telah hilang (setelah me-restart Apache, tentu saja)sumber
Tambahkan saja solusinya di sini. Ini mungkin membantu bagi pengguna LAMP
Baris yang disebutkan di atas dalam konfigurasi virtual host adalah penyebabnya.
Konfigurasi Host Virtual ketika kesalahan
Konfigurasi Kerja
sumber
Berikut ini adalah solusi untuk Appache httpclient 4.5.11. Saya punya masalah dengan cert yang telah ditandai wildcarded
*.hostname.com
. Itu mengembalikan saya pengecualian yang sama, tapi saya tidak menggunakan penonaktifan oleh propertiSystem.setProperty("jsse.enableSNIExtension", "false");
karena itu membuat kesalahan pada klien lokasi Google.Saya menemukan solusi sederhana (hanya memodifikasi soket):
sumber
Ada cara yang lebih mudah di mana Anda bisa menggunakan HostnameVerifier Anda sendiri untuk mempercayai koneksi tertentu secara implisit. Masalahnya datang dengan Java 1.7 di mana ekstensi SNI telah ditambahkan dan kesalahan Anda adalah karena kesalahan konfigurasi server.
Anda dapat menggunakan "-Djsse.enableSNIExtension = false" untuk menonaktifkan SNI di seluruh JVM atau membaca blog saya di mana saya menjelaskan cara menerapkan verifikasi kustom di atas koneksi URL.
sumber