文档章节

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

~少司命~
 ~少司命~
发布于 2013/03/19 15:15
字数 895
阅读 185
收藏 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
昌平
高级程序员
私信 提问
加载中

评论(0)

Oracle透露关于Java安全性的改进计划

  【IT168 专稿】据国外媒体报道,Oracle正在进行一个Java改进计划,以加强其自身的安全性。报道称,改进的主要内容包括了修正其证书吊销检查功能,在默认情况下该功能是启用状态,以防止未...

作者:王晓东
2013/06/04
0
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
2018/06/26
0
0
【项目管理】软件项目经理须知的 Java 8 安全知识

【译者按】作为软件研发项目的项目经理,只懂项目管理知识是不够的,需要对软件技术本身有基本的了解。Java 是一种主流的系统开发语言,其安全设计对于构建安全的信息系统有至关重要的意义。...

军雷
2017/06/08
0
0
Java环境搭建(Eclipse和jdk)

一、jdk下载与安装 登录Oracle官网: http://www.oracle.com/index.html 点击同意证书再下载 下载jdk-12.0.1windows-x64bin.exe后安装。 配置环境变量 将jdk的bin目录路径添加至环境变量中。...

osc_a9b6fe4t
2019/06/22
1
0
shiro 单点登录原理 实例

原创 2017年02月08日 17:39:55 4006 Shiro 1.2开始提供了Jasig CAS单点登录的支持,单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任...

osc_gpaqd6ej
2018/03/12
2
0

没有更多内容

加载失败,请刷新页面

加载更多

JavaWeb基础-Junit\反射\注解

一、Junit单元测试 对于测试分为黑盒测试和白盒测试,Junit属于白盒测试,需要在程序中写入代码。 Junit测试步骤: 1.定义一个测试类,类名命名格式: 包名package:XXX.test 被测试类+Test...

osc_cgh49c55
17分钟前
11
0
Vue-组件、传值props

目录 一、全局组件-关键词component 一、局部组件 二、子父组件-父向子组件传递数值 Props关键字: 三-子组件向父组件传值 四、组件插槽 五、具名插槽 必须先注册组件才能够使用 一、全局组件...

osc_2sv5yx4m
19分钟前
11
0
idea 打war包, 部署到本地服务器上

.先保证把项目跑起来, .修改pom文件中的jar改成war ..即:<packaging>war</packaging> .maven project中 ..clean一下 ..install一下 .然后去仓库找已经打好的war包, ..默人仓库在.m2里面 ..找...

阿_宁
20分钟前
14
0
Java-函数式接口Lambda,注解的使用

有且只有一个抽象方法的接口。函数式接口适用于函数式编程,在java函数式编程的体现就是 Lambda:()->{} 特点: 延迟加载(解释:满足条件执行,不满足条件不执行,避免性能浪费) 定义格式...

osc_97kpb2b5
20分钟前
11
0
GreenPlum 每个连接资源消耗的想法

早在1月份,发现gp的master上conn占用内存太高了,只是方式没有一起足够的重视,才导致了这次事故的发生。 我们如何得知某个conn被哪些PPID 执行过? 通过该命令可以得知posgrePID一共fork了...

osc_zgt6zhsy
21分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部