tomcat7.0.55配置单向和双向HTTPS连接
HTTPS配置中分为单向连接和双向连接,单向连接只需要服务器安装证书,客户端不需要,双向连接需要服务器和客户端都安装证书
下面的配置都没有用CA签名来配置,都不能用于生产环境,实际配置中是需要CA的,并且第二个配置增加客户端证书时需要修改server.xml,这在生产环境中是行不通的,后面的博文会更新说明
博文更新:tomcat7.0.55配置单向和双向HTTPS连接(二)
一、单向HTTPS连接
检查命令行当前工作目录(C:\Users\test\)下的有无.keystore文件,如果有,则删除。
先测试两个keytool命令
1、keytool -help
结果如下
C:\Users\test>keytool -help 密钥和证书管理工具 命令: -certreq 生成证书请求 -changealias 更改条目的别名 -delete 删除条目 -exportcert 导出证书 -genkeypair 生成密钥对 -genseckey 生成密钥 -gencert 根据证书请求生成证书 -importcert 导入证书或证书链 -importpass 导入口令 -importkeystore 从其他密钥库导入一个或所有条目 -keypasswd 更改条目的密钥口令 -list 列出密钥库中的条目 -printcert 打印证书内容 -printcertreq 打印证书请求的内容 -printcrl 打印 CRL 文件的内容 -storepasswd 更改密钥库的存储口令 使用 "keytool -command_name -help" 获取 command_name 的用法
2、keytool -genkey -help
C:\Users\test>keytool -genkey -help keytool -genkeypair [OPTION]... 生成密钥对 选项: -alias <alias> 要处理的条目的别名 -keyalg <keyalg> 密钥算法名称 -keysize <keysize> 密钥位大小 -sigalg <sigalg> 签名算法名称 -destalias <destalias> 目标别名 -dname <dname> 唯一判别名 -startdate <startdate> 证书有效期开始日期/时间 -ext <value> X.509 扩展 -validity <valDays> 有效天数 -keypass <arg> 密钥口令 -keystore <keystore> 密钥库名称 -storepass <arg> 密钥库口令 -storetype <storetype> 密钥库类型 -providername <providername> 提供方名称 -providerclass <providerclass> 提供方类名 -providerarg <arg> 提供方参数 -providerpath <pathlist> 提供方类路径 -v 详细输出 -protected 通过受保护的机制的口令 使用 "keytool -help" 获取所有可用命令
3、使用keytool -genkey命令生成密钥对,别名为tomcat,默认生成在当前目录,这里的口令不回显,至少输入6位,笔者输入的是12345678
C:\Users\test>keytool -genkey -alias tomcat -keyalg RSA 输入密钥库口令: 您的名字与姓氏是什么? [Unknown]: localhost 您的组织单位名称是什么? [Unknown]: com 您的组织名称是什么? [Unknown]: co 您所在的城市或区域名称是什么? [Unknown]: Dalian 您所在的省/市/自治区名称是什么? [Unknown]: Liaoling 该单位的双字母国家/地区代码是什么? [Unknown]: CN CN=localhost, OU=com, O=co, L=Dalian, ST=Liaoling, C=CN是否正确? [否]: y 输入 <tomcat> 的密钥口令 (如果和密钥库口令相同, 按回车): C:\Users\test>
命令完成之后会在C:\Users\test目录下生成一个.keystore文件
4、把生成的.keystore文件剪切到tomcat的conf目录
如果习惯使用命令,可以输入如下命令
C:\Users\test>move .keystore D:\apache-tomcat-7.0.55\conf 移动了 1 个文件。
5、查看conf\server.xml
找到port="8443"的例子,把注释中间的内容复制出来。笔者找到的内容如下
<!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" /> -->
把<!-- -->之间的内容复制出来,然后添加上keystore文件路径和keystore密码
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/.keystore" keystorePass="12345678"/>
然后用浏览器打开如下网址
如果浏览器提示证书不受信任,点继续浏览即可。单向连接配置完成。
上文中回避了一个问题:密钥库使用的密钥与后面服务器使用的证书<tomcat>密钥不一致时,上面的配置启动会报错。
解决方法,在server.xml的<connector>标签里加上别名keyAlias和别名密码keyPass,如果创建.keystore使用的密钥库密钥为12345678,别名为tomcat密钥为12341234,则配置如下:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/.keystore" keystorePass="12345678" keyAlias="tomcat" keyPass="12341234" />
二、双向HTTPS连接
下面我们来配置双向HTTPS连接
为了更清晰的表述,下面这张图代表了整个流程(虽然不是流程图)
1、创建服务器密钥库,密钥库类型为JKS(默认就是JKS,也可以通过-storetype参数指定),名称为server.keystore,同时创建第一个条目,别名为tomcat
命令如下
keytool -genkey -v -alias tomcat -keyalg RSA -storetype JKS -validity 3650 -keystore server.keystore -dname "CN=localhost,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,c=Unknown" -storepass 12345678 -keypass 12341234
结果如下
C:\Users\test>keytool -genkey -v -alias tomcat -keyalg RSA -storetype JKS -v alidity 3650 -keystore server.keystore -dname "CN=localhost,OU=Unknown,O=Unknow n,L=Unknown,ST=Unknown,c=Unknown" -storepass 12345678 -keypass 12341234 正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 3,650 天): CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown [正在存储server.keystore] C:\Users\test>
2、创建客户端密钥库,密钥库类型为PKCS12(通过-storetype参数指定),名称为client.p12,同时创建第一个条目,别名为client1
创建命令
keytool -genkey -v -alias client1 -keyalg RSA -storetype PKCS12 -validity 3650 -keystore client.p12 -dname "CN=client1,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,c=Unknown" -storepass 12345678
结果
C:\Users\test>keytool -genkey -v -alias client1 -keyalg RSA -storetype PKCS1 2 -validity 3650 -keystore client.p12 -dname "CN=client1,OU=Unknown,O=Unknown ,L=Unknown,ST=Unknown,c=Unknown" -storepass 12345678 正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 3,650 天): CN=client1, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown [正在存储client.p12] C:\Users\test>
查看命令
keytool -list -storetype PKCS12 -keystore client.p12 -storepass 12345678
结果
C:\Users\test>keytool -list -storetype PKCS12 -keystore client.p12 -storepas s 12345678 密钥库类型: PKCS12 密钥库提供方: SunJSSE 您的密钥库包含 1 个条目 client1, 2015-5-10, PrivateKeyEntry, 证书指纹 (SHA1): F4:8B:10:4A:3F:B6:EE:BF:A7:29:52:BC:37:C8:A9:D9:81:A4:2F:20 C:\Users\test>
3、将客户端的条目1导出为cer证书,导出的cer证书供浏览器导入使用,在后一步中导入到服务器证书库让服务器信任客户端的证书
命令
keytool -export -alias client1 -keystore client.p12 -storetype PKCS12 -storepass 12345678 -rfc -file client1.cer
结果
C:\Users\test>keytool -export -alias client1 -keystore client.p12 -storetype PKCS12 -storepass 12345678 -rfc -file client1.cer 存储在文件 <client1.cer> 中的证书 C:\Users\test>
4、将上一步导出的cer证书导入到服务器密钥库server.keystore
命令
keytool -import -v -alias sclient1 -file client1.cer -keystore server.keystore -storepass 12345678
结果
C:\Users\test>keytool -import -v -alias sclient1 -file client1.cer -keystore server.keystore -storepass 12345678 所有者: CN=client1, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 发布者: CN=client1, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 序列号: 50035e11 有效期开始日期: Sun May 10 23:48:18 CST 2015, 截止日期: Wed May 07 23:48:18 CST 2025 证书指纹: MD5: 12:FC:B0:83:F4:AB:E3:23:09:95:3F:7D:72:01:C2:FB SHA1: F4:8B:10:4A:3F:B6:EE:BF:A7:29:52:BC:37:C8:A9:D9:81:A4:2F:20 SHA256: AB:3C:44:C0:1E:83:15:2B:E7:D9:93:33:B1:71:34:F3:85:FD:FB:64:CA: 58:96:16:40:EA:A7:7B:41:9C:A2:A7 签名算法名称: SHA256withRSA 版本: 3 扩展: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 6D 0C 03 84 A0 80 F7 05 D7 9B 9C F9 96 CC 03 A5 m............... 0010: 05 1A 92 6C ...l ] ] 是否信任此证书? [否]: y 证书已添加到密钥库中 [正在存储server.keystore] C:\Users\test>
查看是否导入成功,命令
keytool -list -keystore server.keystore -storepass 12345678
结果
C:\Users\test>keytool -list -keystore server.keystore -storepass 12345678 密钥库类型: JKS 密钥库提供方: SUN 您的密钥库包含 2 个条目 sclient1, 2015-5-10, trustedCertEntry, 证书指纹 (SHA1): F4:8B:10:4A:3F:B6:EE:BF:A7:29:52:BC:37:C8:A9:D9:81:A4:2F:20 tomcat, 2015-5-10, PrivateKeyEntry, 证书指纹 (SHA1): 66:55:9E:65:D2:EB:17:62:E8:8E:1E:F5:01:C6:AC:C5:86:7D:52:78 C:\Users\test>
上述过程完成后,证书生成工作做完了,在C:\Users\test目录可以看到server.keystore、client.p12、client1.cer三个文件
1.下面配置tomcat
将server.keystore复制到D:\apache-tomcat-7.0.55\conf目录下,并对server.xml加入如下配置
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="conf/server.keystore" keystorePass="12345678" keyAlias="tomcat" keyPass="12341234" truststoreFile="conf/server.keystore" truststorePass="12345678"/>
2.将client1.cer证书导入浏览器
火狐:菜单-->选项-->查看证书-->您的证书-->导入 在对话框中找到client1.cer即可
火狐支持的导入方式:PKCS12文件(*.p12;pfx)、证书文件(*.p7b;*.crt;*.cert;*.cer;*.pem;*.der)
IE11:工具-->Internet选项-->内容-->证书-->个人-->导入-->下一步-->浏览中找到client.p12即可
IE11支持的导入方式如下
X.509证书(*.cer;*.crt)、个人信息交换(*.pfx;*.p12)、证书信任列表(*.stl)、证书吊销列表(*.crl)、Microsoft 系列证书存储(*.sst)、PKCS #7 证书(*.spc;p7b)
其中下列各式可以在一个文件中存储多个证书(即证书存储库)
个人信息交换- PKCS #12(.PFX,.P12)
加密消息语法标准- PKCS #7 证书(.P7B)
Microsoft 系列证书存储(.SST)
注:上文生成的cer证书导入IE11时不能导入IE证书的个人存储区,后来直接用p12证书导入成功,经过测试IE11证书的个人存储区只能导入PCKS #12(pfx,p12)格式,其他格式全部拒绝,因此上文生成cer显得多余了,完全可以用client.p12导入IE和火狐。
追加实验:虽然可以通过mmc.exe(windows管理控制台)可以将cer证书强制导入IE11证书的个人存储区,但是IE并不会接受这个证书,在IE选项里面仍然看不到。