| |
本文参照了网上一些资料,如有侵犯,请告之: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 |
|