配置双向SSL证书需要服务器和客户端各自提供证书,并验证对方的证书合法性。下面是详细步骤和示例:
1. 生成证书(使用 OpenSSL)
1.1 生成根证书(CA)
bash
复制
生成CA私钥
openssl genrsa
out ca.key 2048
生成自签名的CA根证书(有效期365天)
openssl req
new -x509 -days 365 -key ca.key -out ca.crt
1.2 生成服务器证书
bash
复制
生成服务器私钥
openssl genrsa
out server.key 2048
生成证书签名请求(CSR)
openssl req
new -key server.key -out
server.csr
用CA签发服务器证书(有效期365天)
openssl x509
req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
1.3 生成客户端证书
bash
复制
生成客户端私钥
openssl genrsa
out client.key 2048
生成证书签名请求(CSR)
openssl req
new -key client.key -out
client.csr
用CA签发客户端证书(有效期365天)
openssl x509
req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out
client.crt
导出为.p12格式(供浏览器或客户端使用)
openssl pkcs12
export -out client.p12 -inkey client.key -in client.crt -certfile ca.crt
2. 配置服务器端
2.1 Nginx 配置
nginx
复制
server {
listen 443 ssl;
server_name example.com;
服务器证书和私钥
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;
开启双向认证
ssl_verify_client on;
ssl_client_certificate /path/to/ca.crt; # 信任的CA证书(用于验证客户端)
其他SSL配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
}
2.2 Apache 配置
apache
复制
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /path/to/server.crt
SSLCertificateKeyFile /path/to/server.key
开启双向认证
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile /path/to/ca.crt # 信任的CA证书
其他配置
</VirtualHost>
2.3 Tomcat 配置
在 conf/server.xml 中修改 Connector:
xml
复制
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="/path/to/server.jks"
certificateKeystorePassword="changeit"
type="RSA" />
<!-- 开启双向认证 -->
<Certificate certificateVerification="required"
truststoreFile="/path/to/ca.jks"
truststorePassword="changeit" />
</SSLHostConfig>
</Connector>
运行 HTML
2.4 Spring Boot 配置
在 application.properties 中:
properties
复制
服务器证书
server.ssl.key-store=classpath:server.jks
server.ssl.key-store-password=changeit
server.ssl.key-alias=server
客户端证书验证
server.ssl.client-auth=need
server.ssl.trust-store=classpath:ca.jks
server.ssl.trust-store-password=changeit
3. 客户端配置
3.1 使用 curl 测试
bash
复制
curl --cert client.crt --key client.key --cacert ca.crt https://example.com
3.2 浏览器配置
1. 将 client.p12 导入浏览器的个人证书库。
2. 确保服务器的CA证书(ca.crt)已添加到浏览器的信任列表中。
3.3 Java 客户端
java
复制
System.setProperty("javax.net.ssl.keyStore", "/path/to/client.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
System.setProperty("javax.net.ssl.trustStore", "/path/to/ca.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
4. 注意事项
1. 证书链完整性:确保所有中间CA证书已正确包含。
2. 证书有效期:检查服务器和客户端证书是否过期。
3. 域名匹配:服务器证书的 Common Name (CN) 或 Subject Alternative Name (SAN) 需与实际域名一致。
4. 权限设置:私钥文件(如 .key)应设为仅所有者可读(chmod 600)。
5. 防火墙/端口:确保服务器443端口对外开放。
以上四大步骤,就可完成双向SSL认证的配置。根据实际环境调整路径和参数,遇到问题时可通过日志(如Nginx的 error.log)排查错误。