ゞ沉默是金ゞ

          魚(yú)離不開(kāi)水,但是沒(méi)有說(shuō)不離開(kāi)哪滴水.
          posts - 98,comments - 104,trackbacks - 0

          I use Apache’s HttpClient library for all my URL related needs. It is a marvelous library that does most of the job behind the scenes. Compared the Java’s URL class, it is not as easy to use as Apache’s HttpClient. While using this library, a site that I commonly check for updates threw the exception message javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated.

          When I checked the site, it seemed that its SSL certificated had expired. The only workaround for this is to create your own TrustManager. This class actually checks if the SSL certificate is valid. The scheme used by SSL is called X.509 and Java has a specific TrustManager for this scheme, called X509TrustManager.

          This handy method created by theskeleton is just the perfect solution to have your HttpClient object bypass any SSL related errors and ensures that it accepts all SSL certificates of a site, whether it is expired or not.


          public static HttpClient wrapClient(HttpClient base) {
              
          try {
                  SSLContext ctx 
          = SSLContext.getInstance("TLS");
                  X509TrustManager tm 
          = new X509TrustManager() {
                      
          public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException { }
           
                      
          public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException { }
           
                      
          public X509Certificate[] getAcceptedIssuers() {
                          
          return null;
                      }
                  };
                  ctx.init(
          nullnew TrustManager[]{tm}, null);
                  SSLSocketFactory ssf 
          = new SSLSocketFactory(ctx);
                  ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
                  ClientConnectionManager ccm 
          = base.getConnectionManager();
                  SchemeRegistry sr 
          = ccm.getSchemeRegistry();
                  sr.register(
          new Scheme("https", ssf, 443));
                  
          return new DefaultHttpClient(ccm, base.getParams());
              } 
          catch (Exception ex) {
                  
          return null;
              }
          }

          Another way is to recreate the keystore, for the keystore you should have the site in the CN=XXX.
          the command as below:
          1. Create keystore
          keytool -genkey -dname "cn=daXXX.XXX.com,o=,c=" -storepass MB7BROKERpzn -keystore pznKeyStore.jks -alias pznsigned
          2. Export the cert
          keytool -export -keystore pznKeyStore.jks -alias pznsigned -file pznsslcert.cer
          3. Create trust store for client
          keytool -genkey -dname "cn=da957203.fmr.com,o=,c=" -storepass MB7BROKERpzn -keystore pznTrustStore.jks -alias pzntrustsigned
          4. import the server cert
          keytool -import -alias pzntrust -file pznsslcert.cer -keystore pznTrustStore.jks -storepass MB7BROKERpzn
          5. use http client to call the server
                  try {
                      KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
                      FileInputStream instream = new FileInputStream(new File(trustfname));
                      try {
                          trustStore.load(instream, passphrase.toCharArray());
                      } finally {
                          try { instream.close(); } catch (Exception ignore) {}
                      }
                      SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
                      Scheme sch = new Scheme("https", 443, socketFactory);
                      httpclient.getConnectionManager().getSchemeRegistry().register(sch);
                  } catch (Exception e1) {
                      // TODO Auto-generated catch block
                      e1.printStackTrace();
                  }





          posted on 2012-08-14 18:42 ゞ沉默是金ゞ 閱讀(3646) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): HTTP

          FeedBack:
          # re: How To Avoid javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated Problem Using Apache HttpClient
          2012-10-03 23:53 | shigangxing
          Another way is to recreate the keystore...
          有兩個(gè)問(wèn)題不清楚,呵呵:
          1,為什么要分開(kāi)創(chuàng)建兩個(gè)keystore
          2,兩個(gè)cn的值貌似不同,都是網(wǎng)站的域名么  回復(fù)  更多評(píng)論
            
          # re: How To Avoid javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated Problem Using Apache HttpClient
          2012-11-29 10:22 | dashi99
          @shigangxing
          There are two types of SSL connection:
          a. Server auth: The client needs to trust the server. The server presents a key to the client which the client must trust. This is known as 1 way or asymetric auth.
          b. Client auth: Both client and server need to trust each other. In addition to the server presenting its key to the client, here the client also presents a key to the server which the server must trust. This is also known as two way or symmetric auth.

            回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 达尔| 安多县| 竹山县| 海宁市| 贺州市| 文安县| 南阳市| 岳阳县| 泊头市| 彭阳县| 洛川县| 海兴县| 克东县| 宁明县| 榆中县| 上杭县| 揭阳市| 巴塘县| 富平县| 罗定市| 眉山市| 道孚县| 溆浦县| 东明县| 溧水县| 淮北市| 农安县| 玉田县| 集贤县| 日喀则市| 邯郸市| 临武县| 辛集市| 广元市| 灌云县| 楚雄市| 法库县| 古丈县| 江华| 定远县| 洛阳市|