HTTPS双向认证:SSL证书生成与部署指南
一、HTTPS双向认证基础
在建立客户端与服务器的HTTPS连接时,需要进行双向身份验证,确保通信双方的身份合法性。
二、数字证书类型及浏览器显示
不同类型的数字证书在服务器部署后,用户浏览器访问网站时会显示不同的安全标识:
1. 无证书情况
浏览器显示"不安全"标识,表明连接未加密。
2. 域名验证型(DV)SSL证书
显示安全连接标识,但证书中不包含组织信息。
3. 企业验证型(OV)SSL证书
显示安全连接标识,证书详情中包含组织信息。
4. 增强型(EV)SSL证书
地址栏显示绿色,展示安全连接标识,并在地址栏直接显示组织名称。
三、SSL证书生成流程
证书生成过程包括创建根证书、服务器证书和客户端证书,用于实现双向认证。
1. 环境准备
操作系统:Linux (CentOS 7及以上)
Web服务器:Apache Tomcat 8.5.42及以上
加密工具:OpenSSL 1.1.0c
2. OpenSSL安装
# 解压安装包
tar -xzvf openssl-1.1.0c.tar.gz
# 进入解压目录
cd openssl-1.1.0c
# 编译安装OpenSSL到指定目录
./config --prefix=/usr/local/openssl && make && make install
# 备份原有文件
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
# 创建软链接
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
# 添加库文件搜索路径
echo /usr/local/openssl/lib >> /etc/ld.so.conf
# 更新共享库
ldconfig -v
# 验证安装
openssl version -a
3. 创建根证书(CA)
3.1 生成根证书私钥
# 生成204位RSA密钥
openssl genrsa -des3 -out ca.key 2048
# 输入并确认密码
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:
3.2 创建根证书签名请求
# 生成证书签名请求
openssl req -new -key ca.key -out ca.csr
# 按提示填写信息
Enter pass phrase for ca.key:
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Shanghai
Locality Name (eg, city) []:Shanghai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:TechCompany
Organizational Unit Name (eg, section) []:IT
Common Name (eg, YOUR name) []:
Email Address []:admin@techcompany.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
3.3 创建根证书文件
# 创建有效期为10年的根证书
openssl x509 -req -days 3650 -sha256 -extfile /usr/local/openssl/ssl/openssl.cnf -extensions v3_ca -signkey ca.key -in ca.csr -out ca.crt
Enter pass phrase for ca.key:
3.4 创建信任存储库
# 创建JKS格式的truststore文件
keytool -keystore ca.truststore -keypass 123456 -storepass 123456 -alias rootca -import -trustcacerts -file /tmp/ca/ca.crt
输入"yes"确认信任此证书
4. 创建服务器证书
4.1 生成服务器私钥
# 创建服务器密钥对
openssl genrsa -des3 -out server.key 2048
# 输入并确认密码
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
# 可选:移除密钥密码保护
openssl rsa -in server.key -out server.key
4.2 创建服务器证书签名请求
# 生成CSR文件
openssl req -new -key server.key -out server.csr
# 填写证书信息
Enter pass phrase for server.key:
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Shanghai
Locality Name (eg, city) []:Shanghai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:TechCompany
Organizational Unit Name (eg, section) []:IT
Common Name (eg, YOUR name) []:www.techcompany.com
Email Address []:admin@techcompany.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
4.3 创建服务器证书
# 使用CA签名服务器证书
openssl x509 -req -days 3650 -sha256 -extfile /usr/local/openssl/ssl/openssl.cnf -extensions v3_req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
Enter pass phrase for ca.key:
4.4 导出PKCS12格式证书
# 将证书和密钥导出为PKCS12格式
openssl pkcs12 -export -in /tmp/ca/server.crt -inkey /tmp/ca/server.key -out /tmp/ca/server.p12 -name "server"
# 根据提示输入密钥密码
4.5 创建JKS格式密钥库
# 将PKCS12文件导入JKS密钥库
keytool -importkeystore -v -srckeystore /tmp/ca/server.p12 -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore /tmp/ca/server.keystore -deststoretype jks -deststorepass 123456
5. 创建客户端证书
5.1 生成客户端私钥
# 创建客户端密钥对
openssl genrsa -des3 -out client.key 2048
# 输入并确认密码
Enter pass phrase for client.key:
Verifying - Enter pass phrase for client.key:
5.2 创建客户端证书签名请求
# 生成客户端CSR
openssl req -new -key client.key -out client.csr
# 填写客户端信息
Enter pass phrase for client.key:
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Shanghai
Locality Name (eg, city) []:Shanghai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:TechCompany
Organizational Unit Name (eg, section) []:IT
Common Name (eg, YOUR name) []:clientuser
Email Address []:client@techcompany.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
5.3 创建客户端证书
# 使用CA签名客户端证书
openssl x509 -req -days 3650 -sha256 -extfile /usr/local/openssl/ssl/openssl.cnf -extensions v3_req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt
Enter pass phrase for ca.key:
5.4 导出客户端PKCS12证书
# 导出客户端证书为PKCS12格式
openssl pkcs12 -export -in /tmp/ca/client.crt -inkey /tmp/ca/client.key -out /tmp/ca/client.p12 -name "client"
# 根据提示输入密钥密码
四、Tomcat服务器配置
1. 停止Tomcat服务
# 在Tomcat bin目录下执行
./shutdown.sh
2. 部署证书文件
# 复制服务器密钥库到Tomcat配置目录
cp /tmp/ca/server.keystore /你的Tomcat目录/conf/
# 复制信任存储库到Tomcat配置目录
cp /tmp/ca/ca.truststore /你的Tomcat目录/conf/
3. 配置server.xml
# 进入Tomcat配置目录
cd /你的Tomcat目录/conf
# 编辑server.xml文件
vi server.xml
找到并修改以下连接器配置(去掉注释并修改路径和密码):
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="/你的Tomcat目录/conf/server.keystore"
keystorePass="你的密码"
truststoreFile="/你的Tomcat目录/conf/ca.truststore"
truststorePass="你的密码"
clientAuth="true" sslEnabledProtocols="TLSv1.2"
/>
<Connector port="8011" protocol="AJP/1.3" redirectPort="8443" />
4. 启动Tomcat服务
# 在Tomcat bin目录下执行
./startup.sh
5. 测试HTTPS服务
使用浏览器访问以下地址进行测试:
- https://localhost:8443/
- https://你的服务器IP:8443/
首次访问时,浏览器会提示安装客户端证书,选择之前生成的client.p12文件导入即可完成双向认证。