Artikel ini terutama membahas solusi untuk pengembangan Java dari permintaan HTTPS SSL yang tidak dipercaya. Analisis spesifik dan kode implementasi adalah sebagai berikut.
Saat meminta tautan HTTPS dalam kode Java, kesalahan berikut dapat dilaporkan
javax.net.ssl.sslhandshakeException: sun.security.validator.validatorException: pembangunan jalur pkix gagal: sun.security.provider.certpath.suncertpathBuilderException: Tidak dapat menemukan jalur sertifikasi yang valid ke meminta target yang diminta diminta target yang diminta untuk diminta target yang diminta untuk meminta target yang diminta untuk diminta target
Alasannya adalah tidak ada sertifikat. Tidak apa -apa menggunakan URL untuk mengaksesnya langsung di browser. Browser seharusnya menyimpan sertifikat .cer yang sesuai sebelumnya.
Ada dua solusi: memperoleh sertifikat yang valid dari mesin target atau mengabaikan masalah kepercayaan sertifikat.
1. Dapatkan sertifikat yang valid untuk mesin target
1. Kompilasi dan instal program sertifikat javac installcert.java (kode sebagai berikut)
/ * * Hak Cipta 2006 Sun Microsystems, Inc. Semua hak dilindungi undang -undang. * * Redistribusi dan penggunaan dalam bentuk sumber dan biner, dengan atau tanpa * modifikasi, diizinkan dengan ketentuan bahwa kondisi berikut * dipenuhi: * * - Redistribusi kode sumber harus mempertahankan pemberitahuan hak cipta di atas, daftar kondisi ini dan penafian berikut. * * - Redistribusi dalam bentuk biner harus mereproduksi pemberitahuan hak cipta di atas, daftar kondisi ini dan pengungkapan berikut dalam * dokumentasi dan/atau bahan lain yang disediakan dengan distribusi. * * - Baik nama Sun Microsystems maupun nama -nama * kontributornya tidak dapat digunakan untuk mendukung atau mempromosikan produk yang diturunkan * dari perangkat lunak ini tanpa izin tertulis sebelumnya. * * Perangkat lunak ini disediakan oleh pemegang hak cipta dan kontributor "sebagai * adalah" dan jaminan tersurat atau tersirat, termasuk, tetapi tidak terbatas pada, * jaminan tersirat dari dapat diperjualbelikan dan kebugaran untuk tujuan * tertentu ditolak. Dalam hal apa pun pemilik hak cipta atau * kontributor tidak akan bertanggung jawab atas kerusakan langsung, tidak langsung, insidental, khusus, * teladan, atau konsekuensial (termasuk, tetapi tidak terbatas pada, * pengadaan barang atau layanan pengganti; hilang Perangkat lunak * ini, bahkan jika disarankan tentang kemungkinan kerusakan tersebut. *// **? java.security.messagedigest; impor java.security.cert.certificateException; impor java.security.cert.x509certificate;/** * kelas yang digunakan untuk menambahkan sertifikat server ke keystore * dengan sertifikat tepercaya Anda. */kelas publik installcert {public static void main (string [] args) melempar pengecualian {string host; int port; char [] passphrase; if ((args.length == 1) || (args.length == 2)) {string [] c = args [0] .split (":"); host = c [0] [] c = args [0] .split (":"); host = c [0] 443: integer.parseint (c [1]); string p = (args.length == 1)? "ChangeIt": args [1]; passphrase = p.tochararray ();} else {System.out.println ("Penggunaan: Java Installcert <Host> [: port] [Passphrase]"); return;} File file = file baru ("jssecacerts"); if (if file. File (System.GetProperty ("java.home") + sep + "lib" + sep + "keamanan"); file = file baru (dir, "jssecacerts"); if (file.filfile () == false) {file = new file (dir, "cacerts");}}} System.out.println ("inputeam (" inpute "); FileInputStream (file); keystore ks = keystore.getInstance (keystore.getDefaultType ()); ks.load (dalam, passphrase); in.close (); sslcontext context = sslcontext.getInstance ("tls"); trustManFactory tMFF = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(ks);X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);context.init(null, new TrustManager [] {tm}, null); sslsocketfactory factory = context.getSocketFactory (); System.out.println ("Koneksi pembukaan ke" + host + ":" + port + "(soket soket) (sslsocket) factory.createsocket (soket soket) (sslsocket) factory.createsocket (hostsocket) (sslsocket) factory. {System.out.println ("Mulai jabat tangan SSL ..."); socket.starthandshake (); socket.close (); System.out.println (); System.out.println ("Tidak ada kesalahan, sertifikat sudah dipercaya");} tangkapan (sslexception e)) {System.out.println();e.printStackTrace(System.out);}X509Certificate[] chain = tm.chain;if (chain == null) {System.out.println("Could not obtain server certificate chain");return;}BufferedReader reader = new BufferedReader(new InputStreamReader (System.in)); System.out.println (); System.out.println ("Server Terkirim" + Chain.Length + "Certificate (S):"); System.out.println (); MessageDigest sha1 = MessageDigest.getInstance ("sha1"); messageDigest sha1 = messageDigest.getInstance ("sha1"); messageDigest sha1 = messageDigest.getInstance ("" sha1 "); messageDigest sha1 = messageDigest.getInstance (" "sha1"); messageDigest sha1 = messageDigest.getInstance ("" sha1 "); messageDigest sha1 = messageDigest. (int i = 0; i <chain.length; i ++) {x509certificate cert = rantai [i]; System.out.println ("" + (i + 1) + "subjek" + cert.getsubjectdn ()); System.out.println ("penerbit" + cert.getissuerdn ()); sha1.update (cert.getEncoded ()); System.out.println ("sha1" + tohexstring (sha1.digest ())); md5.update (cert.getencoded ()); System.out.println ("md5" + tohexstring (md5.gigest ())); System.out.println ();} System.out.println ("Masukkan sertifikat untuk ditambahkan ke keystore tepercaya atau 'q' untuk berhenti: [1]"); string line = reader.readline (). trim (); int k; coba {k = (line.longe. 0 : Integer.parseint(line) - 1;}catch (NumberFormatException e) {System.out.println("KeyStore not changed");return;}X509Certificate cert = chain[k];String alias = host + "-" + (k + 1);ks.setCertificateEntry(alias, cert);OutputStream out = new FileOutputStream ("jssecacerts"); ks.store (out, passphrase); out.close (); System.out.println (); System.out.println (sertifikat); System.out.println (); System.out.println (); System.out.println (); System.out.println (); System.out.println (); System.oUrtln (); System.out.println. 'jssecacerts' menggunakan alias '" + alias +"' ");} private static final char [] hexdigits =" 0123456789abcdef ".tochararray (); string statis private (byte [] bytes) {stringbuilder sb = for -string: byte byte) {stringbuilder sb = forate = byte (byte [] bytes) {stringbuilder sb = string = fored (byte [] bytes) {stringbuilder sb = fORTBET; bytes) {b & = 0xff; sb.append (hexdigits [b >> 4]); sb.append (hexdigits [b & 15]); sb.append ('');} return sb.tostring ();} private static class havingtrustManager menerapkan x50trustManRing {private -class savingTrustManager private -x. chain;SavingTrustManager(X509TrustManager tm) {this.tm = tm;}public X509Certificate[] getAcceptedIssuers() {throw new UnsupportedOperationException();}public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {throw new UnsportedOperationException ();} public void checkSertrusted (x509certificate [] rantai, string authtype) melempar sertifikatException {this.chain = rantai; tm.CheckSertrusted (rantai, authtype);}}} 2. Jalankan Program Sertifikat Instalasi untuk menghasilkan sertifikat
java InstallCert my.hoolai.com
Misalnya: java InstalCert smtp.zhangsan.com:465 admin Jika nomor port kata sandi dan host tidak ditambahkan, nomor port default yang diberikan dalam program perolehan sertifikat di atas adalah: 443, dan kata sandi adalah: ubah
3. Menurut informasi prompt operasi, masukkan 1 dan masukkan, dan hasilkan sertifikat bernama: jssecacerts di direktori saat ini.
Tempatkan sertifikat di direktori $ java_home/jre/lib/keamanan, ingatlah bahwa JRE JDK adalah lingkungan yang digunakan oleh proyek! Lai Lai
atau:
System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts证书路径");
Anda dapat mengubah kata sandi dan menjalankan perintah di direktori keamanan
keytool -storepasswd -new xxxcom -keystore cacerts
Anda dapat memodifikasi kata sandi dan menggunakan perintah setelah memodifikasinya
keytool -list -v -keystore cacerts
Saat melihat informasi file, itu akan meminta Anda memerlukan kata sandi untuk melihatnya. Jika kata sandi input cocok dengan kata sandi yang dimodifikasi, itu berarti bahwa modifikasi telah berhasil.
PS: Pada titik ini, Anda dapat berhasil menggunakan SSL. Selain itu, berdasarkan file jssecacerts yang dihasilkan sekarang, Anda dapat menghasilkan file CER.
Perintahnya adalah sebagai berikut
keytool -export -alias xxx.com-1 -keystore jssecacerts -rfc -file xxx.cer
Seperti disebutkan di atas, alias penamaan default di kelas alat sebelumnya adalah menambahkan "-1". Set kata sandi menggunakan InstallCert harus sama dengan kata sandi dalam file cachert.
Jika Anda telah memodifikasi kata sandi, Anda perlu memodifikasi string kata sandi yang sesuai di kelas InstallCert, jika tidak, pengecualian berikut akan:
java.security.UnrecoverableKeyException: Password verification failed
2. Abaikan masalah kepercayaan sertifikat
Kode Sumber: http://mengyang.iteye.com/blog/575671
Pastikan untuk mencatat bahwa Anda perlu memanggil metode yang dijelaskan dalam artikel sebelum koneksi dibuat, seperti ini:
trustAllHttpScertificates (); hostNamEverifier hv = hostnameverifier baru () {public boolean verifikasi (string urlhostname, sesi sslsession) {return true; }}; Httpsurlconnection.setDefaulthostnameverifier (hv); koneksi = (httpurlConnection) url.openconnection ();OK, kedua metode telah dicoba dan dikerjakan.
Meringkaskan
Di atas adalah seluruh konten artikel ini tentang solusi untuk masalah permintaan HTTPS yang tidak dipercayai SSL di Java. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!