实现 tomcat 热加载证书

原文地址: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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改yapf中的列宽限制值

yapf是一款由Google开源的Python代码自动格式化工具&#xff0c;它根据PEP 8规范可以帮我们自动格式化我们的代码&#xff0c;让代码更规范、更漂亮。但是其中最大列宽被限制为80&#xff0c;如果超过80&#xff0c;在格式化时就会被yapf换行&#xff0c;随着现在人们的显示器越…

Hadoop64位版本安装后遇到的警告处理

在使用hadoop的过程中&#xff0c;会遇到一个警告&#xff0c;内容如下&#xff1a; WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 对于这个问题网上很多说法是由于系统位数和所下载…

【转】C++类的sizeof大小

转自https://blog.csdn.net/zhengjihao/article/details/77825269 其中有的描述与实际GCC上执行的结果不符&#xff0c;不过其中的分析思路需要掌握。 以下是GCC的实际执行结果&#xff1a; 1 #include <iostream>2 using namespace std;3 4 int *pointer;5 6 class Null…

shiro扩展获得用户登录类型并提供cookie的方式记住用户密码

在最近的项目中要实现一个需求&#xff1a;“同时让两种类型的用户进行登录&#xff0c;登录后如果用户勾选了记住密码就要生成cookie来记录用户的密码和用户名”。本人做安全认证的时候一直在使用shiro&#xff0c;所以就想到在shiro的基础上进行一些扩展来满足需求。 shiro自…

ueditor跨域上传图片文件(基于jsp框架、tomcat)

额&#xff0c;好久没有用到ueditor了&#xff0c;因为现在的相关工作很少涉及到富文本编辑&#xff1b;最近临时带了一个项目&#xff0c;里面要用到富文本编辑器&#xff0c;而且文件要统一上传到文件服务器上保存&#xff1b;应为以前用过ueditor就试着在网上着一些跨域保存…

JavaWeb-RESTful_用SpringMVC开发RESTful

RESTful简介 一种软件架构风格、设计风格&#xff0c;而不是标准&#xff0c;只是提供了一组设计原则和约束条件。 它主要用于客户端和服务器交互类的软件。 基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存等机制。 RESTful可以理解为一种编…

在storm中使用流

storm是一个强大的流式计算框架&#xff0c;单流的storm在使用中非常普遍&#xff0c;而同时storm也提供对多个流的支持&#xff1b;通过定义多个流&#xff0c;用户可以进一步的把数据发放到不同的流中进行处理。 代码如下&#xff1a; 一、 定义多个流的spout public class…

精选Pycharm里6大神器插件

http://www.sohu.com/a/306693644_752099 上次写了一篇关于Sublime的精品插件推荐&#xff0c;有小伙伴提议再来一篇Pycharm的主题。相比Sublime&#xff0c;Pycharm要强大许多&#xff0c;而且是专为python设计的集成开发环境&#xff0c;所以无论是自身功能、环境配置还是使用…

在storm中使用定时保存

在storm中使用实时保存会对性能带来很大的考验&#xff0c;所以在很多场景中还是使用定时保存&#xff1b;而且storm自带了定时功能&#xff0c;使用方式如下&#xff1a; 首先在topo中的config中定义一个通信时间&#xff0c;定义方式如下&#xff1a; conf.put(Config.TOPOLO…

数字信号处理实验(一)——DTFT

一、离散序列傅里叶变化——DTFT 1、DTFT公式 2、Matlab算法实现 function[X]dtft(x,n,w,flag)%计算离散时间付里叶变换 %[X]dtft(x,n,w) %X在w频率点上的DTFT数组 %xn点有限长度序列 %n样本位置向量 %w频率点位置向量X x * (exp(-j).^(n * w));3、DTFT一些画图代码 function …

修改hadoop中yarn的webui中显示的任务时间为中国时间

