HTTPS协议是网络上最常用的安全协议。HTTPS=HTTP+SSL/TLS。
HTTPS分为单向认证和双向认证:
单向认证服务:服务端提供服务器证书给客户端,客户端单向认证服务端
双向认证服务:服务端提供服务器证书给客户端,客户端提供客户证书。客户端和服务端双向认证。
- 为tomcat配置单向认证
使用KeyTool生成密钥库文件(.keystore)和证书(.cer)。
生成keystore
keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 36000 -alias yel -keystore yel.keystore
输入个人信息
“名字与姓氏”输入域名,我们本机测试,所以用127.0.0.1
keystore文件生成好后,公私密钥对存储在里面。
从keystore导出证书,公钥存储在.cer文件中
D:\>keytool -exportcert -alias yel -keystore yel.keystore -file yel.cer -rfc
tomcat配置
修改tomcat的server.xml文件,加载密钥库文件keystore
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="d:/yel.keystore" keystorePass="123456"/>
https协议监听443端口,keystoreFile为密钥库文件路径,keystorePass为密钥库文件口令。
最后将我们的证书导入浏览器。
在浏览器输入https://127.0.0.1/可以看到tomcat主页。
流程分析:
tomcat作为服务端,加载了keystore就有了私钥。浏览器作为客户端导入了证书后就有了公钥。本着“私钥签名,公钥验签”的原则。服务端返回经过私钥的签名给客户端,客户端用公钥去验签。客户端单向认证服务端。此时如果浏览器未导入证书,就会提示“此网站的安全证书存在问题”。因为浏览器没有证书,无法用公钥去验证服务端的签名。
- 为tomcat配置双向认证
双向认证需要根证书、服务器证书、客户端证书
这些证书需要更强到的工具openssl生成。openssl可以从http://slproweb.com/products/Win32OpenSSL.html下载window的安装版。
生成根证书:
genrsa -des3 -out ca.key 1024
rsa -in ca.key -out ca.key
两条命名,都要求我们输入口令,比如123456。第一条命令生成密钥库文件,第二条命令去除密钥库口令。
req -new -x509 -key ca.key -out ca.crt
输入个人信息,生成根证书ca.crt。
pkcs12 -export -cacerts -inkey ca.key -in ca.crt -out ca.p12
java环境使用OpenSSL生成的证书必须转换格式为p12。个人信息交换文件(PKCS#12)可以作为密钥库和信任库使用。
生成服务器证书:
genrsa -des3 -out server.key 1024
rsa -in server.key -out server.key
这两条命令生成去除了口令的密钥库文件
req -new -key server.key -out server.csr
生成前面请求文件
ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
用Root CA去对服务器证书请求即csr(certificate request)进行签名认证
最后生成服务器证书server.crt
pkcs12 -export -clcerts -inkey server.key -in server.crt -out server.p12
转换格式为p12
生成客户端证书:
基本流程和生成服务器证书差不多,4条命令生成客户端证书client.crt
genrsa -des3 -out client.key 1024
rsa -in client.key -out client.key
req -new -key client.key -out client.csr
ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key
pkcs12 -export -inkey client.key -in client.crt -out client.p12
tomcat构建双向认证服务需要ca.p12,server.p12,client.p12个人信息交换文件。
浏览器里面受信任机构导入ca.p12,个人证书导入client.p12
tomcat下配置
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="conf/server.p12" keystorePass="123456" keystoreType="PKCS12" truststoreFile="conf/ca.p12" truststorePass="123456" truststoreType="PKCS12"/>
成功的话可以正常访问https://127.0.0.1/。客户端证书没导入的话就不能访问tomcat主页