gpt4 book ai didi

java - 一个错误配置的 Java SSLContext 容易受到中间人攻击?

转载 作者:行者123 更新时间:2023-11-29 05:37:06 27 4
gpt4 key购买 nike

我正在阅读一个开源 P2P 项目的源代码*,并遇到了应该使应用程序完全容易受到中间人攻击的代码 per Wikipedia .

至少如果 javax.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 仅存储本地节点的 key ,不存储任何远程 key 。

* 源代码匿名以保护罪犯。

最佳答案

Is this code open to man-in-the-middle?

是的。您绝对接受任何 SSL 证书,无论它是否有效、是否由受信任的 CA 等签名,也无论它是否是您尝试联系的对等方的证书。永远不要在生产中部署此代码,这意味着根本不应该编写它,除非您喜欢测试不是您要在生产中部署的部署,并且除非您愿意接受代码泄漏等风险进入生产环境,带来极不安全的后果。

关于java - 一个错误配置的 Java SSLContext 容易受到中间人攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092267/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com