Artikel ini menjelaskan metode penerapan otentikasi dua arah SSL di Java. Bagikan untuk referensi Anda, sebagai berikut:
Verifikasi SSL umum lebih umum. Hanya memverifikasi apakah server kami benar atau benar. Tentu saja, jika URL yang Anda kunjungi salah sama sekali, maka tidak ada yang bisa melakukannya. Ini disebut otentikasi satu arah SSL.
Tetapi pada kenyataannya, kami juga dapat memverifikasi apakah klien memenuhi persyaratan, yaitu, mengeluarkan sertifikat untuk masing -masing pengguna kami, dan setiap sertifikat digital unik dan bukan publik. Dengan cara ini, Anda dapat memastikan bahwa pengguna yang saat ini mengakses server saya dikenali oleh server dan tidak dapat diakses oleh orang lain.
Otentikasi dua arah memastikan bahwa baik server dan klien saling mengenali di tingkat pertama. Kemudian jika mereka ingin berkomunikasi, mereka akan melampirkan protokol SSL ke protokol komunikasi untuk memastikan bahwa konten komunikasi dienkripsi. Bahkan alat sniffer jaringan seperti sniffer melihat kode kacau. Di masa depan, saya akan menunjukkan kepada Anda apa yang Anda lihat dengan sniffer tanpa enkripsi. Saya khawatir Anda akan lebih waspada dengan cara ini.
Konten berikut dikutip dari Internet dan dimodifikasi setelah verifikasi aktual.
Skenario Simulasi:
Ketika sisi server berkomunikasi dengan sisi klien, otorisasi dan verifikasi identitas diperlukan, yaitu, klien hanya dapat menerima pesan dari server, dan server hanya dapat menerima pesan dari klien.
Teknologi Implementasi:
JSSE (ekstensi soket keamanan Java)
Ini adalah solusi yang diluncurkan oleh Sun untuk menyelesaikan komunikasi yang aman di internet. Ini mengimplementasikan protokol SSL dan TSL (Transport Layer Security). JSSE mencakup teknologi seperti enkripsi data, verifikasi server, integritas pesan dan verifikasi klien. Dengan menggunakan JSSE, pengembang dapat dengan aman mentransfer data antara klien dan server melalui protokol TCP/IP.
Untuk mengimplementasikan otentikasi pesan.
Server membutuhkan:
1) Keystore: Di mana kunci pribadi server disimpan
2) Kepercayaan Keystore: Ini menyimpan sertifikat otorisasi klien
Demikian pula, klien membutuhkan:
1) Keystore: Di mana kunci pribadi klien disimpan
2) Kepercayaan KeyStore: Di sini saya sarankan menggunakan perintah KeyTool yang dilengkapi dengan Java untuk menghasilkan file informasi tersebut. Tentu saja, OpenSSL juga merupakan pembuatan sertifikat SSL open source paling populer. OpenSSL ditulis dalam bahasa C, silang-sistem. Namun, kami dapat mempertimbangkan kenyamanan menggunakan program Java untuk menghasilkan sertifikat di masa depan, dan menggunakan keytool yang datang dengan JDK.
1) Hasilkan Kunci Pribadi Server dan Impor ke dalam File Keystore Server
KeyTool -Genkey -alias ServerKey -KeyStore kServer.keystore
Selama proses, Anda perlu mengisinya secara terpisah dan mengaturnya sesuai dengan kebutuhan Anda.
Kata sandi keystore: 123456
Nama depan dan belakang: Jin
Nama Unit Organisasi: Tidak Ada
Nama Organisasi: Tidak Ada
Nama Kota atau Wilayah: BJ
Nama Negara Bagian atau Provinsi: BJ
Kode Negara: CN
Kata sandi dari kunci pribadi serverkey tidak diisi sama dengan kata sandi keystore. Pastikan untuk memperhatikan di sini, cukup tekan ENTER tanpa mengubah kata sandi Anda. Jika tidak, jika kunci pribadi ini tidak dapat diterapkan secara langsung dalam program selanjutnya, kesalahan akan dilaporkan.
Anda dapat menghasilkan file kserver.keystore
Server.keystore digunakan untuk server, yang menyimpan kunci privatnya sendiri.
2) Ekspor sertifikat server berdasarkan kunci pribadi
KeyTool -Export -alias ServerKey -KeyStore kServer.keystore -file server.crt
server.crt adalah sertifikat di sisi server
3) Impor Sertifikat Server ke Keystore Kepercayaan Klien
keytool -import -alias serverkey -file server.crt -keystore tclient.keystore
TClient.KeyStore adalah untuk klien, dan memiliki sertifikat tepercaya.
Dengan cara yang sama, menghasilkan kunci pribadi dan sertifikat klien klien, dan mengimpornya ke keystore kepercayaan server
1) keytool -genkey -alias clientkey -keystore kclient.keystore
2) keytool -Export -alias clientkey -keystore kclient.keystore -file client.crt
3) keytool -import -alias clientkey -file client.crt -keystore tserver.keystore
Dengan cara ini, file yang dihasilkan dibagi menjadi dua grup
Server Simpan: kserver.keystore tserver.keystore
Klien Simpan: kclient.keystore tclient.kystore
Berikut ini adalah untuk memverifikasi bahwa sertifikat yang kami hasilkan tersedia melalui Program Komunikasi Soket Java.
Klien:
Paket contoh.ssl; import java.io.bufferedInputStream; impor java.iufferedoutputstream; impor java.io.fileInputStream; import java.io.ioException; impor java.io.inputstream; impor java.io.outputput; impor java.io. javax.net.ssl.keyManagerFactory; impor javax.net.ssl.sslcontext; impor javax.net.ssl.sslsocket; import javax.net.ssl.trustManFactory {/** * SSL klien * */kelas publik SSLCLIENT {/** SSL Klien SSL */kelas publik SSLCLIE SSLCLIENT SSSLCLIENT SSSLCIENT {ssl ssl SSL CLIENT CLIENT PUBLIK SSSLCLIET SSSLCLIENT SSSLCLIENT SSSLCLIENT SSSLCLIENT {ssl SSL SSLIGRIGS SSSL SSSL CLASS PUBLIK SSSL SSSL SSSLCLIENS private static final int default_port = 7777; string final final private client_key_store_password = "123456"; string final statis privat client_trust_key_store_password = "123456"; sslsocket sslsocket pribadi; / ** * Mulai program klien * * @param args */ public static void main (string [] args) {sslclient client = new sslclient (); client.init (); client.process (); } / *** Sambungkan ke server melalui soket SSL dan kirim pesan* / proses public void () {if (sslsocket == null) {System.out.println ("error"); kembali; } coba {inputStream input = sslsocket.getInputStream (); OutputStream output = sslsocket.getoutputStream (); BufferedInputStream bis = baru bufferedInputStream (input); BufferedOutputStream bos = baru bufferedoutputStream (output); bos.write ("pesan klien" .getbytes ()); bos.flush (); byte [] buffer = byte baru [20]; bis.read (buffer); System.out.println (string baru (buffer)); sslsocket.close (); } catch (ioException e) {System.out.println (e); }}/** * <ul> * <li> Poin -poin kunci dari koneksi SSL: </li> * <li> Inisialisasi SSLSocket </li> * <li> Kunci Key Private Klien, impor keystore tepercaya klien (sertifikat server) </li> * </ul>/public void init () {cadangan {sss) </li> Sslcontext.getInstance ("ssl"); KeyManagerFactory kmf = KeyManagerFactory.getInstance ("SunX509"); TrustManagerFactory tmf = trustManagerFactory.getInstance ("sunx509"); Keystore ks = keystore.getInstance ("jks"); Keystore tks = keystore.getInstance ("jks"); KS.Load (FileInputStream baru ("e: //kclient.keystore"), client_key_store_password.tochararray ()); tks.load (FileInputStream baru ("e: //tclient.keystore"), client_trust_store_password.tochararray ()); kmf.init (ks, client_key_store_password.tochararray ()); tmf.init (tks); ctx.init (kmf.getKeymanagers (), tmf.gettrustManagers (), null); sslsocket = (sslsocket) ctx.getSocketFactory (). createSocket (default_host, default_port); } catch (Exception e) {System.out.println (e); }}}Sisi server:
Paket contoh.ssl; impor java.io.bufferedInputStream; impor java.iufferedoutputstream; import java.io.fileInputStream; import java.io.inputStream; import java.io.outputstream; impor java.net. javax.net.ssl.keyManagerFactory; import javax.net.ssl.sslcontext; import javax.net.ssl.sslserversocket; impor javax.net.ssl.TrustManagerFactory;/********************************************************************************************************************************************************* *********************************************************************************************************************************************************************************************************************************L *******************************************************************************************************************************************************************************************************L *******************************************************************************************************************************************************************************************************L *******************************************************************************************************************************************************************************************************L *******************************************************************************************************************************************************************************************************L *******************************************************************************************************************************************************************************************************L *****************************************************************************************************************************************************************************************************************************L ServerKey -KeyStore kServer.keystore -file server.crt </li> * <li> 3) Tambahkan sertifikat ke keystore tepercaya dari klien </li> <li> keytool -Import -alias server -file server.crt -keystore tclient.keystore </li> * <//ular> Ulu-keystore tclient.keystore </li> * <//ular> *********************************************************************************************************************** dari *********************************************************************************************************************** dari *********************************************************************************************************************** dari *********************************************************************************************************************** dari *********************************************************************************************************************** dari *********************************************************************************************************************** dari *********************************************************************************************************************** dari *************************************************************************************************************************** dari Server * */kelas publik SSLServer {private static final int default_port = 7777; Private Static Final String Server_key_store_password = "123456"; Private Static Final String Server_trust_key_store_password = "123456"; Server SSLServer SSLSERVERSOCKET; / ** * Mulai program * * @param args */ public static void main (string [] args) {sslserver server = sslserver baru (); server.init (); server.start (); }/** * <ul> * <li> Dengarkan soket server SSL </li> * <li> Karena program ini bukan demonstrasi mendengarkan soket, itu hanya mengadopsi formulir tunggal, dan hanya menerima pesan klien dan mengembalikan pesan yang ditentukan (server (server = ... </ul> */public start start () {if (server (server ==. kembali; } while (true) {coba {socket s = serversocket.accept (); InputStream input = s.getInputStream (); OutputStream output = s.getoutputStream (); BufferedInputStream bis = baru bufferedInputStream (input); BufferedOutputStream bos = baru bufferedoutputStream (output); byte [] buffer = byte baru [20]; bis.read (buffer); System.out.println (string baru (buffer)); bos.write ("server echo" .getbytes ()); bos.flush (); s.close (); } catch (Exception e) {System.out.println (e); }}}}/** * <ul> * <li> Poin -poin kunci dari koneksi SSL: </li> * <li> Inisialisasi SSLServerSocket </li> * <li> Keystore Key Private Server, dan Impor Keystore yang tepercaya (Klien) </li> Sslcontext.getInstance ("ssl"); KeyManagerFactory kmf = KeyManagerFactory.getInstance ("SunX509"); TrustManagerFactory tmf = trustManagerFactory.getInstance ("sunx509"); Keystore ks = keystore.getInstance ("jks"); Keystore tks = keystore.getInstance ("jks"); ks.load (FileInputStream baru ("e: //kserver.keystore"), server_key_store_password.tochararray ()); tks.load (FileInputStream baru ("e: //tserver.keystore"), server_trust_store_password.tochararray ()); kmf.init (ks, server_key_store_password.tochararray ()); tmf.init (tks); ctx.init (kmf.getKeymanagers (), tmf.gettrustManagers (), null); serversocket = (sslServersocket) ctx.getServersocketFactory (). createServerCocket (default_port); serversocket.setneedclientauth (true); } catch (Exception e) {E.PrintStackTrace (); }}}Untuk informasi lebih lanjut tentang konten terkait Java, silakan lihat topik -topik situs ini: "Struktur Data Java dan Tutorial Algoritma", "Ringkasan Java Operation Dom Node Tips", "Ringkasan Tip Operasi Java File dan Direktori" dan "Ringkasan Java Cache Tips"
Saya harap artikel ini akan membantu pemrograman Java semua orang.