服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 专题栏目 > Tomcat专题 > 查看文档

Tomcat服务器端SSL的配置(JKS和PKCS12)

本文参照了网上一些资料,如有侵犯,请告之:zhangzhongl@gmail.com 

本文阐述了如何在Tomcat下配置SSL安全认证,并在服务器和客户端均使用SSL安全认证,以及在Tomcat应用中获取有关证书的详细信息。
用到的软件包:
Tomcat 5.5.17
JSSE 中的 keytool 工具, 在 JDK 1.4 中已经自带了这个工具, 因此, 只需要安装 JDK1.4.x 即可
Openssl
cygwin 的 sed 命令
前提条件:
需要在path路径下添加jdk的bin路径以及JAVA_HOME路径。
整个配置文件的准备分为以下四个步骤:
Step1:生成CA私钥以及自签名根证书, 最后得到PKCS12格式的CA根证书
l          该命令生成CA私钥以及自签名根证书, 最后得到PKCS12格式的CA根证书(PKCS12格式的CA根证书受密码保护, 因此有比较好的安全性);
l          生成的PKCS12格式的CA根证书保存在 dist\ca-cert 目录下, 在正式使用的系统中, 这个证书文件(*.pfx)需要妥善保存, 因为以后的服务器证书和客户端证书都需要依赖这个证书, 尤其是客户端证书, 如果丢失了CA根证书, 就无法发布新的客户端证书了, 而重新生成CA根证书, 则需要重新生成服务器证书和客户端证书, 在客户端用户较多的情况下, 重新发布所有的客户端证书是有相当大的工作量;
l          在执行这个命令的过程中, 会提示输入证书保护密码, 请注意不要遗忘或者泄漏这个密码, 否则根证书的安全会受到威胁.
执行过程如下所示:
a.生成CA私钥ca-key.pem
openssl genrsa -out work\ca\ca-key.pem 1024 ?Cconfig openssl.conf
genrsa [产生密钥命令] -out[密钥文件输出路径] 1024 [密钥位数]
C:\Openssl>openssl genrsa -out work\ca\ca-key.pem 1024 -config openssl.conf
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
................................++++++
.......................++++++
e is 65537 (0x10001)
b. 生成待签名证书 ca-req.csr
openssl req -new -out work\ca\ca-req.csr -key work\ca\ca-key.pem ?Cconfig openssl.conf?Csubj [一些subject信息,如果这里不填写,可以在下面命令行提示符下填写]
req[产生证书命令] -new[新生成] -out[证书文件输出路径] -key[私钥文件路径]
C:\Openssl>openssl req -new -out work\ca\ca-req.csr -key work\ca\ca-key.pem -con
fig openssl.conf
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:LN
Locality Name (eg, city) []:DL
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Neusoft
Organizational Unit Name (eg, section) []:Neusoft
Common Name (eg, YOUR name) []:localhost
Email Address []:zhangzhongl@neusoft.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:openssl
An optional company name []:Neusoft
c. 用CA私钥进行自签名, 产生x509证书文件 ca-cert.pem
openssl x509 -req -in work\ca\ca-req.csr -out work\ca\ca-cert.pem -signkey work\ca\ca-key.pem -days 1000
x509[签发x509证书命令] -req[输入待签发证书] -in[输入待签发证书文件路径] -out[产生x509证书文件输出路径]-signkey[自签发密钥文件路径] -days[证书有效期]
C:\Openssl>openssl x509 -req -in work\ca\ca-req.csr -out work\ca\ca-cert.pem -signkey work\ca\ca-key.pem -days 1000
Loading 'screen' into random state - done
Signature ok
subject=/C=CN/ST=LN/L=DL/O=Neusoft/OU=Neusoft/CN=localhost/emailAddress=zhangzho
ngl@neusoft.com
Getting Private key
d. 生成CA证书: work\ca\ca-cert.pfx, 注意一定要记住导出密码
openssl pkcs12 -export -clcerts -in work\ca\ca-cert.pem -inkey work\ca\ca-key.pem -out work\ca\ca-cert.pfx
pkcs12[生成PKCS12格式证书命令] -export[导出文件] -clcerts[仅导出client证书] -password[导出密码] -in[输入的client证书文件路径] -inkey[client证书密钥文件路径] -out[导出PKS12格式文件路径]
C:\Openssl>openssl pkcs12 -export -clcerts -in work\ca\ca-cert.pem -inkey work\ca\ca-key.pem -out work\ca\ca-cert.pfx
Loading 'screen' into random state - done
Enter Export Password:************
Verifying - Enter Export Password:************
e. 将生成的证书保存起来(以后需要用到)
copy work\ca\ca-cert.pfx dist\ca-cert\root-ca-cert.pfx
C:\Openssl>copy work\ca\ca-cert.pfx dist\ca-cert\root-ca-cert.pfx
已复制         1 个文件。
f. 重置CA序列号文件
C:\Openssl>echo 00 > etc\ca-cert.srl
至此,CA私钥以及自签名根证书和PKCS12格式的CA根证书都已经生成,分别存在于以下目录work\ca和dist\ca-cert。
Step2: 从PKCS12格式的CA根证书导出 CA私钥和未加密CA根证书
l          该命令用于从PKCS12格式的CA根证书中导出CA私钥和未加密CA根证书;
l          由于安全原因, CA根证书平时以密码保护的PKCS12格式文件(*.pfx)存放, 那么如果需要使用CA根证书来发布服务器证书或者客户端证书时, 首先需要执行这个命令得到CA根证书的未加密形式;
l          在执行这个命令的过程中, 会出现两次提示输入根证书的保护密码, 如果密码不正确, 这个命令将不能执行成功, 也就无法进行下面两步的发布证书的操作了.
a.        从PKCS12格式的CA证书导出不加密的CA证书: work\ca\ca-cert.pem(首先清空work\ca文件夹)
openssl pkcs12 -in dist\ca-cert\root-ca-cert.pfx -clcerts -nodes -nokeys -out work\ca\ca-cert.pem.1
然后将将得到的证书文件的开头四行(Bag Attributes)去掉,因为下一步(生成服务器端证书)中keytool import时会认为含有Bag Attributes的文件"不是一个 X.509 认证",
第一步到处的CA证书内容为:
Bag Attributes
    localKeyID: 9A E7 A9 76 D1 07 33 2C 45 12 2D C7 7A 04 E8 9E 8A 68 7B ED
