我正在阅读一个开源 P2P 项目* 的源代码,并且遇到了应该使应用程序完全容易受到Wikipedia中的中间人攻击的代码。
至少 ifjavax.net.ssl.X509TrustManager.getAcceptableIssuers()
将空数组视为Trust Any而不是Trust Nothing。
它可能会,因为据它所知,您正在充当具有匿名客户端的服务器,而不是加密的 P2P,要求两个对等方都是他们所说的身份。
class ATrustManager implements X509TrustManager {
public ATrustManager() {}
public void checkClientTrusted(X509Certificate[] certs, String authType) {}
public void checkServerTrusted(X509Certificate[] certs, String authType) {}
// --- What!? ---
public X509Certificate[] getAcceptedIssuers() {
java.security.cert.X509Certificate[0];
}
// --------------
}
class Blah {
SomeObject doBlah(...) {
// ... various code ...
char[] password = "password".toCharArray();
KeyStore keystore = KeyStore.getInstance("JKS");
keystore.load(FileInputStream("app.keys"), password);
KeyManagerFactory aKeyManagerFactory =
KeyManagerFactory.getInstance("SunX509");
aKeyManagerFactory.init(keystore, password);
KeyManager[] aKeyManager = aKeyManagerFactory.getKeyManagers();
TrustManager[] aTrustManager = new TrustManager[] { new ATrustManager() };
SSLContext sslcontext = SSLContext.getInstance("SSL");
sslcontext.init(aKeyManager, aTrustManager, null);
SSLSocketFactory socketFactory = sslcontext.getSocketFactory();
Socket socket = socketFactory.createSocket(hostname, port);
OutputStream out = socket.getOutputStream();
// ... various code ...
}
我的问题:此代码是否对中间人开放?如果是这样,我可能应该让项目知道它。
笔记:
- 如果远程节点的公钥未知,应用程序不会在代码中的其他位置断开连接。我已经检查过了。
app.keys
仅存储本地节点的密钥,不存储任何远程密钥。
* 源代码匿名保护有罪。