在${HADOOP_HOME}\share\hadoop\yarn目录下找到hadoop-yarn-common-x.x.x.jar&#xff0c;然后用winRAR打开&#xff1b; 打开以后结构如下&#xff1a; 进入webapps/static/目录&#xff0c;然后修改yarn.dt.plugins.js&#xff1b;做出如下修改&#xff1a; &#xff08;1&a…

一条语句复制整个目录《转》

使用的是 Delphi 2010 下 IOUtils 单元的 TDirectory.Copy 函数: 1 uses IOUtils; 2 3 procedure TForm1.Button1Click(Sender: TObject); 4 const 5 SourceDir C:\Temp\Folder1; { 源文件夹必须存在 } 6 DestDir C:\Temp\Folder2; { 如果目标文件夹不存在, 程序会自动…

设计模式与重构汇总

面向对象的基本原则&#xff1a;单一原则&#xff1a;引起一个类发生变化的原因只有一个 开放封闭原则&#xff1a;对于类的修改是封闭的&#xff0c;而对于类的扩展是开放的 依赖倒置原则&#xff1a;高层不依赖于底层&#xff0c;都应该依赖与抽象&#xff1b;抽象不依赖于…

转 最小凸包算法(Convex Hull)(1)-Graham扫描法 -计算几何-算法导论

原文地址&#xff1a;http://blog.csdn.net/suwei19870312/article/details/542281 基本问题&#xff1a; 平面上有n个点p1,p2, ..., pn, 要求求出一个面积最小的凸多边形&#xff0c;使得这个多边形包含所有平面上的点。 根据算法导论上提供的两个方法做一些介绍&#xff1a; …

Trident API 概览

Trident API 概览 在网上看到了很多有TRIDENT相关API的翻译&#xff0c;看来看去&#xff0c;总觉得没有说清楚很多东西&#xff0c;所以自己结合使用的经验翻译了一篇出来&#xff1b;翻译完以后&#xff0c;也发现 在自己的翻译中也有很多地方是表达不清楚的不过多少感觉有些…

poj 2406 还是KMP的简单应用

记住KMP是多计算一位的。其中next[i]为不为自身的最大首尾重复子串长度。 位移ji-next[i]可以看作是构成字符串s的字串&#xff08;如果i%j0&#xff0c;存在这样的构成&#xff09;&#xff0c;相应的重复次数也就是n/d。 a b c d * next:-1 0 0 0 0 这时ji-next[i]; …

Trident State译文

Trident State 译文 Trident针对状态化的数据源的读写进行了一流的分装。State可以包含在拓扑中-例如&#xff0c;保存在内存中&#xff0c;有HDFS提供备份-也可以保存在一个外部的数据库中&#xff0c;像Memcached和Cassandra。针对以上的所有情况&#xff0c;Trident的API都…

远程访问数据库查询数据量一大就Hang

最近刚为客户升级了一套Oracle Database&#xff0c;一切进展顺利&#xff0c;眼看就要顺利验收时&#xff0c;发现有部分客户端软件连接新版本数据库时会Hang&#xff0c;问题非常诡异。 系统环境如下 升级前的环境OS:Windows Server 2003 DB:Windows Database Enterprise Edi…

storm-hbase jar包中的bolt节点源码解析

一段时间内&#xff0c;大家都是自己在storm的节点中实现对hbase的操作&#xff0c;不管是普通的topo还是在trident中都是这样&#xff1b;不知道从那个版本起&#xff0c;在storm的压缩包中就多出了好几个jar包&#xff0c;把针对habse&#xff0c;mysql&#xff0c;mongodb等…

软件之道:软件开发争议问题剖析

软件之道&#xff1a;软件开发争议问题剖析 基本信息 原书名&#xff1a; Making Software 原出版社&#xff1a; OReilly 作者&#xff1a; (美)Andy Oram Greg Wilson 译者&#xff1a; 鲍央舟 张玳 沈欢星丛书名&#xff1a; 图灵程序设计丛书出版社&#xff1a;人民邮…