原文地址:https://my.oschina.net/u/157514/blog/395238

之前一篇中说了如何 建立 https 通信的完整流程,其中涉及了java web容器 tomcat,关于它的配置是:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"          SSLEnabled="true"      maxThreads="150" scheme="https" secure="true"clientAuth="true" sslProtocol="TLS" keystoreFile="D:\ssl\server.keystore" keystorePass="123456"    truststoreFile="D:\ssl\server.keystore" truststorePass="123456"/>

对应的keyStore(包括私钥库和受信任证书库)是在tomcat启动时一次性加载到内存中的。

大多数的场景这就够了,但是如果 要构建一个 基于https、受信任证书的 权限验证体系,像上边的那样 一次性加载 keyStore 就算 我们从键库中删除某个证书,程序是没办法探知的。我急需一种热加载 keyStore的技术。

我们修改对应的配置为

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"maxThreads="150" scheme="https" secure="true"clientAuth="true" sslProtocol="TLS" keystoreFile="d:/ssl/server.keystore" keystorePass="123456" trustManagerClassName="MyTrustManager"/>

这里 自己的私钥键库是不需要也是不能重新加载的,关键在与证书键库,我们创建了一个在自定义的类叫

MyTrustManager 用来管理受信任证书,他需要实现接口 X509TrustManager 并提供一个无参的构造函数。

然后将其打包成jar后,部署到tomcat的lib目录(注意connector是在tomcat启动时构建的,所以代码不能放在你自己的web项目里,因为当时tomcat还没有classLoad你的类呢)下边是参考代码

public class MyTrustManager implements X509TrustManager {public MyTrustManager(){}@Overridepublic void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {System.out.println("check");if(x509Certificates==null||x509Certificates.length==0||s==null||s.length()==0) throw new IllegalArgumentException();KeyStore store=getKeyStore();boolean pass=false;try {for(X509Certificate certificate:x509Certificates){certificate.checkValidity();String theAlias = store.getCertificateAlias(certificate);if(theAlias!=null)pass=true;}} catch (KeyStoreException e) {e.printStackTrace();}System.out.println("pass "+pass);if(!pass)throw new  CertificateException();}@Overridepublic void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {if(x509Certificates==null||x509Certificates.length==0||s==null||s.length()==0) throw new IllegalArgumentException();for(X509Certificate certificate:x509Certificates){certificate.checkValidity();}}@Overridepublic X509Certificate[] getAcceptedIssuers() {ArrayList<X509Certificate> trusts=new ArrayList<X509Certificate>();try {KeyStore store=getKeyStore();Enumeration<String> alias = store.aliases();while (alias.hasMoreElements()){String name = alias.nextElement();if(store.isCertificateEntry(name)){X509Certificate trust = (X509Certificate) store.getCertificate(name);trusts.add(trust);}}} catch (Exception e) {e.printStackTrace();}X509Certificate[] trustsArr = trusts.toArray(new X509Certificate[0]);System.out.println("return trust array "+trustsArr.length);return trustsArr;}private KeyStore getKeyStore() throws CertificateException {try {KeyStore store = KeyStore.getInstance(KeyStore.getDefaultType());store.load(new FileInputStream("D:/ssl/server.keystore"),"123456".toCharArray());return store;} catch (Exception e) {e.printStackTrace();throw new CertificateException();}}
}

getAcceptedIssuers 返回server端的所有信任的证书,这样client (比如浏览器)才知道应该挑选哪些它所拥有的证书来询问你,证书必须是双方都认识的。

checkClientTrusted  是对client提交过来的证书进行验证,certificate.checkValidity();验证证书是否过期,store.getCertificateAlias(certificate)从自己的键库中寻找对应的证书,不存在返回null,发现验证不通过 就自己手动抛出一个异常CertificateException,这样容器就知道如何处理了。

getKeyStore中是加载键库,由于每次验证时才加载键库,所以就实现了热加载。当然为了性能你可以把keyStore放到某个全局变量里,在需要的时候对其进行reload。

综上所述,你可以实现一个通过添加信任证书的方式来对请求方进行控制的系统了。

注意:https为了性能在建立了SSL-SESSION之后允许不再进行证书验证,你在浏览器里访问做实验需要关闭浏览器后重新访问才会看到keyStore更新生效,你也可以通过代码设法销毁SSL-SESSION让每次https请求都重新握手验证。参考:http://blog.csdn.net/ibznphone/article/details/7846879

