Linux下Tomcat配置使用SSL双向认证(使用openssl生成证书)

在安全通信中,不得不使用ssl,这样既保证安全,又显得专业.在看了多篇关于tomcat配置ssl的文章后,自己又总结了一下.我使用的是tomcat6.0,配置起来有些许差别. 

参考网上文章 
Tomcat下双向SSL安全认证 
Windwos2000下配置Tomcat 5使用SSL 

环境: 
linux magic2.01 
openssl-0.9.8e 
jre1.5.0_05 
apache-tomcat-6.0.13 

本文目录: 
安装openssl 
建立ca根证书 
建立server证书 
配置tomcat支持ssl 
建立个人证书 

安装openssl 
最新版本可以去www.openssl.org ,我用的是openssl-0.9.8e.tar.gz 
tar -xzf openssl-0.9.8e.tar.gz 
cd openssl-0.9.8e 
./configure --prefix=XXXXX --openssldir=XXXXXXXX 
(这里prefix是你想安装openssl的地方, openssldir就是你tar开的openssl源码的地方。好象所有的出名点的free software都是这个操行,configure, make , make test, make install, 搞定。) 
./make 
./make test 
./make install 
OK, 如果路上没有什么问题的话,搞定。 

建立ca根证书 
建立一张证书需要三步,1是生成系统私钥,2生成待签名证书,需要输入一些信息,3 生成x509证书,可以自已签名,用来做根证书;也可用其它证书来签名,生成根证书可以信任的证书. 

下面是生成根证书 
1生成CA私钥 

openssl genrsa -out ca/cakey.pem 2048 

[color=red]genrsa[生成CA私钥] 

-out[生成的私钥的保存路径和名字] 

2048[密钥位数] [/color] 

2 生成待签名证书 

openssl req -new -out ca/careq.csr -key ca/cakey.pem 

req[生成待签名证书的选项] 

-key[采用的CA私钥的路径] 

3 用CA私钥进行自签名 

openssl x509 -req -in ca/careq.csr -out ca/cacert.pem -signkey ca/cakey.pem -days 7200 

4.将证书导出成浏览器支持的.p12格式 :

openssl pkcs12 -export -clcerts -in ca/cacert.pem -inkey ca/cakey.pem -out ca/ca.p12


x509[生成x509的CA根证书] 

-in[采用的待签名证书的路径] 

-out[生成的CA根证书的路径] 

-signkey[采用签名的私钥的路径] 

-days[有效时间(天)] 

建立server证书 
因为tomcat为java的web容器,所以在实现ssl时,要用到java的安全机制,所以部分操作是用java的keytool来完成的. 

1 生成KeyPair 

keytool -genkey -alias tomcat_server -validity 7200 -keyalg RSA -keysize 2048 -keypass 123456 -storepass 123456 -dname " CN=116.114.17.133, OU=vg.group, O=unimassystem.inc, L=hangzhou, ST=zhejiang, C=CN" -keystore server/server_keystore 

-genkey[生成私钥对的命令] 

-alias[为生成的私钥对起个别名] 

-validity[密钥有效期] 

-keyalg[加密算法] 

-keysize[加密位数] 

-keypass[密钥保护密码] 

-storepass[存储密码] 

-dname[别名附加的相关信息] 这里的CN一般要根tomcat服务所在机子的名字一样,也就是hostname 

-keystore[密钥存储文件路径] 

2 生成待签名证书 

keytool -certreq -alias tomcat_server -sigalg MD5withRSA -file server/server.csr -keypass 123456 -keystore server/server_keystore -storepass 123456 

-file[生成的待签名证书的路径] 

3 用CA私钥进行签名 

openssl x509 -req -in server/server.csr -out server/server-cert.pem -CA ca/cacert.pem -CAkey ca/cakey.pem -CAserial ca/ca-cert.srl -CAcreateserial -days 7200 

这时便产生了一个服务端证书:server-cert.pem 

如果没有-CAcreateserial选项会出现如下错误: 
Loading 'screen' into random state - done 

Signature ok 

subject=/C=CN/ST=shanghai/L=shanghai/O=topfounder/OU=technology/CN=redbeans luo 

Getting CA Private Key 