subject=/C=CN/ST=LN/L=DL/O=Neusoft/OU=Neusoft/CN=localhost/emailAddress=zhangzhongl@neusoft.com
issuer=/C=CN/ST=LN/L=DL/O=Neusoft/OU=Neusoft/CN=localhost/emailAddress=zhangzhongl@neusoft.com
-----BEGIN CERTIFICATE-----
MIIChzCCAfACCQCT0TKBO9puUjANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC
……
-----END CERTIFICATE-----
这需要使用cygwin的sed命令:
sed -e '1,4d' work\ca\ca-cert.pem.1 > work\ca\ca-cert.pem
执行上面的命令后,ca-cert.pem变为:
-----BEGIN CERTIFICATE-----
......
-----END CERTIFICATE-----
C:\Openssl>openssl pkcs12 -in dist\ca-cert\root-ca-cert.pfx -nodes -nokeys ?Cout work\ca\ca-cert.pem.1
Enter Import Password:
MAC verified OK
C:\Openssl\cygwin>sed -e '1,4d' ..\work\ca\ca-cert.pem.1 > ..\work\ca\ca-cert.pem
b. 从PKCS12格式的CA证书导出CA私钥: work\ca\ca-key.pem
openssl pkcs12 -in dist\ca-cert\root-ca-cert.pfx -clcerts -nodes -out work\ca\file.pem
openssl rsa -in work\ca\file.pem -out work\ca\ca-key.pem
C:\Openssl>openssl pkcs12 -in dist\ca-cert\root-ca-cert.pfx -clcerts -nodes ?Cout work\ca\file.pem
Enter Import Password:
MAC verified OK
C:\Openssl>openssl rsa -in work\ca\file.pem -out work\ca\ca-key.pem
writing RSA key
至此,从PKCS12格式的CA根证书导出 CA私钥和未加密CA根证书,已经完成。

