이 기사에서는 Java에서 SSL 양방향 인증을 구현하는 방법에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
공통 SSL 검증이 더 일반적입니다. 서버가 참인지 정확한 지 확인하십시오. 물론 방문중인 URL이 잘못되면 아무도 할 수 없습니다. 이것을 SSL 단방향 인증이라고합니다.
그러나 실제로 고객이 요구 사항을 충족하는지, 즉 각 사용자에게 인증서를 발행하는지 여부를 확인할 수 있으며 각 디지털 인증서는 고유하고 공개적이지 않습니다. 이러한 방식으로 현재 내 서버에 액세스하는 사용자가 서버에서 인식하고 다른 사람이 액세스 할 수 없도록 할 수 있습니다.
양방향 인증은 서버와 클라이언트 모두 첫 번째 수준에서 서로를 인식하도록합니다. 그런 다음 통신하려면 통신의 내용이 암호화되도록 SSL 프로토콜을 통신 프로토콜에 첨부합니다. Sniffer와 같은 네트워크 스나이퍼 도구조차도 차량 코드를 참조하십시오. 앞으로, 나는 당신이 암호화없이 스나이퍼로 보는 것을 당신에게 보여줄 것입니다. 나는 당신이 이런 식으로 더주의를 기울일 것이라는 두려워합니다.
다음 내용은 인터넷에서 발췌 한 후 실제 확인 후 수정됩니다.
시뮬레이션 시나리오 :
서버 측이 클라이언트 측과 통신하면 권한 부여 및 신원 확인이 필요합니다. 즉, 클라이언트는 서버에서만 메시지 만 허용 할 수 있으며 서버는 클라이언트의 메시지 만 허용 할 수 있습니다.
구현 기술 :
JSSE (Java Security Socket Extension)
인터넷에서 안전한 통신을 해결하기 위해 Sun이 시작한 솔루션입니다. SSL 및 TSL (전송 계층 보안) 프로토콜을 구현합니다. JSSE에는 데이터 암호화, 서버 검증, 메시지 무결성 및 클라이언트 검증과 같은 기술이 포함됩니다. JSSE를 사용하여 개발자는 TCP/IP 프로토콜을 통해 클라이언트와 서버간에 데이터를 안전하게 전송할 수 있습니다.
메시지 인증을 구현하기 위해.
서버 필요 :
1) Keystore : 서버의 개인 키가 저장되는 곳
2) Trust Keystore : 고객의 승인 인증서를 저장합니다
마찬가지로 클라이언트는 다음과 같습니다.
1) Keystore : 고객의 개인 키가 저장되는 경우
2) Trust Keystore : 여기에서는 Java와 함께 제공되는 KeyTool 명령을 사용하여 이러한 정보 파일을 생성하는 것이 좋습니다. 물론 OpenSSL은 가장 인기있는 오픈 소스 SSL 인증서 생성입니다. OpenSSL은 C 언어, 교차 시스템으로 작성되었습니다. 그러나 우리는 Java 프로그램을 사용하여 향후 인증서를 생성하고 JDK와 함께 제공되는 KeyTool을 사용하는 편의를 고려할 수 있습니다.
1) 서버 개인 키를 생성하여 서버 키 스토어 파일로 가져옵니다.
KeyTool -genkey -Alias serverkey -keystore kserver.keystore
과정에서 개별적으로 채우고 필요에 따라 설정해야합니다.
키 스토어 비밀번호 : 123456
첫 번째와 성 : 진
조직 단위 이름 : 없음
조직 이름 : 없음
도시 또는 지역 이름 : BJ
주 또는 지방 이름 : BJ
국가 코드 : CN
ServerKey 개인 키의 비밀번호는 KeyStore의 비밀번호와 동일하게 채워지지 않습니다. 여기에주의를 기울이십시오. 비밀번호를 변경하지 않고 Enter를 누르십시오. 그렇지 않으면,이 개인 키를 후속 프로그램에서 직접 적용 할 수없는 경우 오류 가보고됩니다.
kserver.keystore 파일을 생성 할 수 있습니다
Server.keyStore는 자체 개인 키를 저장하는 서버에 사용됩니다.
2) 개인 키에 따라 서버 인증서 내보내기
KeyTool -Export -Alias ServerKey -Keystore kserver.keystore -file server.crt
Server.crt는 서버 측의 인증서입니다
3) 서버 인증서를 클라이언트의 신뢰 Keystore로 가져옵니다.
KeyTool -import -Alias serverkey -file server.crt -keystore tclient.keystore
tclient.keystore는 클라이언트를위한 것이며 신뢰할 수있는 인증서를 보유하고 있습니다.
같은 방식으로 클라이언트의 개인 키 및 클라이언트 인증서를 생성하여 서버의 Trust 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 Communication 프로그램을 통해 사용할 수 있는지 확인하는 것입니다.
고객:
패키지 examples.ssl; import java.io.bufferedInputStream; import java.io.bufferedoutputStream; import java.io.fileInputStream; import java.io.ioException; import java.io.inputStream; import java.io.outputstream; import prutstore; 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 string default_host = "127.0.0.1"; 개인 정적 최종 int default_port = 7777; 개인 정적 최종 문자열 client_key_store_password = "123456"; 비공개 정적 최종 문자열 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 = 새로운 bufferedInputStream (입력); BufferedOutputStream BOS = New BufferedOutputStream (출력); bos.write ( "클라이언트 메시지".getBytes ()); bos.flush (); 바이트 [] 버퍼 = 새로운 바이트 [20]; bis.read (버퍼); System.out.println (새 문자열 (버퍼)); sslsocket.close (); } catch (ioException e) {System.out.println (e); }}/** * <ul> * <li> SSL 연결의 주요 점 : </li> * <li> SSLSocket 초기화 </li> * <li> 클라이언트 개인 키 스토어 가져 오기, 클라이언트 신뢰할 수있는 Keystore (서버 인증서) </li> * </ul> */public void init () {sslcontxt ctx = 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 (new FileInputStream ( "e : //kclient.keystore"), client_key_store_password.tochararray ()); tks.load (새 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 (예외 e) {System.out.println (e); }}}서버 측 :
패키지 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; javax.net.ssl.keymanagerfactory; import javax.net.ssl.sslcontext; import javax.net.ssl.sslserversocket; import javax.net.ssl.TrustManagerFactory;/********************************************************************************************************************************************************* ******************************************************************************************************************************************************************************************** ******************************************************************************************************************************************************************************************** ******************************************************************************************************************************************************************************************** ******************************************************************************************************************************************************************************************** ******************************************************************************************************************************************************************************************** ******************************************************************************************************************************************************************************************** ********************************************************************************************************************************************************************************************* ServerKey -keystore kserver.keystore -file server.crt </li> * <li> 3) 클라이언트의 신뢰할 수있는 키 스토어에 인증서를 추가하십시오 </li> * <li> KeyTool -Import -Alias ServerKey -File Server.crt -keystore tclient.keystore </li> * </ul> ********************************************************************************************************************************************** ********************************************************************************************************************************************** ********************************************************************************************************************************************** ********************************************************************************************************************************************** ********************************************************************************************************************************************** ********************************************************************************************************************************************** ********************************************************************************************************************************************** **********************************************************************************************************************************************************************************************, 서버 * */public class sslserver {private static final int default_port = 7777; 개인 정적 최종 문자열 server_key_store_password = "123456"; 개인 정적 최종 문자열 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 void start () {if (serversocket == null) {system.ough. 반품; } while (true) {try {socket s = serversocket.accept (); inputStream input = s.getInputStream (); outputStream output = s.getOutputStream (); bufferedInputStream bis = 새로운 bufferedInputStream (입력); BufferedOutputStream BOS = New BufferedOutputStream (출력); 바이트 [] 버퍼 = 새로운 바이트 [20]; bis.read (버퍼); System.out.println (새 문자열 (버퍼)); bos.write ( "Server echo".getBytes ()); bos.flush (); s.close (); } catch (예외 e) {System.out.println (e); }}}}}}/** * <ul> * <li> SSL 연결의 핵심 사항 : </li> * <li> SSLServersocket 초기화 </li> * <li> 서버 프라이버시 키 스토어를 가져오고 서버 신뢰할 수있는 키 스토어를 가져오고 (클라이언트 인증서) </li> * </ul> */public void init () {sslconte xtx = {sslconte xtx {sslconte x void init () {sslconte void init () {sslconte void init. 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 (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.getServersocketFactory (). CreateServersocket (default_port); serversocket.setneedclientauth (true); } catch (예외 e) {e.printstacktrace (); }}}Java 관련 컨텐츠에 대한 자세한 내용은이 사이트의 주제를 확인하십시오 : "Java 데이터 구조 및 알고리즘 자습서", "Java Operation Dom Node Tips 요약", "Java 파일 및 디렉토리 작업 팁 요약"및 "Java Cache Operation Tips의 요약"을 확인하십시오.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.