![](/img/trans.png)
[英]How can I get hold of the server's certificate at run time when opening an SSLSocket in a Java client?
[英]Validation of a certificate chain when opening a SSLSocket in Java
我的設定
我的目標是與FTP服務器建立SSL / TLS安全連接(顯式)。 適當的根CA證書存儲在名為truststore.jks
的Truststore中。 在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);
}
代碼本身運行良好,並且我收到了安全的Socket-Connection,但是我不知道這是否可以承受像MITM這樣的攻擊。 我的意思是說該程序會發現有人試圖“給我一張假證書”的嘗試。 因此,如果一些經驗豐富的SSL網絡程序員可以啟發我,我將非常高興:D
這樣就足夠了。 攻擊者必須提供由根CA簽名的證書。 但是,您不需要所有這些代碼:您只需要
System.setProperty("javax.net.ssl.trustStore", "truststore.jks");
SSLContext sCon = SSLContext.getDefault();
SSLSocketFactory sslSocketFactory = sCon.getSocketFactory();
return (SSLSocket) sslSocketFactory.createSocket(s, "<HOSTNAME>", 21, true)
如果您想完全偏執,則在創建SSLSocket
之后,您可以獲取SSLSession
,然后獲取對等證書鏈,並確保第零個條目與確切的服務器證書完全匹配,但是此步驟通常被省略。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.