配置双向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)排查错误。