この記事では、JavaにSSL双方向認証を実装する方法について説明します。次のように、参照のために共有してください。
一般的なSSL検証がより一般的です。サーバーが真であるか正しいかを確認してください。もちろん、訪問しているURLがまったく間違っている場合、誰もそれを行うことができません。これは、SSLの一元配置認証と呼ばれます。
しかし、実際には、クライアントが要件を満たしているかどうか、つまり各ユーザーに証明書を発行するかどうかを確認することもできます。各デジタル証明書は一意であり、公開されていません。このようにして、現在私のサーバーにアクセスしているユーザーがサーバーによって認識され、他の人がアクセスできないことを確認できます。
双方向認証により、サーバーとクライアントの両方が最初のレベルで互いに認識されるようにします。次に、通信したい場合は、通信プロトコルにSSLプロトコルを添付して、通信のコンテンツが暗号化されていることを確認します。 SnifferのようなネットワークSnifferツールでさえ、Carled Codeを参照してください。将来的には、暗号化なしでスニファーで見たものをあなたに示します。このようにもっと警戒するだろうと思います。
次のコンテンツはインターネットから抜粋され、実際の検証後に変更されます。
シミュレーションシナリオ:
サーバー側がクライアント側と通信する場合、承認とIDの確認が必要です。つまり、クライアントはサーバーからのメッセージのみを受け入れることができ、サーバーはクライアントからのメッセージのみを受け入れることができます。
実装技術:
JSSE(Javaセキュリティソケットエクステンション)
これは、インターネット上の安全な通信を解決するためにSunによって開始されたソリューションです。 SSLとTSL(輸送層のセキュリティ)プロトコルを実装します。 JSSEには、データ暗号化、サーバー検証、メッセージの整合性、クライアント検証などのテクノロジーが含まれます。 JSSEを使用することにより、開発者はTCP/IPプロトコルを介してクライアントとサーバー間でデータを安全に転送できます。
メッセージ認証を実装するため。
サーバーには必要です:
1)キーストア:サーバーの秘密鍵が保存される場所
2)キーストアの信頼:クライアントの承認証明書を保存します
同様に、クライアントには次のことが必要です。
1)キーストア:クライアントの秘密鍵が保存されている場所
2)キーストアの信頼:ここでは、Javaに付属のKeyToolコマンドを使用してそのような情報ファイルを生成することをお勧めします。もちろん、OpenSSLは最も人気のあるオープンソースSSL証明書生成でもあります。 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
このようにして、生成されたファイルは2つのグループに分割されます
サーバー保存:kserver.keystore tserver.keystore
クライアント保存:kclient.keystore tclient.kystore
以下は、生成した証明書がJavaソケット通信プログラムを通じて利用できることを確認するためです。
クライアント:
パッケージExamples.ssl; Import java.io.bufferedinputStream; Import java.io.bufferedOutputStream; Import java.io.fileinputStream; Import java.io.inputStream; Import java.inputStream; Import java.io.OutputStream; Import java.Outtuptrem; Import java.Outtuptream; javax.net.ssl.keymanagerfactory; import javax.net.ssl.sslcontext; Import javax.net.ssl.sslsocket; import javax.net.ssl.trustmanagerfactory;/** * ssl client */public final slclient {private final default = "127.host"プライベート静的最終int default_port = 7777;プライベート静的な最終文字列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(input); BufferedOutputStream bos = new BufferedOutputStream(output); bos.write( "client message" .getBytes()); bos.flush(); byte [] buffer = new byte [20]; bis.read(buffer); System.out.println(new String(バッファー)); sslsocket.close(); } catch(ioException e){system.out.println(e); }}/** * <ul> * <li> SSL接続のキーポイント:</li> * <li> SSLSocketの初期化</li> * <li>クライアントの秘密キーストアをインポートし、クライアント信頼できるキーストア(サーバー証明書)をインポートし、</li> * </ul> */public void init(){sslcontext 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(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); }}}サーバー側:
パッケージExamples.ssl; Import Java.io.BufferedInputStream; Import Java.io.BufferedOutputStream; Import Java.io.FileInputStream; 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;/************************************************************************************************************************************************ **************************************************************************************************************************************************************つ**************************************************************************************************************************************************************つ**************************************************************************************************************************************************************つ**************************************************************************************************************************************************************つ**************************************************************************************************************************************************************つ**************************************************************************************************************************************************************つ********************************************************************************************************************************************K serverkey -keystore kserver.keystore -file server.crt </li> * <li> 3)クライアントの信頼できるキーストアに証明書を追加</li> * <li> keytool -import -alias serverkey -file server.crt -keystore tclient.keystore </li> * </ul> **************************************************************************************************************************************************** **************************************************************************************************************************************************** **************************************************************************************************************************************************** **************************************************************************************************************************************************** **************************************************************************************************************************************************** **************************************************************************************************************************************************** **************************************************************************************************************************************************** ********************************************************************************************************************************つサーバー * */パブリッククラスSSLSERVER {private static final int default_port = 7777;プライベート静的な最終文字列server_key_store_password = "123456"; private static final string server_trust_key_store_password = "123456";プライベート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(){serversocket = = null "systems()戻る; } while(true){try {socket s = serversocket.accept(); inputStream input = s.getInputStream(); outputStream output = s.getOutputStream(); BufferedInputStream bis = new BufferedInputStream(input); BufferedOutputStream bos = new BufferedOutputStream(output); byte [] buffer = new byte [20]; bis.read(buffer); System.out.println(new String(バッファー)); bos.write( "server echo" .getBytes()); bos.flush(); s.close(); } catch(Exception e){System.out.println(e); }}}}/** * <ul> * <li> SSL接続のキーポイント:</li> * <li> SSLServersocketの初期化</li> * <li>サーバーの秘密キーストアをインポートし、サーバートラストキーストア(クライアント証明書)</li> * </ul> */公開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(Exception e){e.printstacktrace(); }}}Java関連のコンテンツの詳細については、このサイトのトピックをご覧ください:「Javaデータ構造とアルゴリズムのチュートリアル」、「Java操作DOMノードのヒントの概要」、「Javaファイルとディレクトリ操作のヒントの概要」、「Javaキャッシュ操作のヒントの要約」
この記事がみんなのJavaプログラミングに役立つことを願っています。