文档章节

java自动获取安装在线数字证书

~少司命~
 ~少司命~
发布于 2013/03/19 15:15
字数 895
阅读 44
收藏 0

想飞的鳄鱼话费充值店,店名:与你同行话费充值专营店  

本人开了家网店,http://shop111296428.taobao.com ,店名:与你同行 ,是搞话费充值的,可以充值全国所有地区,三大运营商:中国移动中国联通中国电信.,全部是进货价处理,希望大家多多捧场,不求赚钱,只求好评.谢谢大家.

 


主要原理是:使用socket尝试对目标服务器进行通信,如果通信失败,证明没有证书,不过此时的证书已悄悄发送到客户端了。


以前写过这个工具类了: http://leisuredev.iteye.com/admin/blogs/714742
今天稍微注释并整理了一个版本:

  1  package  com.leisure.cert;
  2 
  3  import  java.io.File;
  4  import  java.io.FileInputStream;
  5  import  java.io.FileOutputStream;
  6  import  java.io.InputStream;
  7  import  java.io.OutputStream;
  8  import  java.security.KeyStore;
  9  import  java.security.cert.CertificateException;
 10  import  java.security.cert.X509Certificate;
 11 
 12  import  javax.net.ssl.HostnameVerifier;
 13  import  javax.net.ssl.HttpsURLConnection;
 14  import  javax.net.ssl.SSLContext;
 15  import  javax.net.ssl.SSLSession;
 16  import  javax.net.ssl.SSLSocket;
 17  import  javax.net.ssl.SSLSocketFactory;
 18  import  javax.net.ssl.TrustManager;
 19  import  javax.net.ssl.TrustManagerFactory;
 20  import  javax.net.ssl.X509TrustManager;
 21 
 22  /**
 23   * 
 24   * Java在线自动获取并安装证书工具类
 25   *  @author  Leisure
 26   *  @version  1.1
 27   * 
 28    */
 29  public   class  CertManager {
 30 
 31       public   static   void  main(String[] args) {
 32           try  {
 33              trustCert( " d:\\ " " www.google.com.hk " 443 " changeit " );
 34          }  catch  (Exception e) {
 35              e.printStackTrace();
 36          }
 37      }
 38      
 39       /**
 40       * 
 41       *  @param  dir        证书所在路径
 42       *  @param  host        主机地址
 43       *  @param  port        端口
 44       *  @param  password    证书密码
 45       *  @throws  Exception
 46        */
 47       public   static   void  trustCert(String dir, String host,  int  port, String password)  throws  Exception {
 48           //  如果证书颂给的名称与所通信的域名不一致的话,那么需要重写校验方法
 49          HostnameVerifier hv  =   new  HostnameVerifier() {
 50              @Override
 51               public   boolean  verify(String urlHostName, SSLSession session) {
 52                   return  urlHostName.equals(session.getPeerHost());
 53              }
 54          };
 55          HttpsURLConnection.setDefaultHostnameVerifier(hv);
 56 
 57           //  信任管理器工厂
 58          TrustManagerFactory tmf  =  TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
 59          File file  =   new  File(dir  +  host  +   " .cer " );
 60          file  =  makeSureFile(file);
 61          KeyStore ks  =  getKeyStore(file, password);
 62          tmf.init(ks);
 63          
 64          SSLContext context  =  SSLContext.getInstance( " SSL " );
 65          X509TrustManager defaultTrustManager  =  (X509TrustManager) tmf.getTrustManagers()[ 0 ];
 66          SavingTrustManager tm  =   new  SavingTrustManager(defaultTrustManager);
 67          context.init( null new  TrustManager[] { tm },  null );
 68          
 69           //  尝试使用socket对目标主机进行通信
 70          SSLSocketFactory factory  =  context.getSocketFactory();        
 71          SSLSocket socket  =  (SSLSocket)factory.createSocket(host, port);
 72          socket.setSoTimeout( 1000 );
 73           try  {
 74               //  如果直接通信没问题的话,就不会报错,也不必获取证书
 75               //  如果报错的话,很有可能没有证书
 76              socket.startHandshake();
 77          }  catch (Exception e) {
 78              e.printStackTrace();
 79          }  finally  {
 80               if (socket  !=   null ) {
 81                   try  {
 82                      socket.close();
 83                  }  catch (Exception e) {}        
 84                  socket  =   null ;
 85              }
 86              X509Certificate[] chain  =  tm.getChain();
 87               if (chain  !=   null ) {
 88                  System.out.println( " 服务器返回: "   +  chain.length  +   "  个证书 " );
 89                  OutputStream out  =   null ;
 90                   for ( int  i  =   0 ; i  <  chain.length; i ++ ) {
 91                       try  {                        
 92                          X509Certificate x509Cert  =  chain[i];
 93                          String alias  =  host  +  (i  >   0   ?  i  +   ""  :  "" );
 94                          ks.setCertificateEntry(alias, x509Cert);
 95                          
 96                          String certFile  =  dir  +  alias  +   " .cer " ;
 97                          out  =   new  FileOutputStream(certFile);
 98                          ks.store(out, password.toCharArray());
 99                          out.close();
100                          
101                          System.setProperty( " javax.net.ssl.trustStore " , certFile);
102                          System.out.println( " "   +  (i  +   1 +   " 个证书安装成功 " );
103                      }  catch (Exception e) {
104                          e.printStackTrace();
105                           continue ;
106                      }  finally  {
107                           try  {
108                               if (out  !=   null ) {
109                                  out.close();
110                              }
111                              out  =   null ;
112                          }  catch (Exception e) {}
113                      }
114                  }
115              }
116          }
117      }
118      
119       /**
120       * 确保文件存在
121       *  @param  file
122       *  @return
123        */
124       private   static  File makeSureFile(File file) {
125           if  (file.isFile()  ==   false ) {
126               char  SEP  =  File.separatorChar;
127              File dir  =   new  File(System.getProperty( " java.home " +  SEP  +   " lib "      +  SEP  +   " security " );
128              file  =   new  File(dir, file.getName());
129               if  (file.isFile()  ==   false ) {
130                  file  =   new  File(dir,  " cacerts " );
131              }
132          }
133           return  file;
134      }
135      
136       /**
137       * 获取keystore
138       *  @param  file
139       *  @param  password
140       *  @return
141       *  @throws  Exception
142        */
143       private   static  KeyStore getKeyStore(File file, String password)  throws  Exception {
144          InputStream in  =   new  FileInputStream(file);
145          KeyStore ks  =  KeyStore.getInstance(KeyStore.getDefaultType());
146           char [] passphrase  =  password.toCharArray();
147          ks.load(in, passphrase);
148          in.close();
149           return  ks;
150      }
151      
152       public   static   class  SavingTrustManager  implements  X509TrustManager {
153           private   final  X509TrustManager tm;
154           private  X509Certificate[] chain;
155 
156           public  SavingTrustManager(X509TrustManager tm) {
157               this .tm  =  tm;
158          }
159          
160           public  X509TrustManager getTM() {
161               return  tm;
162          }
163          
164           public  X509Certificate[] getChain() {
165               return  chain;
166          }
167          
168           public  X509Certificate[] getAcceptedIssuers() {
169               throw   new  UnsupportedOperationException();
170          }
171 
172           public   void  checkClientTrusted(X509Certificate[] chain, String authType)
173                   throws  CertificateException {
174               throw   new  UnsupportedOperationException();
175          }
176 
177           public   void  checkServerTrusted(X509Certificate[] chain, String authType)
178                   throws  CertificateException {
179               this .chain  =  chain;
180              tm.checkServerTrusted(chain, authType);
181          }
182      }
183  }
184

本文转载自:http://www.blogjava.net/leisure/archive/2011/09/18/358655.html

共有 人打赏支持
~少司命~
粉丝 3
博文 76
码字总数 8735
作品 0
昌平
高级程序员
Tomcat在Linux上的安装与配置

Tomcat在Linux上的安装与配置 以下使用的Linux版本为: Redhat Enterprise Linux 7.0 x86_64,Tomcat版本为tomcat-7.0.54. 1.下载JDK与Tomcat. jdk下载地址: http://www.oracle.com/technetwo......

不忘初心77
06/26
0
0
java加密解密与数字证书的操作

1 Java程序实现密钥库的维护 1.1 Java程序列出密钥库所有条目 import java.util.; import java.io.; import java.security.*; public class ShowAlias{ public static void main(String arg......

happyhuangjinjin
04/24
0
0
Java常见问题集锦(来自Sun中国官方站)

发表日期:2003年11月28日 已经有91位读者读过此文 原文链接:http://blog.csdn.net/jaminwm/article/details/90376

晨曦之光
2012/03/09
0
0
keytool生成证书与Tomcat SSL配置

一、Keytool介绍 Keytool是一个Java数据证书的管理工具。Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据: 1. 密钥实体(Key entity)...

Lofo
2014/09/16
0
0
webservice ssl 2 keyStore和truststore区别

keystore或者truststore主要是针对于应用本身的需求来的。 keystore和truststore从其文件格式来看其实是一个东西,只是为了方便管理将其分开 keystore中一般保存的是我们的私钥,用来加解密或...

Zhao-Qian
2015/06/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

原型模式

1、原型模式-定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 克隆(浅度克隆->拷贝值类型或者引用,深度克隆->创建新的对象,开辟新的内存) 例如客户端知道抽象Pro...

阿元
今天
47
0
awk命令扩展使用操作

awk 中使用外部shell变量 示例1 [root@centos01 t1022]# A=888[root@centos01 t1022]# echo "" | awk -v GET_A=$A '{print GET_A}'888[root@centos01 t1022]# echo "aaaaaaaaaaaaa" | aw......

野雪球
今天
41
0
深入解析MySQL视图VIEW

Q:什么是视图?视图是干什么用的? A:视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。   通过视图,可以展现基表的部分数据;...

IT--小哥
今天
45
0
虚拟机学习之二:垃圾收集器和内存分配策略

1.对象是否可回收 1.1引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能...

贾峰uk
今天
40
0
smart-doc功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
47
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部