gpt4 book ai didi

java - SSLSocket 通过另一个 SSLSocket

转载 作者:IT老高 更新时间:2023-10-28 20:47:41 26 4
gpt4 key购买 nike

我正在尝试在 Android 应用中的另一个 SSLSocket 之上创建一个 SSLSocket。较低的连接是到 Secure Web Proxy 的 SSL 安全连接。 (基于 SSL 的 HTTP 代理),上层连接用于基于 SSL 的 HTTP (HTTPS)。

为此,我正在使用 SSLSocketFactory 的 createSocket() 函数,该函数允许传递一个现有的 Socket,在该 Socket 上运行 SSL 连接,如下所示:

private Socket doSSLHandshake(Socket socket, String host, int port) throws IOException {
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager(){
public X509Certificate[] getAcceptedIssuers(){ return null; }
public void checkClientTrusted(X509Certificate[] certs, String authType) {}
public void checkServerTrusted(X509Certificate[] certs, String authType) {}
}
};

try {
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new SecureRandom());
SSLSocket sslSocket = (SSLSocket) sslContext.getSocketFactory().createSocket(socket, host, port, true);
sslSocket.setEnabledProtocols(sslSocket.getSupportedProtocols());
sslSocket.setEnableSessionCreation(true);
sslSocket.startHandshake();
return sslSocket;
} catch (KeyManagementException | NoSuchAlgorithmException e) {
throw new IOException("Could not do handshake: " + e);
}
}

当底层套接字是普通的 tcp 套接字时,此代码工作正常,但是当我使用之前使用上述代码创建的 SSLSocket 作为底层套接字时,握手失败并出现以下异常:

javax.net.ssl.SSLHandshakeException: Handshake failed
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:429)
at com.myapp.MyThreadClass.doSSLHandshake(MyThreadClass.java:148)
at com.myapp.MyThreadClass.run(MyThreadClass.java:254)
Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x7374d56e80: Failure in SSL library, usually a protocol error
error:100000e3:SSL routines:OPENSSL_internal:UNKNOWN_ALERT_TYPE (external/boringssl/src/ssl/s3_pkt.c:618 0x738418ce7e:0x00000000)
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357)
... 2 more

我正在 Android 7.1.1 上进行测试。该应用的目标是 SDK 级别 23。

  • 我做错了什么?
  • 如何进一步调试问题?
  • 有没有人有一个 SSLSocket 超越另一个的工作示例最新 Android 版本上的 SSLSocket?

非常感谢任何帮助!


更新:完全相同的代码在 Mac 上的 JRE 1.8 中有效,但在 Android 上无效。


Update 2: Conceptually, these are the steps the connection goes through:

  1. From the Android app, make a connection to the Secure Proxy server (Socket)
  2. Do an SSL/TLS handshake with the Proxy server (SSLSocket over Socket)
  3. Via the SSLSocket, send the CONNECT message to the Proxy server
  4. Proxy connects to destination (https) server and only copies bytes from now on
  5. Do an SSL/TLS handshake with the destination (https) server (SSLSocket over SSLSocket over Socket)
  6. Send the GET message to the destination server and read response

The problem arises in step 5, when doing the handshake on an SSLSocket that goes over an SSLSocket (that goes over a Socket).


Update 3: I have now opened a GitHub repo with a sample project and tcpdumps: https://github.com/FD-/SSLviaSSL


注意:我找到并阅读了a question with very similar title ,但不幸的是它没有包含太多有用的帮助。

最佳答案

我不认为你做错了什么。在您的第二次握手期间,协议(protocol)协商中似乎存在错误。一个好的候选人会在 NPN TLS 握手扩展中失败。

看看你在这个调用中的协议(protocol):sslSocket.setEnabledProtocols(sslSocket.getSupportedProtocols());

您可以浏览列出的协议(protocol)并逐个尝试。看看您是否可以锁定失败的原因以及您是否需要支持该特定协议(protocol)或扩展。

关于java - SSLSocket 通过另一个 SSLSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42078173/

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