zoukankan      html  css  js  c++  java
  • http请求No peer certificate的解决方法

    不少同学在做HTTP请求新浪授权或新浪数据的时候会出现 javax.net.ssl.SSLPeerUnverifiedException: No peer certificate的异常。现给出解决方法(已通过测试)。


    写了一个自定义类继承SSLSocketFactory:

    1. import java.io.IOException;
    2. import java.net.Socket;
    3. import java.net.UnknownHostException;
    4. import java.security.KeyManagementException;
    5. import java.security.KeyStore;
    6. import java.security.KeyStoreException;
    7. import java.security.NoSuchAlgorithmException;
    8. import java.security.UnrecoverableKeyException;

    9. import javax.net.ssl.SSLContext;
    10. import javax.net.ssl.TrustManager;
    11. import javax.net.ssl.X509TrustManager;

    12. import org.apache.http.conn.ssl.SSLSocketFactory;

    13. public class SSLSocketFactoryEx extends SSLSocketFactory {
    14.        
    15.         SSLContext sslContext = SSLContext.getInstance("TLS");
    16.        
    17.         public SSLSocketFactoryEx(KeyStore truststore)
    18.                         throws NoSuchAlgorithmException, KeyManagementException,
    19.                         KeyStoreException, UnrecoverableKeyException {
    20.                 super(truststore);
    21.                
    22.                 TrustManager tm = new X509TrustManager() {
    23.                         public java.security.cert.X509Certificate[] getAcceptedIssuers() {return null;}  
    24.    
    25.             @Override  
    26.             public void checkClientTrusted(
    27.                             java.security.cert.X509Certificate[] chain, String authType)
    28.                                             throws java.security.cert.CertificateException {}  
    29.    
    30.             @Override  
    31.             public void checkServerTrusted(
    32.                             java.security.cert.X509Certificate[] chain, String authType)
    33.                                             throws java.security.cert.CertificateException {}
    34.         };  
    35.         sslContext.init(null, new TrustManager[] { tm }, null);  
    36.     }  
    37.    
    38.     @Override  
    39.     public Socket createSocket(Socket socket, String host, int port,boolean autoClose) throws IOException, UnknownHostException {  
    40.             return sslContext.getSocketFactory().createSocket(socket, host, port,autoClose);  
    41.     }  
    42.    
    43.     @Override  
    44.     public Socket createSocket() throws IOException {  
    45.         return sslContext.getSocketFactory().createSocket();  
    46.     }  
    47. }
    复制代码



    再来看看如何做回调:

    1. public static HttpClient getNewHttpClient() {  
    2.         try {  
    3.             KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());  
    4.             trustStore.load(null, null);  
    5.             
    6.             SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore);  
    7.             sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);  
    8.    
    9.             HttpParams params = new BasicHttpParams();  
    10.             HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
    11.             HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);  
    12.    
    13.             SchemeRegistry registry = new SchemeRegistry();  
    14.             registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));  
    15.             registry.register(new Scheme("https", sf, 443));  
    16.    
    17.             ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);  
    18.    
    19.             return new DefaultHttpClient(ccm, params);  
    20.         } catch (Exception e) {  
    21.             return new DefaultHttpClient();  
    22.         }  
    23.     }  
    复制代码

    现在就可以拿这个HTTPClient去请求数据了!!!!!GOOD

     
  • 相关阅读:
    总结6.6 PHP后台登录和文件上传
    【017期】JavaSE面试题(十七):JVM之内存模型
    【016期】JavaSE面试题(十六):反射
    【015期】JavaSE面试题(十五):网络IO流
    【014期】JavaSE面试题(十四):基本IO流
    【013期】JavaSE面试题(十三):多线程(3)
    【012期】JavaSE面试题(十二):多线程(2)
    【011期】JavaSE面试题(十一):多线程(1)
    【010期】JavaSE面试题(十):集合之Map
    【009期】JavaSE面试题(九):集合之Set
  • 原文地址:https://www.cnblogs.com/xgjblog/p/3834133.html
Copyright © 2011-2022 走看看