实现 tomcat 热加载证书相关推荐

  1. tomcat热加载、热部署-源码解析

    上文:tomcat线程模型-源码解析 热加载和热部署是什么? 请查看原来的写过的文章:热部署和热加载有什么区别? tomcat热加载和执热部署都是通过后台进程检测项目中的.class和目录是否发生变化 ...

  2. 热加载和热部署,没听过?看看 Tomcat 是怎么实现的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 不学无数的程序员 来源 | https://urlify ...

  3. 京东 java 研发岗二面:Tomcat 是如何做到热加载和热部署的?

    前言 热部署就是在服务器运行时重新部署项目,热加载即在在运行时重新加载 class,从而升级应用. 通常情况下在开发环境中我们使用的是热加载,因为热加载的实现的方式在 Web 容器中启动一个后台线程, ...

  4. 死磕Tomcat系列(6)——Tomcat如何做到热加载和热部署的

    死磕Tomcat系列(6)--Tomcat如何做到热加载和热部署的 热部署就是在服务器运行时重新部署项目,热加载即在在运行时重新加载class,从而升级应用. 通常情况下在开发环境中我们使用的是热加载 ...

  5. java 不重启部署_编译Java类后不重启Tomcat有两种方式:热部署、热加载

    不重启Tomcat有两种方式:热部署.热加载 热部署:容器状况在运行时重新部署整个项目.这类环境下一般整个内存会清空,重新加载,这类方式 有可能会造成sessin丢失等环境.tomcat 6确实可以热 ...

  6. tomcat 热部署、热加载 精析

    1.前言 找了很多篇文章,没有一篇文章讲的清晰.明了,很多人只是会用,但不是能真正说明白,这年头找个懂理论的,真难! 2.热部署 原定义:tomcat处于运行状态时,能够监测webapps下的文件,如 ...

  7. spring boot的热加载(hotswap)

    官网上是叫hotswap,有人翻译成热部署,有人翻译成热加载 个人倾向于使用热加载在这个词,和谷歌翻译的热插拔相似. 关于个人理解 http://www.cnblogs.com/ptqueen/p/8 ...

  8. Spring实现热加载MyBatis 的XML配置文件

    为什么80%的码农都做不了架构师?>>>    package com.myapp.util;import java.io.IOException; import java.lang ...

  9. JVM从入门到精通(三):热加载的实现原理,Java内存模型,缓存行,指令重排,合并写技术等

    上节回顾:类加载机制 双亲委派机制 parent只是一个成员变量,不是继承关系. 上节课的遗留问题 parent是怎么指定的? 手动指定parent: 双亲委派机制可以被打破吗? 双亲委派机制是在Cl ...

最新文章

  1. 牛客 2018年长沙理工大学第十三届程序设计竞赛 G-逃离迷宫
  2. Axis2 -POJO
  3. 在线编译工具 Jenkins Hudson 的关系
  4. docker-elk装IK自定义分词库
  5. bzoj 3680 吊打xxx
  6. datetime模块
  7. HTTPClient系统学习
  8. stm32设置内部上拉电阻_不知道STM32的GPIO8种模式如何设置?-------看这里
  9. URAL1204. Idempotents(扩展欧几里得)
  10. 兰州交通大学计算机科学与技术排名,兰州交通大学怎么样 全国排名是多少
  11. 开课吧课堂:人工智能对金融行业的影响
  12. 【模型压缩系列】一:模型替换
  13. nodejs+socket.io用nginx反向代理提示400 Bad Request及ws://…无法连接的解决方法
  14. 史密斯圆图串并联口诀_最近终于把阻抗匹配和史密斯圆图搞懂了,总结了一下!...
  15. ubuntu freeradius mysql_初试freeradius
  16. win7系统如何添加打印机服务器,win7系统中添加打印服务器端口的方法 。 win7系统如何添加服务器打印机端口。...
  17. 【前沿技术RPA】 一文学会用UiPath实现自动发送电子邮件(Email Automation)
  18. 大厂Java八股文面试真题汇总,2022秋招必备,面试不慌
  19. 用python代码实现一个简单的FSA(有限状态自动机)
  20. 3 继续测试一下 esp_tunnel 用 racoon协商 用setkey设置 spd

热门文章

  1. linux用户开放crontab权限,linux – / etc / crontab权限
  2. HTML+CSS+JS实现canvas仿ps橡皮擦刮卡效果
  3. 基于Java SSM springboot+VUE+redis实现的前后端分类版网上商城项目
  4. apache php日志配置,HTML_初学:apache与php基本配置,1、APACHE的日志主要分为“ - phpStudy...
  5. mysql的操作语句_Mysql最常用的操作语句收集
  6. IDEA常用快捷键大全
  7. unicode解码php,PHP解码unicode编码的中文字符
  8. python学习socket的客户端实现
  9. flatform installer web 安装php_web安装平台-微软web服务器配置安装工具(Web Platform Installer)5.0 官方最新版-东坡下载...
  10. 未来教育计算机二级书怎么样,未来教育计算机二级