マイセットアップ検証するJava
私の目標は、FTP-Serverとの(明示的な)SSL/TLSの安全な接続を設定することです。 適切なルートCA証明書は、truststore.jks
と呼ばれるトラストストアに格納されています。 AUTH TLS
コマンドの後に次のコードを使用してSSLSocketを構築しています。
public SSLSocket enterSecureMode(Socket s) throws Exception {
KeyStore truststore = KeyStore.getInstance("JKS");
truststore.load(Files.newInputStream(Paths.get("truststore.jks")), "mypass".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(truststore);
SSLContext sCon = SSLContext.getInstance("TLS");
sCon.init(null, tmf.getTrustManagers(), null);
SSLSocketFactory sslSocketFactory = sCon.getSocketFactory();
return (SSLSocket) sslSocketFactory.createSocket(s, "<HOSTNAME>", 21, true);
}
コード自体は正常に動作していると私は、安全なソケット・コネクションを受けたが、私は、これは例えばMITMのような攻撃を我慢できるかどうかだろう。私はそのプログラムが、誰かが「偽の証明書を私に渡そう」という試みを発見することを意味します。 したがって、経験豊富なSSLネットワークプログラマーが私に光を当てることができれば、とてもうれしいでしょう。D
(私は自分のプログラムやデータの保護を最大限にしたいから)サーバー証明書のフィンガープリントを保存して、SSL接続を開始するときに一致するかどうかを確認する必要がありますか? – MiEbe
はい、そうすることもできますし、実際に証明書全体を格納してビット単位で比較することもできます。しかし、あなたがそれらの事のどちらかをした場合は、それを更新するごとに更新する必要があります。正しいルートCAによって署名され、ルートCAが検証することを義務付けられている同じSubject Distinguished Nameを持っていれば、信頼できる可能性があります。 – EJP