2017-06-07 29 views
0
でのSSLSocketを開く

マイセットアップ検証する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

答えて

1

これで十分です。攻撃者は、ルートCAによって署名された証明書を提供する必要があります。しかし、あなたはすべてこのコードは必要ありません:あなたは完全に被害妄想になりたい場合は、唯一の作成後SSLSocketあなたはSSLSessionしてから、ピア証明書チェーンを取得し、確認することができ、

System.setProperty("javax.net.ssl.trustStore", "truststore.jks"); 
SSLContext sCon = SSLContext.getDefault(); 
SSLSocketFactory sslSocketFactory = sCon.getSocketFactory(); 
return (SSLSocket) sslSocketFactory.createSocket(s, "<HOSTNAME>", 21, true) 

を必要とするゼロ番目のエントリ正確なサーバーの証明書に完全に一致しますが、この手順はほとんど省略されています。

+0

(私は自分のプログラムやデータの保護を最大限にしたいから)サーバー証明書のフィンガープリントを保存して、SSL接続を開始するときに一致するかどうかを確認する必要がありますか? – MiEbe

+0

はい、そうすることもできますし、実際に証明書全体を格納してビット単位で比較することもできます。しかし、あなたがそれらの事のどちらかをした場合は、それを更新するごとに更新する必要があります。正しいルートCAによって署名され、ルートCAが検証することを義務付けられている同じSubject Distinguished Nameを持っていれば、信頼できる可能性があります。 – EJP