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
相关产品推荐
相关产品推荐

