В этой статье описывается метод реализации двусторонней аутентификации SSL в Java. Поделитесь этим для вашей ссылки, следующим образом:
Общая проверка SSL встречается чаще. Только убедитесь, является ли наш сервер верным или правильным. Конечно, если URL, который вы посещаете, вообще неверен, то никто не может этого сделать. Это называется SSL односторонняя аутентификация.
Но на самом деле мы можем также проверить, соответствует ли клиент требованиям, то есть выдать сертификат каждому из наших пользователей, и каждый цифровой сертификат является уникальным и не общедоступным. Таким образом, вы можете убедиться, что пользователь, в настоящее время получающий доступ к моему серверу, распознается сервером и не может быть доступен другими.
Двусторонняя аутентификация гарантирует, что и сервер, и клиент распознают друг друга на первом уровне. Затем, если они хотят общаться, они прикрепляют протокол SSL к протоколу связи, чтобы гарантировать, что содержание связи будет зашифровано. Даже сетевые инструменты снофферы, такие как Sniffer, см. Искаженную код. В будущем я продемонстрирую вам, что вы видите с Sniffer без шифрования. Боюсь, ты будешь более бдительным таким образом.
Следующий контент выдержается из Интернета и изменяется после фактической проверки.
Сценарий симуляции:
Когда сторона сервера общается со стороной клиента, требуется авторизация и проверка идентификации, то есть клиент может принимать только сообщения с сервера, а сервер может принимать сообщения только от клиента.
Технология внедрения:
JSSE (Java Security Docket Edgine)
Это решение, запущенное Sun для решения безопасных коммуникаций в Интернете. Он реализует протоколы SSL и TSL (транспортный уровень безопасности). JSSE включает в себя такие технологии, как шифрование данных, проверка сервера, целостность сообщения и проверку клиента. Используя JSSE, разработчики могут безопасно передавать данные между клиентом и сервером через протокол TCP/IP.
Чтобы реализовать аутентификацию сообщения.
Сервер требует:
1) Слар ключа: где сохранен закрытый ключ сервера
2) Слайт ключей доверия: он сохраняет сертификат авторизации клиента
Точно так же клиент требует:
1) Слар ключа: где сохранен закрытый ключ клиента
2) Trust Key Store: Здесь я рекомендую использовать команду Keytool, которая поставляется с Java для генерации таких информационных файлов. Конечно, OpenSSL также является самой популярной генерацией сертификатов с открытым исходным кодом. OpenSSL написан на языке C, кросс-система. Тем не менее, мы можем рассмотреть удобство использования Java -программ для генерации сертификатов в будущем и использовать ключевую обработку, которая поставляется с JDK.
1) Сгенерировать конфиденциальную ключ сервера и импортировать его в файл хранилища ключей сервера
keytool -genkey -alias serverkey -keystore kserver.keystore
Во время процесса вам необходимо заполнить его отдельно и настроить его в соответствии с вашими потребностями.
Пароль хранилища ключа: 123456
Имя и фамилия: Джин
Название организационной единицы: нет
Название организации: нет
Город или регион Название: BJ
Штат или провинция Название: BJ
Код страны: CN
Пароль частного ключа Serverkey не заполняется так же, как пароль хранилища ключей. Обязательно обратите внимание здесь, просто нажмите Enter, не изменяя свой пароль. В противном случае, если этот закрытый ключ не может быть применен непосредственно в последующей программе, будет сообщена ошибка.
Вы можете генерировать файл kserver.keystore
Server.KeyStore используется для сервера, который хранит свой собственный закрытый ключ.
2) Экспорт сертификата сервера на основе закрытого ключа
keytool -export -alias serverkey -keystore kserver.keystore -file server.crt
Server.crt - сертификат на стороне сервера
3) Импортируйте сертификат сервера в магазин ключей клиента.
KeyTool -Import -Alias ServerKey -file Server.crt -KeyStore tclient.KeyStore
Tclient.KeyStore предназначен для клиентов, и он имеет надежный сертификат.
Точно так же сгенерируйте личный ключ клиента и сертификат клиента и импортируйте его в магазин ключевых ключей сервера
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
Таким образом, сгенерированные файлы делятся на две группы
Сохранить сервер: kserver.keystore tserver.keystore
Сохранение клиента: kclient.keystore tclient.kystore
Следующее - убедиться, что сгенерированный нами сертификат доступен в рамках программы связи Java Socket.
Клиент:
Примеры пакетов. SSL; импортировать java.io.bufferedinptstream; import java.io.bufferedoutputstream; импорт java.io.fileinputstream; импорт java.io.ioexception; импорт java.io.inputstream; import java.io.Outputstream; импорт. javax.net.ssl.keymanagerfactory; import javax.net.ssl.sslcontext; import javax.net.ssl.sslsocket; import javax.net.ssl.trustmanagerfactory;/** * ssl client * *//public class sslclient {private static final строка default_host = "127.0.0.1"; Частный статический окончательный финал int default_port = 7777; Private Static Final String client_key_store_password = "123456"; Private Static Final String Client_trust_key_store_password = "123456"; Частный SSLSocket SSLSOCKET; / ** * Запустить клиентскую программу * * @param args */ public static void main (string [] args) {sslclient client = new sslclient (); client.init (); client.process (); } / *** Подключиться к серверу через SSL -сокет и отправить сообщение* / public void Process () {if (sslsocket == null) {System.out.println ("error"); возвращаться; } try {inputStream input = sslSocket.getInputStream (); OutputStream output = sslsocket.getOutputStream (); BufferedInputStream bis = new BufferedInputStream (вход); BufferedOutputStream Bos = new BufferedOutputStream (выход); bos.write ("Сообщение клиента" .getbytes ()); bos.flush (); Byte [] buffer = новый байт [20]; bis.read (buffer); System.out.println (New String (Buffer)); sslsocket.close (); } catch (ioException e) {System.out.println (e); }}/** * <ul> * <li> Ключевые точки SSL Connection: </li> * <li> Инициализировать SSLSocket </li> * <li> Импортировать клиент Cliate Key Store, импортируйте клиент -доверенный магазин клавиш (сертификат сервера) </li> * </ul> */public init () {try {sslcontext). KeyManagerFactory KMF = KeyManagerFactory.getInstance ("sunx509"); TrustManagerFactory TMF = TrustManagerFactory.getInstance ("sunx509"); Ключевой магазин ks = keystore.getInstance ("jks"); Store Store tks = keystore.getInstance ("jks"); ks.load (new FileInputStream ("e: //kclient.keystore"), client_key_store_password.tochararray ()); tks.load (new FileInputStream ("e: //tclient.keystore"), client_trust_key_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); }}}Серверная сторона:
package examples.ssl;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.security.KeyStore;import javax.net.ssl.KeyManagerFactory;import javax.net.ssl.sslcontext; импорт javax.net.ssl.sslserversocket; import javax.net.ssl.trustmanagerfactory;/************************************************************************************* *************************************************** • *************************************************** • *************************************************** • *************************************************** • *************************************************** • *************************************************** • ***************************************************** • ServerKey -KeyStore Kserver.KeyStore -file Server.crt </li> * <li> 3) Добавить сертификат в Trusted KeyStore Client </li> * <li> Keytool -Import -Alias ServerKey -file Server.crt -KeyStore tclient.KeyStore </li> * </ul> ***************************************************** • ***************************************************** • ***************************************************** • ***************************************************** • ***************************************************** • ***************************************************** • ***************************************************** • ***************************************************** • Сервер * */public class 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"; private sslserversocket serversocket; / ** * Запустить программу * * @param args */ public static void main (string [] args) {sslserver server = new sslserver (); server.init (); Server.Start (); }/** * <ul> * <li> Слушайте сокет SSL-сервера </li> * <li> Поскольку эта программа не является демонстрацией прослушивания сокетов, она просто принимает однопоточную форму и только принимает сообщения клиента и возвращает указанное сообщение клиента </li> * </ul> */public start () {if (serversocket == null). возвращаться; } while (true) {try {socket s = serversocket.accept (); Inputstream input = s.getinputstream (); OutputStream output = s.getOutputStream (); BufferedInputStream bis = new BufferedInputStream (вход); BufferedOutputStream Bos = new BufferedOutputStream (выход); Byte [] buffer = новый байт [20]; bis.read (buffer); System.out.println (New String (Buffer)); bos.write ("сервер echo" .getbytes ()); bos.flush (); S.Close (); } catch (Exception e) {System.out.println (e); }}}}/** * <ul> * <li> Ключевые точки SSL Connect Sslcontext.getInstance ("ssl"); KeyManagerFactory KMF = KeyManagerFactory.getInstance ("sunx509"); TrustManagerFactory TMF = TrustManagerFactory.getInstance ("sunx509"); Ключевой магазин ks = keystore.getInstance ("jks"); Store Store tks = keystore.getInstance ("jks"); ks.load (new FileInputStream ("e: //kserver.keystore"), server_key_store_password.tochararray ()); tks.load (new FileInputStream ("e: //tserver.keystore"), Server_trust_key_store_password.tochararray ()); kmf.init (ks, server_key_store_password.tochararray ()); tmf.init (tks); ctx.init (kmf.getkeymanagers (), tmf.gettrustmanagers (), null); serversocket = (sslserversocket) ctx.getServersocketCostectory (). CreateServersocke (default_port); serversocket.setneedclientauth (true); } catch (Exception e) {e.printstackTrace (); }}}Для получения дополнительной информации о контенте, связанном с Java, пожалуйста, ознакомьтесь с темами этого сайта: «Учебное пособие по структуре данных Java и алгоритм», «Сводка операции Java Operation Node», «Сводка Java File и советы по эксплуатации» и «Подсказки операции Java Cache»
Я надеюсь, что эта статья будет полезна для всех Java Programming.