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

IBM MobileFirst Android端IPv6连接SSL握手异常求助

解决Worklight 7.1 Android应用IPv6网络下SSL握手异常问题

这问题我之前处理过不少类似的案例,核心是Worklight 7.x版本的默认网络组件对IPv6环境下的SSL证书验证支持不足,结合你给出的日志和配置信息,咱们一步步来拆解原因和解决方案:

问题根源分析

从报错javax.net.ssl.SSLPeerUnverifiedException: No peer certificate来看,本质是客户端在IPv6连接时无法正确获取或验证服务器的SSL证书链。主要诱因包括:

  • Worklight 7.1默认依赖的旧版Apache HttpClient对IPv6的兼容性较差,无法正确处理IPv6地址对应的证书验证逻辑
  • 服务器SSL证书的SAN(Subject Alternative Name)字段未覆盖应用配置的域名(uatdomain.com)或其对应的IPv6地址
  • DNS解析异常,导致域名无法正确映射到IPv6地址,进而触发证书验证失败

具体解决方案

1. 先检查服务器SSL证书的有效性

这是最常见的原因,优先排查:

  • 用openssl命令查看证书的SAN字段是否包含uatdomain.com或对应的IPv6地址:
    openssl s_client -connect uatdomain.com:443 -servername uatdomain.com | openssl x509 -noout -text
    
  • 如果输出中X509v3 Subject Alternative Name没有包含目标域名/IPv6,需要重新申请包含正确SAN的SSL证书。

2. 验证DNS解析的正确性

确保Android设备能将uatdomain.com解析到IPv6地址:

  • 用adb命令在设备上测试:
    adb shell nslookup uatdomain.com
    
  • 如果没有返回IPv6地址,需要检查设备的DNS服务器配置,确保使用支持IPv6解析的DNS(比如国内的240c::6666)。

3. 替换Worklight客户端的HTTP客户端实现

Worklight 7.1默认的Apache HttpClient版本过低,对IPv6支持有限,咱们可以自定义网络适配器来替换它:

  • 创建自定义WLClientNetworkObserver类,重写createHttpClient方法,使用支持IPv6的配置:
    import com.worklight.wlclient.api.WLClientNetworkObserver;
    import org.apache.http.client.HttpClient;
    import org.apache.http.conn.ClientConnectionManager;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.scheme.SchemeRegistry;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.params.HttpParams;
    
    public class CustomIPv6NetworkObserver extends WLClientNetworkObserver {
        @Override
        public HttpClient createHttpClient() {
            DefaultHttpClient defaultClient = (DefaultHttpClient) super.createHttpClient();
            ClientConnectionManager manager = defaultClient.getConnectionManager();
            HttpParams params = defaultClient.getParams();
            SchemeRegistry registry = manager.getSchemeRegistry();
    
            // 重新注册HTTPS协议,确保支持IPv6
            registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
            // 强制优先使用IPv6
            System.setProperty("java.net.preferIPv6Addresses", "true");
    
            return new DefaultHttpClient(manager, params);
        }
    }
    
  • 在应用启动时注册这个观察者(比如在MainActivity的onCreate方法中):
    import com.worklight.wlclient.api.WLClient;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WLClient.getInstance().registerNetworkObserver(new CustomIPv6NetworkObserver());
        // 其他初始化逻辑...
    }
    

4. 临时调整证书验证逻辑(仅测试环境使用)

如果是测试环境需要快速验证,可以临时自定义证书验证器跳过检查(生产环境绝对不能用,会带来安全风险):

import org.apache.http.conn.ssl.SSLSocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.KeyStore;
import java.security.cert.X509Certificate;

public class TrustAllSSLSocketFactory extends SSLSocketFactory {
    private SSLContext sslContext = SSLContext.getInstance("TLS");

    public TrustAllSSLSocketFactory(KeyStore truststore) throws Exception {
        super(truststore);
        X509TrustManager trustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) {}
            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) {}
            @Override
            public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
        };
        sslContext.init(null, new TrustManager[]{trustManager}, null);
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) {
        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
    }

    @Override
    public Socket createSocket() {
        return sslContext.getSocketFactory().createSocket();
    }
}

然后在自定义NetworkObserver中使用这个SocketFactory:

import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.impl.conn.ThreadSafeClientConnManager;
import org.apache.http.impl.client.DefaultHttpClient;

@Override
public HttpClient createHttpClient() {
    try {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        trustStore.load(null, null);
        TrustAllSSLSocketFactory sf = new TrustAllSSLSocketFactory(trustStore);
        sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

        HttpParams params = new BasicHttpParams();
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("https", sf, 443));
        ThreadSafeClientConnManager ccm = new ThreadSafeClientConnManager(params, registry);
        return new DefaultHttpClient(ccm, params);
    } catch (Exception e) {
        return super.createHttpClient();
    }
}

5. 检查Worklight服务器的IPv6支持

确保服务器端已经启用IPv6双栈支持:

  • 在服务器上执行netstat -an | grep 443,查看是否有IPv6的监听地址(比如:::443)
  • 如果没有,需要调整服务器的网络配置,开启IPv6监听

额外建议

Worklight 7.x版本已经停止官方支持,后续可能还会遇到更多兼容性问题,如果条件允许,建议升级到IBM MobileFirst Platform 8.x版本,它对IPv6和现代网络协议的支持更完善。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:13:08