Step3:生成服务器端证书
这里主要使JSSE的keytool命令。首先进入${JAVA_HOME}\bin\目录:
a. 生成KeyPair: work\server\localhost-tomcat.keystore
keytool -genkey -alias localhost-tomcat -validity 1000 -keyalg RSA -keysize 1024
-genkey[产生密钥对] -alias[密钥对别名] -validity[密钥有效期] -keyalg[密钥算法参数] -keysize[密钥位数] -keypass[密钥保护密码]- storepass[存储密码]
-dname[别名相关附加信息,其中cn是服务器的名字一定要与WEB服务器中设置的一样] -keystore[密钥存储文件路径]
C:\jdk\bin>keytool -genkey -alias localhost-tomcat -validity 1000 -keyalg RSA -keysize 1024 -keystore c:\openssl\work\server\localhost-tomcat.keystore
输入keystore密码: openssl
您的名字与姓氏是什么?
 [Unknown]: zhangzhongliang
您的组织单位名称是什么?
 [Unknown]: neusoft
您的组织名称是什么?
 [Unknown]: neusoft
您所在的城市或区域名称是什么?
 [Unknown]: DL
您所在的州或省份名称是什么?
 [Unknown]: LN
该单位的两字母国家代码是什么
 [Unknown]: CN
CN=zhangzhongliang, OU=neusoft, O=neusoft, L=DL, ST=LN, C=CN 正确吗?
 [否]: Y
输入<localhost-tomcat>的主密码
        (如果和 keystore 密码相同,按回车):
C:\jdk\bin>
b.        生成待签名证书 work\server\server.csr
keytool -certreq -alias localhost -sigalg MD5withRSA -file work\server\server.csr
keytool -certreq[产生待签名证书] -alias[证书别名] -sigalg[证书算法参数] -file [产生文件输出路径]
                  -keypass[密钥保护密码] -keystore[存储文件路径] -storepass[存储密码]
C:\jdk\bin>keytool -certreq -alias localhost-tomcat -sigalg MD5withRSA -file c:\openssl\work\server\server.csr
                           -keystore c:\openssl\work\server\localhost-tomcat.keystore
输入keystore密码: openssl
c.        用CA私钥进行签名, 产生x509证书文件 work\server\server-cert.pem
openssl x509 -req -in work\server\server.csr -out work\server\server-cert.pem
-CA work\ca\ca-cert.pem -CAkey work\ca\ca-key.pem -days 1000 -CAcreateserial -sha1 -trustout
-CA work\ca\ca-cert.pem -CAkey work\ca\ca-key.pem -days 1000 -CAserial etc\ca-cert.srl -sha1 -trustout
x509[签发x509证书命令] -req[输入待签发证书] -in[输入待签发证书文件路径] -out[产生x509证书文件输出路径]
         -CA[签发根证书] -CAkey[根证书密钥文件] -days[证书有效期] -CAcreateserial[创建序列号]
         -CA[签发根证书] -CAkey[根证书密钥文件] -days[证书有效期] -CAserial[CA序列号文件]
