我的设置
我的目标是使用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
答案 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个条目与确切的服务器证书完全匹配,但是这个步骤大多被省略。