您的位置:首页 > 运维架构 > Tomcat

tomcat安全配置之证书密码加密存储

2013-08-29 23:26 225 查看
        最近项目组要完成一个新Web Servicer接口的开发,其中有项要求是支持外部客户程序以https方式访问这些SOAP接口。项目组当前基于tomcat6.0.29开发,axis版本为1.4。拿到这个需求时不明所以,后来发现网上的资料非常多,但据观察,基本步骤和apache官网的上操作步骤基本一致,少有特别之处。于是参照资料,这个特性顺利完成。客户拿到之后非常满意,但看到tomcat配置文件中证书的密码以明文保存时,客户不满意了,要求修改为密文。

        根据官网的资料以及实地验证,tomcat的Connector配置默认只支持明文。但客户就是上帝,客户的要求即是圣旨。

        于是新一轮的资料检索开始了,但让人非常失望的是网上资料大多都是在讲如何基于tomcat配置https的单向认证或者双向认证,证书密码加密存储相关的资料却怎么也找不到。客户那边又催的特别紧,没有办法,只好硬着头皮啃tomcat的源码,配合eclipse的远程调试功能,终于摸索出了办法。下面的文字tomcat版本为6.0.29,其它版本的处理方法应当近似,同时假定基于tomcat的https认证已经配置好,tomcat可以正常启动。

        修改前的Connector配置,可以看到证书的口令配置成了明文,这样安全性是没有保证的。

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="./conf/keystore" keystorePass="jackie.123"
clientAuth="false" sslProtocol="TLS" />
        解决问题的步骤如下:

步骤一、创建一个协议处理类,替换掉当前的org.apache.coyote.http11.Http11Protocol。代码非常简单,说明tomcat扩展性非常好。样例如下:

package demo;

import org.apache.coyote.http11.Http11Protocol;

public class MyHttp11Protocol extends Http11Protocol {
@Override
public void init() throws Exception {
final String password = getKeypass();
final String realpassword = decipher(password);
setAttribute("keypass", realpassword);
super.init();
}

private String decipher(final String password) {
// 这里执行密码的解码操作;
}
}
        注意点是这个类里如果需要记日志,可以直接使用父类定义的log对象,但有一点,明文口令不要记录到日志里,否则失去了加密存储的意义。

步骤二、修改Connector的配置,使用定制后的协议处理器,同时把证书的密码修改为密文,样例如下:

<Connector port="8443" protocol="demo.MyHttp11Protocol" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="./conf/keystore" keystorePass="ADFADLJYNGHYVM=="
clientAuth="false" sslProtocol="TLS" />
步骤三、重新启动tomcat,检查上述配置是否生效。

        Anyway,经过上述处理,我本地的配置是成功的。

2013年9月1日22:38:47

        解决问题的方法很简单,寻找解决方法的过程并不轻松。在寻找的过程中,犯了如下几类错误。

1、本地开发环境有问题,导致获取到对应版本的tomcat源码之后,仍然无法进行远程调试,因而想到增加日志的方法来跟踪代码执行流程。但在自定义的协议处理器代码里增加日志记录器对象和日志输出语句时发现代码编译不通过,根据提示在工程的编译路径里增加了commons-loggins和log4j之后,编译问题解决了,但仍然无法记录日志。在网上搜索了一大圈后才发现,框架的日志记录器在$CATALINA_HOME/bin目录下,jar包名为tomcat-juli.jar,于是在工程里增加了正确的jar包,代码编译运行之后,终于可以看到新增加的日志。后来详细走读org.apache.coyote.http11.Http11Protocol类才发现,原来父类里定义的日志记录器是保护成员,子类完全可以直接拿来使用,不需要客气,这样刚才自定义的协议处理器代码又可简化一块。

2、自定义协议处理器时,没有把包含自定义的协议处理器的jar包放到$CATALINA_HOME/lib目录下,导致启动时总是异常,分析日志时没有头绪,后来才想起来框架加载的类一定要放在框架的类路径里;

3、解决上述问题之后,tomcat启动仍然不成功,但好在有日志可以看,具体现象是在解码操作前有日志,解码之后的日志却看不到了。一开始摸不到头脑,后来检查代码中import进来的类列表,突然发现代码解码过程中应用了另外的开源组件,而运行环境中$CATALINA_HOME/lib目录下并没有放置相关的jar包,相信这就是问题所在。在运行环境中增加相关的jar包之后,tomcat正常启动,表明问题都解决了。

        另外一个收获是tomcat官网上的资料质量很高,很实用,很详细。从资料看,tomcat使用了很多很实用的新技术,由于tomcat源代码是开放的,并且质量很高,有心的程序员对照资料和代码,应该可以学到不少东东。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息