折腾了两天终于搞好了,查看了很多资料并尝试了上十次才终于配置好,为了大家不走弯路,特写此文

一、  服务端环境

CNETOS-6.5

Tomcat 7

jdk7

openssl-1.0.2-beta1.tar.gz
二、源码安装及证书申请与签发

将openssl-1.0.2-beta1.tar.gz copy到/home目录下

解压
tar -zxvf openssl-1.0.2-beta1.tar.gz

cd openssl-0.9.8e


./config --prefix=/usr/local --openssldir=/usr/local/openssl


make&& make install

(编译安装过程需要一点时间)

从安装包里拷贝demoCA到安装目录
cp /home/openssl-0.9.8e/apps/demoCA//usr/local/openssl/ -rf
cd /usr/local/openssl/demoCA
mkdir newcerts
cd /usr/local/openssl

mkdir ca

mkdir server

至此openssl目录下是这样




编辑openssl.cnf文件,找到[ req_distinguished_name ]标签,填写一下默认信息,随便填写(名称为XXX_default的,这些都是默认值),以便在之后创建证书的时候不用再敲一遍,直接回车跳过。


1、创建服务器证书、客户端证书以及CA
openssl req -new -x509 -keyout ca/ca.key -out ca/ca.crt -config openssl.cnf-days 3650 提示设置密码(CA 的私钥设置为:cncc.server)

提示输入信息(之前已经修改过openssl.cnf文件,这里一路回车,到填写your name时,输入你要配置的服务器端ip(PS:https双向认证时,浏览器会将自己要访问的ip地址与服务器端根证书中的CN值比较看是否相同,以确保浏览器访问的是正确的地址 ),其他空,接着一路回车。


2、生成服务器端私钥和证书请求
openssl genrsa -out server/server.key 1024
openssl req -new -key server/server.key -out server/server.csr -configopenssl.cnf

提示输入信息,同上,yourname填写tomcat所在的服务器ip

3、生成客户端私钥和请求
openssl genrsa -des3 -out private/privatekey.key 1024
cncc.client(客户端私钥)
openssl req -new -key private/privatekey.key -out private/privatekey.csr-config openssl.cnf  提示设置密码cncc.client
提示输入信息,同上,your name 输入client
4、通过CA签发证书
4.1、签发服务器端证书server.crt
openssl ca -in server/server.csr -out server/server.crt -cert ca/ca.crt-keyfile ca/ca.key -config openssl.cnf
提示你设置密码,输入cncc.server  回车后,出现y/n的选项,输入yes并回车,再次输入yes并回车

4.2、签发客户端端证书privatekey.crt
opensslca -in private/privatekey.csr -out private/privatekey.crt -cert ca/ca.crt-keyfile ca/ca.key -config openssl.cnf
提示你设置密码,输入cncc.server回车后,出现y/n的选项,输入yes并回车,再次输入yes并回车

此时,控制台会提示你数据已更新到database,好了,咱们接着继续


5、生成pkcs12格式证书
在tomcat中实现双向认证有时需要pkcs12格式的证书(该证书包含根证书、服务器端或客户端的证书和密钥文件)


5.1、生成pkcs12服务器证书tomcat.p12,设置密码为cncc.tomcat
openssl pkcs12 -export -in server/server.crt -inkey server/server.key -outserver/tomcat.p12 -name tomcat -CAfile ca/ca.crt -caname root -chain
cncc.tomcat (后边Tomcat的配置文件中需要)


5.2、生成pkcs12客户端证书client1.p12,设置密码为cnccclient

openssl pkcs12 -export -in private/privatekey.crt -inkey private/privatekey.key-out private/client1.p12 -name client1 -chain-CAfile ca/ca.crt
输入密码cncc.client  并回车,此时会提示你要设置客户端导入密码 ,各位童鞋可以输入任何你想要得密码,此处我们输入cncc  回车.这个密码是客户端浏览器导入证书时要输入的密码


6、有时可能需要别的格式的证书

生成pem格式证书

cat private/privatekey.crt  private/privatekey.key>private/privatekey.pem

cat server/server.crt  server/server.key > server/server.pem

(目前我没有用到这些)
三、tomcat实现双向认证
按照以上方法证书生成后,我们再配置TomCat即可实现双向认证。此时服务器端我们只用到服务器端pkcs12格式的证书tomcat.p12和CA的根证书ca.crt即可,客户端用到pkcs12格式的证书client1.p12。


1、将以上创建的证书server.crttomcat.p12拷贝到tomcat主目录下的conf文件夹下
cp server/server.crt server/tomcat.p12  到你所在tomcat/conf目录下

2、创建服务器信任的CA证书库
把ca.crt证书导入信任证书库,命令行模式进入tomcat主目录下的conf目录,执行以下命令:
cd /home/apache-tomcat-6.0.35/conf/
keytool -keystore truststore.jks -keypass cncc.trust -storepass cncc.trust -alias ca -import-trustcacerts -file /usr/local/openssl/ca/ca.crt(PS:keytool 是jdk自带的工具,别告诉我你没安装jdk,并设置了path环境变量)

*如果出现ca已经存在的错误,keytool -delete -alias ca-keystore truststore.jks  cncc.trust(keytool的密码,上一次使用时使用的密码)

可以用以下命令查看信任证书库内容:
keytool -keystore truststore.jks -keypass cncc.trust -storepass cncc.trust -list -v

(
参考修改keytool的密码:
keytool -storepasswd -new cncc.trust  -storepass cncctrust -keystore truststore.jks
其中-storepass指定原密码,-new指定新密码。
keytool -delete -alias ca -keystore truststore.jks  要求输入的密码就是上边修改的密码

)


3、配置Tomcat支持HTTPS双向认证
修改tomcat的conf目录里的server.xml文件($TOMCAT_HOME/conf/server.xml),找到类似下面内容的配置处,添加配置如下:(主要是标红部分)

protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="conf/tomcat.p12" keystorePass="cncc.tomcat"keystoreType="PKCS12"
truststoreFile="conf/truststore.jks" truststorePass="
cncc.trust" truststoreType="JKS"
/>

配置好后,重启tomcat,






访问方式 https://IP:端口号/

这时是无法连接到服务端的,显示如下:




需要服务端提供client1.p12证书(之前颁发的,在openssl/private目录下),将此证书导入,步骤如下:(本人浏览器IE8)


1、工具->Internet选项->内容->证书


2、点导入,下一步


选择那个client1.p12证书,下一步

3、提示输入导入密码

下一步,下一步,完成


4、关闭浏览器,重新开再次访问,提示身份验证

确定

OK可以访问


结束