一、 服务端环境
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.crt和tomcat.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可以访问
结束