在Java中打开SSLSocket时验证证书链

时间:2017-06-07 01:22:30

标签: java ssl

我的设置

我的目标是使用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

1 个答案:

答案 0 :(得分:1)

这就足够了。攻击者必须提供由根CA签名的证书。但是,您不需要所有这些代码:您只需要

import pip
import sys
import os

try:
        import paramiko
except ImportError:
        pip.main(["install", "--upgrade", "pip"])
        pip.main(["install", "--user", "paramiko"])
        try:
            import paramiko
        except ImportError:
            os.execl(sys.executable, 'python', __file__, *sys.argv[1:])

ssh = paramiko.SSHClient()

如果你想完全偏执,在创建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然后是对等证书链,并确保第0个条目与确切的服务器证书完全匹配,但是这个步骤大多被省略。