ca\ca-cert.srl: No such file or directory 

3140:error:02001002:system library:fopen:No such file or directory:.\crypto\bio\{color} 

bss_file.c:349:fopen('D:\sslca\ca\ca-cert.srl','rb') 

3140:error:20074002:BIO routines:FILE_CTRL:system lib:.\crypto\bio\bss_file.c:351: 
4 导入信任的CA根证书到JSSE的默认位置($JDK_HOME/jre/lib/security/cacerts) 

keytool -import -v -trustcacerts -storepass 123456 -alias my_ca_root -file ca/cacert.pem -keystore $JAVA_HOME/jre/lib/security/cacerts 

这里,如果$JDK_HOME/jre/lib/security/cacerts已经存在,那么会报错: 

keytool错误: java.io.IOException: Keystore was tampered with, or password was incorrect 

解决办法之一,是将 原cacerts文件删除即可,那样之前导入的信任的CA根证书的配置就都没了,令一个办法是取一个不同与其他导入的根证书的别名,也就是-alias 后面写个不同的名字(导入多个根证书的时候,就要这么做了)。 

这一步他会询问:是否将这个根证书设为可信任的,如果不希望提示,加上选项:-noprompt就可以了,默认就是Y(yes)。 

5 把CA签名后的server端证书导入keystore 

keytool -import -v -trustcacerts -storepass 123456 -alias tomcat_server -file server/server-cert.pem -keystore server/server_keystore 
这个步会一个风险,就是你用的keytool不是你刚才导入ca根证书的jdk的,这样的话,会报一个错误。 

如果你不理采的话,证书导不进去。你更改alias可以导入进行去,但证书在使用中会出现问题,因为证书的发行者是他自己而不是根证书。 
6 查看server端证书 

keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts 

keytool -list -v -keystore server/server_keystore 

配置tomcat支持ssl 
修改$TOMCAT_ROOT/conf/server.xml 

使用java的ssl,而不是opensll 
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" /> 

<Connector protocol="org.apache.coyote.http11.Http11Protocol" 
port="8443" minSpareThreads="5" maxSpareThreads="75" 
enableLookups="true" disableUploadTimeout="true" 
acceptCount="100" maxThreads="200" 
scheme="https" 
secure="true" SSLEnabled="true" 
存储路径 
keystoreFile="/rpyca/server/server_keystore" 
密码 
keystorePass="123456" 
是否需要客户端验证 
clientAuth="true" 
sslProtocol="TLS"/> 

建立个人证书 
1 生成client私钥 

openssl genrsa -out client/client-key.pem 2048 
2 生成待签名证书 

openssl req -new -out client/client-req.csr -key client/client-key.pem 
3 用CA私钥进行签名 

openssl x509 -req -in client/client-req.csr -out client/client.crt -signkey client/client-key.pem -CA ca/cacert.pem -CAkey ca/cakey.pem -CAserial ca/ca-cert.srl -CAcreateserial -days 7200 
4 生成client端的个人证书 

因为JSSE1.0.2没有完全实现了对PKCS#12格式文件的操作(只能读取,不能输出),所以在这里需要用openssl制作client端的个人证书(包含私钥)。 
openssl pkcs12 -export -clcerts -in client/client.crt -inkey client/client-key.pem -out client/client.p12 
5 安装信任的根证书 

把D:\sslca\ca\ca-key.pem改名为D:\sslca\ca\ca-key.cer,在client端的IE中使用"工具 'Internet选项 ' 内容 ' 证书 ' 导入"把我们生成的CA根证书导入,使其成为用户信任的CA。 
6安装个人证书 

把client.p12导入到client端的IE中作为个人证书,导入过程同2.4.5。 

启动Tomcat 
执行%TCAT_HOME%\bin\startup.bat启动Tomcat 

用IE访问Tomcat 
在IE浏览器的地址栏中输入https://localhost:8443?,如果前面的操作都正确的话,应该可以看到Tomcat的欢迎页面。同时状态栏上的小锁处于闭合状态,表示您已经成功地与服务器建立了要求客户端验证的SSL安全连接

你可能感兴趣的:(Linux下Tomcat配置使用SSL双向认证(使用openssl生成证书))