【发布时间】:2015-10-27 00:24:49
【问题描述】:
我正在尝试创建从 Java 到 Vala 服务器的 SSL TCP 连接。 一切正常,直到我向服务器发送第二个包。 (也是第一个包裹发送罚款)。 服务器只接收第二个包的第一个字节(在本例中为“1”),没有别的, 但是如果我在没有 SSL 的情况下连接到服务器,一切正常。 我认为服务器不是问题,因为来自另一个 Vala 客户端的所有其他连接都运行良好。
我使用的是不受信任的证书,因此我创建了一个自定义的 TrustManager,并且我使用的是 OpenJDK 7(Elementary OS - Linux)。 这是我的代码:
//Main:
SSLHandler handler = new SSLHandler();
handler.createSecureSocket("localhost", 7431);
byte[] data = {1,4,1,1,1,1};
handler.getOutputStream().write(data);
handler.getOutputStream().write(data);
// SSLHandler
public class SSLHandler {
// SSL Socket erstellen
SSLSocket sslSocket;
public void createSecureSocket(String ip, int port) throws UnknownHostException, IOException, KeyManagementException, NoSuchAlgorithmException {
SSLSocketFactory factory = (SSLSocketFactory) new DefaultTrustManager().createSSLFactory("TLS");
sslSocket = (SSLSocket) factory.createSocket(ip, port);
}
public OutputStream getOutputStream() throws IOException {
return sslSocket.getOutputStream();
}
public InputStream getInputStream() throws IOException {
return sslSocket.getInputStream();
}
}
//Custom Trust Manager
public class DefaultTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public SSLSocketFactory createSSLFactory(String protocol) throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sslContext = SSLContext.getInstance(protocol);
TrustManager[] byPassTrustManager = new TrustManager[] {this};
sslContext.init(null, byPassTrustManager, new SecureRandom());
return sslContext.getSocketFactory();
}
}
有人知道这个问题的解决方案吗?
【问题讨论】:
-
getAcceptedIssuers()不能返回 null:请参阅 Javadoc。不要使用这种根本不安全的代码。你在哪里证明数据没有被正确接收?接收代码? -
@EJP 我不认为 API 需要它,但实际上 getAcceptedIssuers 并没有在客户端中使用,所以这个错误永远不会被咬