我正在嘗試創建一個從Java到Vala服務器的SSL TCP連接。 一切工作正常,直到我發送第二個包到服務器。 (也是第一個包發送正常)。 服務器只接收第二個包的第一個字節(在本例中爲「1」),沒有其他的, 但如果我連接到服務器沒有SSL一切正常。 我認爲服務器不是問題,因爲來自另一個Vala客戶端的其他連接工作得很好。TLS包後的神祕字節
我正在使用不受信任的證書,因此我創建了一個自定義TrustManager,並使用OpenJDK 7(基本操作系統 - 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
@EJP我不認爲API需要它,但實際上getAcceptedIssuers不在客戶端使用,所以錯誤從未咬人 –