文档章节

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

~少司命~
 ~少司命~
发布于 2013/03/19 15:15
字数 895
阅读 43
收藏 0
点赞 0
评论 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

© 著作权归作者所有

共有 人打赏支持
~少司命~
粉丝 3
博文 58
码字总数 8323
作品 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

加强Docker容器与Java 10集成

很多运行在Java虚拟机(JVM)中的应用,包括数据服务如Apache Spark和Kafka以及传统企业应用,都运行在容器中。最近,运行在容器里的JVM出现了由于内存和CPU资源限制和使用率导致性能损失问题...

java高级架构牛人 ⋅ 06/04 ⋅ 0

在win10下安装eclipse

在win10下安装eclipse 原创 2017年06月02日 20:39:59 24343 今天换了新电脑,需要在win10中重新安装eclipse。 1、在官网下载jdk。目前最新版本为jdk8。 http://www.oracle.com/technetwork/...

linjin200 ⋅ 04/23 ⋅ 0

解决PKIX path building failed

/** @author wyj @create 2018-06-01 09:41 **/import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.Input......

JavaJar ⋅ 06/01 ⋅ 0

OpenRASP v0.31 支持 resin 服务器并解决 JDK 兼容性

OpenRASP v0.31 已发布,OpenRASP 是百度安全推出的一款免费、开源的自适应安全产品 更新如下: 重大变更 Java 版本 在升级前,用户需要手动删除 rasp/conf/rasp-log4j.xml 文件 待应用启动后...

OpenRASP ⋅ 05/22 ⋅ 0

Java IDEA中安装配置JDK、Gradle

现在大多数IDE都没有集成JDK环境,IDEA也是一样,在使用IDEA之前首先要安装JDK,并且配置环境变量。与其他IDE不同之处在于,IDEA是不会自动匹配系统的JDK环境。如果在IDEA里面没有配置JDK,运...

blueberry_liang ⋅ 04/11 ⋅ 0

用Java这么多年,这些秘密你知道吗?

摘要: 如果您是Java开发人员,那么这些问题可能会让您在某个时刻头痛不已。继续阅读以了解如何处理这5个棘手的秘密。 Java是一个拥有悠久历史的大型语言。在二十多年的时间里,语言中蕴含着...

James- ⋅ 05/11 ⋅ 0

CentOS 6.5 安装JDK(包含卸载原有默认JDK)

卸载原有1.7 JDK 查看是否安装了JDK 若有内容就进一步查看JDK信息 卸载 安装jdk ===================================== 安装wget 新建目录 进入目录 下载JDK 安装JDK 配置环境变量 往文件内...

阿白 ⋅ 05/23 ⋅ 0

【Java学习】Win10下最新Java环境配置

【背景】 最近小编开始学习Java知识了,所以需要安装JDK,配置java环境,但小编学习的资料里的配置教程是xp系统的,与现编使用的Win10系统配置步骤不一样,所以小编觉得需要记录一下,Win10...

yym15732626210 ⋅ 03/24 ⋅ 0

Freebsd8.4 安装jdk心得分享

最近在搞Freebsd,首先熟悉了下系统的安装配置,这里就不在多说了。接下来尝试装个java运行环境,遇到各种问题呀 在网上找了许多资料找了各种配置文件,由于我本机装的是freebsd 8.4-RELEASE...

zhangdiandong ⋅ 2013/09/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 29分钟前 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 30分钟前 ⋅ 0

Redux的一些手法记录

Redux Redux的基本概念见另一篇文。 这里记录一下Redux在项目中的实际操作的手法。 actions 首先定义action.js,actions的type,可以另起一个action-type.js文件。 action-type.js用来存...

LinearLaw ⋅ 31分钟前 ⋅ 0

android 手势检测(左右滑动、上下滑动)

GestureDetector类可以让我们快速的处理手势事件,如点击,滑动等。 使用GestureDetector分三步: 1. 定义GestureDetector类 2. 初始化手势类,同时设置手势监听 3. 将touch事件交给gesture...

王先森oO ⋅ 45分钟前 ⋅ 0

java 方法的执行时间监控 设置超时(Future 接口)

java 方法的执行时间监控 设置超时(Future 接口) import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor......

青峰Jun19er ⋅ 50分钟前 ⋅ 0

一名开源小白的Apache成长自述

今天收到了来自Apache Vote我成为Serviceomb项目Committer的邮件,代表自己的贡献得到了充分的肯定;除了感谢团队的给力支持,我更希望将自己的成长经历——如何践行Apache Way的心得介绍给大...

微服务框架 ⋅ 52分钟前 ⋅ 0

vim介绍、颜色显示和移动光标、一般模式下复制、剪切和粘贴

1.vim 是 vi 的升级版 vim 是带有颜色显示的 mini安装的系统,一般都不带有vim [root@aminglinux-128 ~]# yum install -y vim-enhanced已加载插件:fastestmirror, langpacksLoading mir...

oschina130111 ⋅ 52分钟前 ⋅ 0

Deepin 操作系统四面楚歌

作为国内做的最好的 Linux 发行版,源自 Debian sid 的 Deepin 目前正面临重重困境,新版本不断延期,开发人员离职,bug 长期得不到修复,和 Debian/Ubuntu 的兼容性问题也面临越来越严重的挑...

六库科技 ⋅ 52分钟前 ⋅ 0

MyBatis之动态sql

我们需要知道的是,使用mybatis重点是对sql的灵活解析和处理。在原先的UserMappser.xml中,我们这样查询表中满足条件的记录 : 123 <select id="findUserList" parameterType="userQuery...

瑟青豆 ⋅ 53分钟前 ⋅ 0

这届俄罗斯世界杯的冷门那么多怎么办?

最纯粹的世界杯,最神奇的大冷门。 德国0比1被墨西哥摩擦了。 日本历史性的赢了哥伦比亚。 C罗也挑平了西班牙。 梅西被冰岛狮吼吼愣神了。 就连11次进世界杯4强的巴西也被瑞士逼平了。 天台已...

开源中国众包平台 ⋅ 54分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部