C:\Openssl>openssl x509 -req -in work\server\server.csr -out work\server\server-
cert.pem -CA work\ca\ca-cert.pem -CAkey work\ca\ca-key.pem -days 1000 -CAcreates
erial -sha1 -trustout -CA work\ca\ca-cert.pem -CAkey work\ca\ca-key.pem -days 10
00 -CAserial etc\ca-cert.srl -sha1 -trustout
Loading 'screen' into random state - done
Signature ok
subject=/C=CN/ST=LN/L=DL/O=neusoft/OU=neusoft/CN=zhangzhongliang
Getting CA Private Key
d.        导入(替换)信任的CA根证书到JSSE的默认位置
(${JAVA_HOME}\jre\lib\security\cacerts),导入前首先删除(如果原来已经导入过)
keytool -delete -v -alias localhost-CA-ROOT -storepass changeit -keystore c:\jdk\jre\lib\security\cacerts
C:\jdk\bin>keytool -delete -v -alias localhost-CA-ROOT -storepass changeit -keys
tore c:\jdk\jre\lib\security\cacerts
keytool错误: java.lang.Exception: 别名 <localhost-CA-ROOT> 不存在
说明不存在CA根证书。
keytool -import -v -trustcacerts -storepass changeit -alias localhost-CA-ROOT -file work\ca\ca-cert.pem -keystore c:\jdk \jre\lib\security\cacerts -noprompt
-import[导入命令] -v trustcacerts[导入信任证书] -storepass[存储密码] -alias[CA根证书的别名] -file[证书文件路径] -keystore[导入文件路径] -noprompt[不提示"信任这个认证?"]
C:\jdk\bin>keytool -import -v -trustcacerts -storepass changeit -alias localhost-CA-ROOT -file c:\openssl\work\ca\ca-cert.pem -keystore c:\jdk\jre\lib\security\
cacerts -noprompt
认证已添加至keystore中
[正在存储 c:\jdk\jre\lib\security\cacerts]
e. 把CA签名后的server端证书导入keystore: work\server\localhost-tomcat.keystore
keytool -import -v -trustcacerts -storepass openssl -keypass openssl -alias localhost-tomcat -file c:\openssl\work\server\server-cert.pem -keystore c:\openssl\work\server\localhost-tomcat.keystore
-import[导入命令] -v -trustcacerts[导入信任证书] -storepass[存储密码] -keypass[密钥保护密码] -alias[服务器证书的别名] -file[证书文件路径] -keystore[导入文件路径]
C:\jdk\bin>keytool -import -v -trustcacerts -storepass openssl -keypass openssl
-alias localhost-tomcat -file c:\openssl\work\server\server-cert.pem -keystore c
:\openssl\work\server\localhost-tomcat.keystore
认证回复已安装在 keystore中
[正在存储 c:\openssl\work\server\localhost-tomcat.keystore]
f. 把CA根证书导入keystore: work\server\localhost-tomcat.keystore
keytool -import -v -trustcacerts -storepass openssl -keypass openssl -alias localhost-CA-ROOT -file c:\openssl\work\ca\ca-cert.pem -keystore c:\openssl\work\server\localhost-tomcat.keystore -noprompt
-import[导入命令] -v trustcacerts[导入信任证书] -storepass[存储密码] -keypass[密钥保护密码] -alias[服务器证书的别名] -file[证书文件路径] -keystore[导入文件路径] -noprompt[不提示"您仍然想要将它添加到自己的keystore 吗?"]
C:\jdk\bin>keytool -import -v -trustcacerts -storepass openssl -keypass openssl
-alias localhost-CA-ROOT -file c:\openssl\work\ca\ca-cert.pem -keystore c:\opens
sl\work\server\localhost-tomcat.keystore -noprompt
认证已添加至keystore中
[正在存储 c:\openssl\work\server\localhost-tomcat.keystore]

g. 查看JSSE CA根证书
keytool -list -storepass changeit -keystore c:\jdk\jre\lib\security\cacerts
C:\jdk\bin>keytool -list -storepass changeit -keystore c:\jdk\jre\lib\security\c
acerts
Keystore 类型: jks
Keystore 提供者: SUN
您的 keystore 包含 35 输入
equifaxsecureebusinessca1, 2003-7-19, trustedCertEntry,
认证指纹 (MD5): 64:9C:EF:2E:44:FC:C6:8F:52:07:D0:51:73:8F:CB:3D
……
认证指纹 (MD5): AA:BF:BF:64:97:DA:98:1D:6F:C6:08:3A:95:70:33:CA
C:\jdk\bin>
keytool -list -storepass changeit -keystore c:\jdk\jre\lib\security\cacerts -alias localhost-CA-ROOT -v
C:\jdk\bin>keytool -list -storepass changeit -keystore c:\jdk\jre\lib\security\c
acerts -alias localhost-CA-ROOT -v
别名名称: localhost-CA-ROOT
创建日期: 2006-11-2
输入类型: trustedCertEntry
Owner: EMAILADDRESS=zhangzhongl@neusoft.com, CN=localhost, OU=Neusoft, O=Neusoft
, L=DL, ST=LN, C=CN
发照者: EMAILADDRESS=zhangzhongl@neusoft.com, CN=localhost, OU=Neusoft, O=Neuso
ft, L=DL, ST=LN, C=CN
序号: 93d132813bda6e52
有效期间: Thu Nov 02 14:19:52 CST 2006 至: Wed Jul 29 14:19:52 CST 2009
认证指纹:
         MD5: CD:71:2E:C1:8F:00:44:93:C2:AF:6B:0F:1B:E4:A6:DE
         SHA1: 9A:E7:A9:76:D1:07:33:2C:45:12:2D:C7:7A:04:E8:9E:8A:68:7B:ED
h. 删除导入到JSSE<SPAN style="FONT-SIZE: 9pt

扫描关注微信公众号