You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android中使用TLS 1.0连接仅支持该协议的设备?

解决Android中连接仅支持TLS 1.0设备的问题

你的代码抛出UNSUPPORTED_PROTOCOL异常,本质是Android 6.0(API 23)及以上版本默认禁用了TLS 1.0/1.1,即使显式创建TLSv1的SSLContext,系统底层加密库仍会拒绝使用这些老旧协议。以下是可行的解决方法:

方法一:配置应用网络安全配置(API 24+适用)

在res/xml目录下创建network_security_config.xml文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <!-- 替换为你的设备IP或域名 -->
        <domain includeSubdomains="true">192.168.1.10</domain>
        <trust-anchors>
            <certificates src="system" />
            <!-- 若设备用自签名证书,需添加此行并指向你的证书文件 -->
            <!-- <certificates src="@raw/device_cert" /> -->
        </trust-anchors>
        <ssl-config>
            <!-- 允许使用TLS 1.0 -->
            <min-tls-version>TLSv1.0</min-tls-version>
        </ssl-config>
    </domain-config>
</network-security-config>

接着在AndroidManifest.xml的application标签中添加引用:

<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">
    ...
</application>

方法二:自定义SSLSocketFactory强制启用TLS 1.0(兼容低版本)

若需兼容API 23及以下,或网络安全配置不生效,可通过自定义SSLSocketFactory手动启用TLS 1.0:

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

public class TLSSocketFactory extends SSLSocketFactory {
    private final SSLSocketFactory delegate;

    public TLSSocketFactory() {
        try {
            SSLContext sslContext = SSLContext.getInstance("TLSv1");
            sslContext.init(null, null, null);
            delegate = sslContext.getSocketFactory();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public String[] getDefaultCipherSuites() {
        return delegate.getDefaultCipherSuites();
    }

    @Override
    public String[] getSupportedCipherSuites() {
        return delegate.getSupportedCipherSuites();
    }

    @Override
    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
        return enableTLSOnSocket(delegate.createSocket(s, host, port, autoClose));
    }

    @Override
    public Socket createSocket(String host, int port) throws IOException {
        return enableTLSOnSocket(delegate.createSocket(host, port));
    }

    @Override
    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {
        return enableTLSOnSocket(delegate.createSocket(host, port, localHost, localPort));
    }

    @Override
    public Socket createSocket(InetAddress host, int port) throws IOException {
        return enableTLSOnSocket(delegate.createSocket(host, port));
    }

    @Override
    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
        return enableTLSOnSocket(delegate.createSocket(address, port, localAddress, localPort));
    }

    private Socket enableTLSOnSocket(Socket socket) {
        if (socket instanceof SSLSocket) {
            ((SSLSocket) socket).setEnabledProtocols(new String[]{"TLSv1"});
        }
        return socket;
    }
}

替换原代码中的SSLSocketFactory创建逻辑:

// 替换原SSLContext.getInstance相关代码
SSLSocketFactory sslSocketFactory = new TLSSocketFactory();

注意事项

  • 若设备使用自签名证书,需额外配置信任该证书,否则会弹出证书验证失败异常。可通过网络安全配置添加证书,或自定义X509TrustManager跳过验证(仅测试环境使用,生产环境不建议)。
  • TLS 1.0存在严重安全漏洞,仅在设备无法升级固件的前提下使用,后续应优先推动设备固件更新。

内容的提问来源于stack exchange,提问作者Hyndrix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:26:09