Cool
Cool
Published on 2024-03-06 / 55 Visits
0
0

使用JDK自带工具keytool生成SSL证书

使用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算法。握手过程包括以下步骤:

  1. 浏览器将自己支持的加密规则发送给网站。
  2. 网站选出一组加密算法和HASH算法,并将自己的身份信息以证书的形式发回给浏览器。
  3. 浏览器验证证书的合法性,如果受信任,则生成随机数的密码并用证书中提供的公钥加密。
  4. 浏览器发送加密后的随机值给网站。
  5. 网站使用私钥解密浏览器发来的随机值,并验证HASH。
  6. 网站使用密码加密一段握手消息发送给浏览器。
  7. 浏览器解密并计算握手消息的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: 根证书密码。

注意:

  1. 设置clientAuth属性为true时,需要手动导入客户端证书才能访问。
  2. 访问https请求需要

https://localhost:8443/来访问。
3. 双向验证时,需要在浏览器中导入client.cer证书。

注意事项

  1. 在生成证书时,请按照提示填写相关信息,特别是Common Name(CN)要填写服务器域名或IP地址,否则会出现浏览器访问时证书不受信任的问题。
  2. 在配置Tomcat的Connector时,要确保keystoreFile、truststoreFile等路径正确,且文件可访问。
  3. 双向验证时,客户端需要导入服务器证书,服务器需要导入客户端证书,以建立信任关系。

参考资料

  1. Keytool详解-鄙人整理
  2. HTTPS工作原理及实战 - 知乎
  3. Java Keytool Commands - SSLShopper
  4. Tomcat配置SSL双向认证 - CSDN

Comment