3

オープン ワイヤレス ネットワーク上の多数のハードウェア デバイスからデータを収集する単純なサーバー プログラムがあります。ポートに接続する人がコマンドを送信したり、トラフィックをリッスンしたりできないようにしたいので、クライアントを検証するためにサーバーが必要です。いくつかの例を見つけましたが、ほとんどはクライアント側からサーバーを検証するアプローチを取っているようです。SSL とソケットのプログラミングは初めてです。

お持ちのお客様より

KeyStore keystore = KeyStore.getInstance("JKS");
keystore.load(new FileInputStream("KeyStore"), "password".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(keystore);

SSLContext context = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = tmf.getTrustManagers();

context.init(null, trustManagers, null);

SSLSocketFactory sf = context.getSocketFactory();
return (SSLSocket) sf.createSocket(host, port);

そして、私が持っているサーバーで

KeyStore ks = KeyStore.getInstance("JKS");
ks.load(newFileInputStream("server"),"password".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "password".toCharArray());
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(kmf.getKeyManagers(), null, null);
SSLServerSocketFactory ssf = sc.getServerSocketFactory();
server = (SSLServerSocket) ssf.createServerSocket(this.port);

すべてが何をしているのか正確にはわかりませんが、例から、それは双方向認証であることがわかりました。これらのコードの 1 つだけが必要だと思いますが、SSL を十分に理解していないため、どれがどれかを知ることができません。どちらの側にキーストアが必要ですか? キーと証明書が必要なのは誰ですか? ありがとう

4

1 に答える 1

3

既存のサーバー認証にクライアント認証を追加するだけの場合は、サーバー コードの最後に次の行を追加します。

server.setNeedClientAuth(true);

サーバーがクライアントを許可するだけで、その逆は許可しない場合は、server.setUseClientMode(true)サーバーを呼び出しsetUseClientMode(false)、クライアントで作成した SSLSocket を呼び出してから返します。このオプションは、クライアント デバイスが他の誰かのサーバーに接続している可能性があり、それを知る方法がないことを意味することに注意してください。

いずれの場合も、サーバーには、クライアントが提示する証明書のコピーがインストールされたトラスト ストア (キーストアと同じにすることができます) が必要です。クライアントには、この証明書を提示するキー ペアが必要です。

于 2014-04-01T01:34:48.670 に答える