使用JDK自带工具keytool生成SSL证书
HTTPS简介
HTTPS(Hypertext Transfer Protocol Secure)是一种网络安全传输协议,也称为HTTP over TLS、HTTP over SSL或HTTP Secure。在我们日常浏览网页时,常使用的是HTTP协议。然而,HTTP协议传输的数据都是未加密的,即明文,因此使用HTTP协议传输隐私信息是不安全的。HTTP使用80端口通讯,而HTTPS占用443端口通讯。为了提高网络传输的安全性,HTTPS通过超文本传输协议(HTTP)进行通信,但利用SSL/TLS来加密数据包。HTTPS的主要目的是提供对网络服务器的身份认证,以保护交换数据的隐私和完整性。
HTTPS由两部分组成:HTTP + SSL/TLS。在HTTP上又加了一层处理加密信息的模块,并且会进行身份验证。SSL(Secure Sockets Layer,安全套接层)是一种为网络通信提供安全及数据完整性的协议。它在网络传输层对网络连接进行加密,分为SSL记录协议和SSL握手协议。SSL的目的是提供安全的数据传输,包括身份验证、协商加密算法和交换加密密钥。
问题:为什么Firebug和Postman等浏览器调试工具获取到的是明文?
SSL对传输的数据进行加密,主要针对传输过程的安全。浏览器调试工具如Firebug等获取的是客户端加密之前或解密之后的数据,因此这些工具能够获得明文数据。
HTTPS工作原理
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,确立双方加密传输数据的密码信息。TLS/SSL协议使用非对称加密、对称加密和HASH算法。握手过程包括以下步骤:
- 浏览器将自己支持的加密规则发送给网站。
- 网站选出一组加密算法和HASH算法,并将自己的身份信息以证书的形式发回给浏览器。
- 浏览器验证证书的合法性,如果受信任,则生成随机数的密码并用证书中提供的公钥加密。
- 浏览器发送加密后的随机值给网站。
- 网站使用私钥解密浏览器发来的随机值,并验证HASH。
- 网站使用密码加密一段握手消息发送给浏览器。
- 浏览器解密并计算握手消息的HASH,握手过程结束,后续通信使用随机密码进行加密解密。
通信时序图如下:
[图示 HTTPS 通信时序图]
自签名证书简介
JDK中的keytool是一个证书管理工具,可以生成自签名证书,即自己生成的证书而不是官方生成的。自签名证书在非正式项目中使用足够,因为官方生成证书需要花费。
生成SSL证书步骤
步骤一:为服务器生成证书
在JDK的bin目录下,打开CMD命令行工具,执行以下命令:
keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore W:/tomcat.keystore -storepass 123456
按照提示填写相关信息,生成tomcat.keystore文件。
步骤二:为客户端生成证书
为浏览器生成证书,以便服务器验证。执行以下命令:
keytool -genkey -alias client -keypass 123456 -keyalg RSA -storetype PKCS12 -keypass 123456 -storepass 123456 -keystore W:/client.p12
按照提示填写相关信息,生成client.p12文件。
步骤三:让服务器信任客户端证书
导出客户端证书为CER文件:
keytool -export -alias client -keystore W:/client.p12 -storetype PKCS12 -keypass 123456 -file W:/client.cer
将client.cer文件导入服务器的证书库:
keytool -import -v -file W:/client.cer -keystore W:/tomcat.keystore
步骤四:让客户端信任服务器证书
导出服务器证书为CER文件:
keytool -keystore W:/tomcat.keystore -export -alias tomcat -file W:/server.cer
将server.cer文件导入浏览器的“受信任的根证书颁发机构”。
步骤五:配置Tomcat服务器
在Tomcat的server.xml文件中添加以下Connector配置:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true" maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS" keystoreFile="W:/tomcat.keystore"
keystorePass="123456" truststoreFile="W:/tomcat.keystore" truststorePass="123456" />
属性说明:
- clientAuth: 是否双向验证,设置为true表示双向验证。
- keystoreFile: 服务器证书文件路径。
- keystorePass: 服务器证书密码。
- truststoreFile: 用于验证客户端证书的根证书,即服务器证书。
- truststorePass: 根证书密码。
注意:
- 设置clientAuth属性为true时,需要手动导入客户端证书才能访问。
- 访问https请求需要
用https://localhost:8443/来访问。
3. 双向验证时,需要在浏览器中导入client.cer证书。
注意事项
- 在生成证书时,请按照提示填写相关信息,特别是Common Name(CN)要填写服务器域名或IP地址,否则会出现浏览器访问时证书不受信任的问题。
- 在配置Tomcat的Connector时,要确保keystoreFile、truststoreFile等路径正确,且文件可访问。
- 双向验证时,客户端需要导入服务器证书,服务器需要导入客户端证书,以建立信任关系。