杨斌
发布于 2025-09-06 / 20 阅读
0
0

F5或者Nginx做https双向认证

F5和Nginx都支持HTTPS双向认证。这会确保只有受信任的客户端才能访问服务。以下详细说明所需的文件和配置步骤。

组件

作用

所需文件(示例)

备注

CA根证书

签发服务器和客户端证书,是信任的起点

ca.key(私钥), ca.crt(证书)

自签名或来自权威CA

服务器证书

证明服务器身份

server.crt, server.key

通常由CA根证书签发,域名需匹配(haha.com

客户端证书

证明客户端身份

client.crt, client.key

必须由服务器信任的CA(如上述CA根证书)签发

Nginx配置

启用并指定双向认证规则

ssl_client_certificate, ssl_verify_client

指定信任的CA证书并开启客户端验证

F5配置 (Client SSL Profile)

定义F5如何处理SSL连接,包括双向认证

Trusted Certificate Authorities, Client Certificate

指定信任的CA并设置客户端证书验证方式为"Require"

客户端安装包

方便客户端安装证书

client.p12client.pfx

包含客户端证书和私钥,通常有密码保护

下面是具体的操作步骤。

一、生成证书文件

无论是Nginx还是F5,实现HTTPS双向认证都需要先准备一套PKI证书文件,包括CA根证书、服务器证书和客户端证书

  1. 创建CA根证书:首先需要生成一个CA根证书,用于后续签发服务器和客户端证书。

    bash

    # 生成CA私钥
    openssl genrsa -out ca.key 2048
    # 生成自签名的CA根证书
    openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
  2. 生成服务器证书:确保服务器证书的Common Name (CN) 与你的域名 haha.com 一致。

    bash

    # 生成服务器私钥
    openssl genrsa -out server.key 2048
    # 生成证书签名请求(CSR)
    openssl req -new -key server.key -out server.csr
    # 使用CA根证书签发服务器证书
    openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
  3. 生成客户端证书

    bash

    # 生成客户端私钥
    openssl genrsa -out client.key 2048
    # 生成证书签名请求(CSR)
    openssl req -new -key client.key -out client.csr
    # 使用CA根证书签发客户端证书
    openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
    # (可选)将客户端证书和私钥转换为P12格式,便于导入浏览器或系统
    openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

二、Nginx 配置双向认证

在Nginx中配置双向认证,主要是在SSL服务器块中添加指令,指定客户端证书验证。

  1. 修改Nginx配置:编辑你的Nginx配置文件(如 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf ),在对应的 server 块(监听8888端口)中添加以下指令:

    nginx

    server {
        listen 8888 ssl; # 监听8888端口的SSL连接
        server_name haha.com;
    
        # 服务器证书和私钥
        ssl_certificate /path/to/your/server.crt;
        ssl_certificate_key /path/to/your/server.key;
    
        # 指定用于验证客户端证书的CA证书
        ssl_client_certificate /path/to/your/ca.crt;
        # 开启客户端证书验证,on表示必须提供有效的客户端证书
        ssl_verify_client on;
        # 设置证书链验证深度
        ssl_verify_depth 2;
    
        ... # 其他配置(如root, index, location等)
    }
    • ssl_client_certificate必须指向你的CA根证书(ca.crt),而不是客户端证书。Nginx用它来验证客户端提交的证书是否由受信任的CA签发。

    • ssl_verify_client on; 会强制要求客户端提供证书且验证必须成功。若设为 optional,则客户端可选提供证书,但若提供则必须有效。

  2. 重新加载Nginx:保存配置文件后,测试配置是否正确并重新加载Nginx。

    bash

    nginx -t
    nginx -s reload

三、F5 配置双向认证

在F5 BIG-IP上配置HTTPS双向认证,主要在Client SSL Profile中进行设置。

  1. 导入证书文件:首先将CA根证书(ca.crt)、服务器证书(server.crt)和服务器私钥(server.key)导入F5的证书管理模块。

    • 路径通常为:Local Traffic > SSL Certificates > Import ...

    • 分别导入证书和密钥。

  2. 配置Client SSL Profile

    • 进入 Local Traffic > Profiles > SSL > Client

    • 创建一个新的Profile或编辑现有的。

    • CertificateKey 字段中,选择你导入的服务器证书和私钥。

    • Trusted Certificate Authorities 字段中,选择你导入的CA根证书(ca.crt)。这是F5用来验证客户端证书的信任锚。

    • 关键步骤:找到 Client Certificate 选项,将其设置为 Require。这意味着F5会要求客户端出示证书并进行严格验证。

    • 其他选项如证书链深度(Chain Depth)、密码套件(Ciphers)等根据需要进行调整。

    • 保存配置。

  3. 将Profile附加到Virtual Server

    • 编辑你的HTTPS Virtual Server(监听haha.com:8888)。

    • SSL Profile (Client) 部分,将刚才配置好的Client SSL Profile关联上去。

    • 保存更新。

四、测试与验证

配置完成后,测试双向认证是否正常工作。

  • 浏览器测试:用浏览器访问 https://haha.com:8888。浏览器应会弹出对话框让你选择客户端证书(如果你之前安装过)。如果未安装客户端证书,页面加载会失败(如HTTP 400错误)。你需要将之前生成的client.p12文件安装到系统的证书存储中。

  • cURL测试:可以使用cURL命令测试:

    bash

    curl --cert client.crt --key client.key --insecure https://haha.com:8888

    使用 --cert--key 参数指定客户端证书和私钥。--insecure 仅用于测试时跳过服务器证书验证(如果你用的是自签名证书),生产环境应确保服务器证书被正确信任。

五、核心原理不变

无论客户端是什么,双向认证的核心步骤都是:

  1. Client Hello -> Server Hello

  2. Server 发送它的证书 -> Client 验证 Server 证书

  3. Server 要求 Client 提供证书 -> Client 发送它的证书 -> Server 验证 Client 证书

  4. 验证通过后,协商密钥,开始加密通信。

这个过程在TLS协议层就完成了,之后的应用层(HTTP)通信才是API请求或网页内容。

六、注意事项

  • 性能影响:SSL/TLS握手本身会有性能开销,启用双向认证会增加额外的CPU负担,因为需要验证客户端证书。

  • 证书管理:确保客户端证书按期更新和轮换。妥善保管CA私钥,一旦泄露,整个信任体系都会受到影响。

  • 故障排除:如果连接失败,检查Nginx的error log或F5的日志。常见问题包括客户端证书未由受信任的CA签发、证书过期、虚拟服务器配置未应用新的SSL Profile等。

  • 灵活性:F5在配置双向认证时,除了Require,还可以选择Request模式(请求客户端证书但不强制验证),这提供了灵活性。

七、总结

F5和Nginx都能实现HTTPS双向认证。Nginx的配置更直接,通过修改配置文件指定CA证书和开启验证。F5则在图形化管理界面中,通过Client SSL Profile进行集中配置和管理,提供了丰富的细粒度控制选项。


评论