文档章节

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
昌平
高级程序员
私信 提问
【项目管理】软件项目经理须知的 Java 8 安全知识

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

军雷
2017/06/08
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
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
制裁失败,沃通新证书上线价格保持不变

前一段时间,苹果、谷歌、火狐等相继宣布停止信任沃通证书的事件,曾闹得满城风雨,大家似乎都在制裁沃通。 不过,沃通在11月21日摇身一变成为了 Certum CA 的 SSL 证书转售商,发布了一篇新...

王练
2016/11/24
3.1K
7
Java Source Attacher 1.2 发布

Java Source Attacher 1.2 是一款自动帮你附加源代码的Eclipse插件,相信很多Java Coder都有过手动附加源代码的经历,去网上搜索,然后下载下来,最后附加上,很麻烦,而且很费时间,现在Jav...

JoeyBlue
2012/02/26
3.2K
9

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
9分钟前
0
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
15分钟前
0
0
《告诉你真实的美国教育》的读后感3900字

《告诉你真实的美国教育》的读后感3900字: 文章的开篇分析了我们耳熟能详的关于美国教育的小故事,就是那个因为幼儿园的老师教了“0”这个字母,然后妈妈告老师剥夺了孩子的想象力,再然后幼...

原创小博客
23分钟前
0
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
38分钟前
1
0
exportfs命令, vsftp搭建ftp服务

exportfs命令 当修改/etc/exports文件后,更改的内容是不会立即生效的。如果重启nfs服务,会导致客户端重启期间的请求是挂起等待的,可以把客户端的挂载umount进行卸载后,再重启nfs服务,但...

野雪球
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部