android javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

本文提供了一种解决跨设备SSL登录兼容性问题的方法。通过自定义SSLSocketFactoryEx和HttpClient来信任所有证书,确保应用程序能在不同系统和设备上稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做项目,界面有选择使用SSL登陆或非SSL登陆,发现本来可以登陆的程序刷系统或者换机器登陆不了,痛苦了好一会儿,解决了,如下为解决方案,项目中用的挺帅的 

第一步:编写SSLSocketFactoryEx,以代替原有的SSLSocketFactory,代码如下 
import org.apache.http.conn.ssl.SSLSocketFactory; 
public class SSLSocketFactoryEx extends SSLSocketFactory {      
      
    SSLContext sslContext = SSLContext.getInstance("TLS");      
      
    public SSLSocketFactoryEx(KeyStore truststore)      
            throws NoSuchAlgorithmException, KeyManagementException,      
            KeyStoreException, UnrecoverableKeyException {      
        super(truststore);      
      
        TrustManager tm = new X509TrustManager() {      
      
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {      
                return null;      
            }      
      
            @Override      
            public void checkClientTrusted(      
                    java.security.cert.X509Certificate[] chain, String authType)      
                    throws java.security.cert.CertificateException {      
      
            }      
      
            @Override      
            public void checkServerTrusted(      
                    java.security.cert.X509Certificate[] chain, String authType)      
                    throws java.security.cert.CertificateException {      
      
            }      
        };      
      
        sslContext.init(null, new TrustManager[] { tm }, null);      
    }      
      
    @Override      
    public Socket createSocket(Socket socket, String host, int port,      
            boolean autoClose) throws IOException, UnknownHostException {      
        return sslContext.getSocketFactory().createSocket(socket, host, port,      
                autoClose);      
    }      
      
    @Override      
    public Socket createSocket() throws IOException {      
        return sslContext.getSocketFactory().createSocket();      
    }      
}  


第二步:编写新的HttpClient  getNewHttpClient来代替原有DefaultHttpClient,代码如下: 
public static HttpClient getNewHttpClient() { 
   try { 
       KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
       trustStore.load(null, null); 

       SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore); 
       sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

       HttpParams params = new BasicHttpParams(); 
       HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
       HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 

       SchemeRegistry registry = new SchemeRegistry(); 
       registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
       registry.register(new Scheme("https", sf, 443)); 

       ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

       return new DefaultHttpClient(ccm, params); 
   } catch (Exception e) { 
       return new DefaultHttpClient(); 
   } 


第三步;接着在项目里把所有获得HttpClient实例通过DefaultHttpClient,都改成从 
getNewHttpClient获取 
//HttpClient hc = new DefaultHttpClient(httpParams); 
//modified by lucky.lan@2012/05/10 
HttpClient hc = ConnectionManager.getNewHttpClient() ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值