簡體   English   中英

在Java中打開SSLSocket時對證書鏈的驗證

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM