HTTPS 双向认证详解 2025-04-03 网络安全 暂无评论 34 次阅读 #前言 前一篇我们讲解了《HTTPS安全通信解析:加密与认证机制》,本篇重点讲解一下https双向认证的原理。 #一、为啥需要双向认证? 让我们以一个日常场景来理解 HTTPS 双向认证,就好比在一个非常重要的机密文件交换场所。假设你是一位携带重要商业计划的企业代表,要与合作公司的高层进行文件交接。想象这个场所是一个虚拟的网络世界,而你就是客户端,合作公司就是服务器。 现在,假如没有任何认证,就如同任何人都能随意进出这个机密场所,那你的商业计划很容易被窃取或篡改,对吧?这就好比网络中信息容易被中间人攻击。但有了 HTTPS 双向认证就不同了。 首先,当你进入这个场所时,门口的保安(相当于服务器)会要求你出示特别通行证(这就是客户端证书),只有持有正确通行证的人才能进入。这一步确保了服务器知道你是被授权的客户端。而你也不会轻易相信这个场所就是真的合作公司指定地点,你也会要求查看这个场所的官方授权标识(服务器证书),确认这确实是合作公司的正规场地,不是某个不法分子设的陷阱。这就是客户端对服务器的身份验证。 #二、双向认证的应用案例 1. 企业内部办公系统:员工通过企业发放的客户端证书访问内部办公系统,如 OA、财务系统等。服务器验证员工证书,确保访问者是企业内部人员;员工浏览器验证服务器证书,防止访问钓鱼网站,保护企业敏感信息安全。 2. 网上银行:客户登录网上银行进行转账、查询等操作,银行服务器要求客户提供客户端证书确认身份,防止账号被盗用。同时,客户浏览器校验银行服务器证书,保障通信安全,避免信息泄露。 3. 电商平台与供应商通信:电商平台与供应商系统对接,传递订单、库存等数据时,双方使用 HTTPS 双向认证。平台服务器验证供应商客户端证书,供应商也验证平台服务器证书,保证数据传输的安全性与完整性,防止数据被篡改或窃取。 4. 医疗数据交互:医院间共享患者病历、检查结果,或医疗机构与第三方医疗服务提供商通信时,运用双向认证。接收方验证发送方客户端证书,发送方也确认接收方服务器证书,确保医疗数据只在授权机构间传输,保护患者隐私。 5. 政府政务服务平台:企业或民众登录政府政务服务平台办理业务,如税务申报、资质审批。平台通过双向认证,一方面确认用户身份,另一方面让用户确认平台真实性,保障政务办理安全高效,提升服务可靠性。 #三、做一个小实验来加深认识 以下是在 Windows 系统上安装 OpenSSL 和 Nginx,并进行 HTTPS 双向认证实验的步骤: ##安装 OpenSSL 访问 OpenSSL 官方网站( https://www.openssl.org/source/ )或 https://slproweb.com/products/Win32OpenSSL.html , 根据你的 Windows 系统版本下载对应的 OpenSSL 安装包。运行安装程序,在安装过程中可以选择自定义安装路径,记住安装路径,后续配置会用到。 ##安装 Nginx for Windows 访问 Nginx 官方网站( https://nginx.org/en/download.html ),在 Windows 版本下载页面找到适合你系统的稳定版本进行下载。解压下载的压缩包到你希望安装 Nginx 的目录,例如 C:\nginx。 ##生成证书和密钥 打开命令提示符,切换到 OpenSSL 安装目录下的 bin 文件夹。 1. 生成根证书私钥:执行 `openssl genrsa -out root.key 2048`,生成一个 2048 位的根证书私钥文件 root.key。 2. 生成根证书请求文件:执行 `openssl req -new -key root.key -out root.csr`,按照提示输入国家、省份、城市、组织等信息。 3. 自签名根证书:执行 `openssl x509 -req -days 3650 -in root.csr -signkey root.key -out root.crt`,生成有效期为 10 年的根证书 root.crt。 4. 生成服务器证书私钥:执行 `openssl genrsa -out server.key 2048`,生成服务器私钥 server.key。 5. 生成服务器证书请求文件:执行 `openssl req -new -key server.key -out server.csr`,输入相关信息,注意 Common Name 要填写服务器的域名或 IP 地址。 6. 用根证书签署服务器证书:执行 `openssl x509 -req -days 365 -in server.csr -CA root.crt -CAkey root.key -set_serial 01 -out server.crt`,生成服务器证书 server.crt。 7. 生成客户端证书私钥:执行 `openssl genrsa -out client.key 2048`,生成客户端私钥 client.key。 8. 生成客户端证书请求文件:执行 `openssl req -new -key client.key -out client.csr`,输入相关信息。 9. 用根证书签署客户端证书:执行 `openssl x509 -req -days 365 -in client.csr -CA root.crt -CAkey root.key -set_serial 02 -out client.crt`,生成客户端证书 client.crt。 ##配置 Nginx 进入 Nginx 安装目录,打开 conf 文件夹下的 nginx.conf 文件。在 server 块中添加以下配置: ``` server { listen 443 ssl; server_name your_server_name; # 替换为你的服务器域名或 IP 地址 ssl_certificate server.crt; # 服务器证书路径 ssl_certificate_key server.key; # 服务器私钥路径 ssl_client_certificate root.crt; # 客户端证书的根证书路径 ssl_verify_client on; # 开启客户端证书验证 location / { return 200 "Hello, mTLS!"; } } ``` 保存 nginx.conf 文件。 ##测试 HTTPS 双向认证 1. 启动 Nginx,在命令提示符中进入 Nginx 安装目录,执行 `start nginx.exe`。 2. 将客户端证书(client.crt)和私钥(client.key)转换为 pfx 格式的证书:`openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt -certfile root.crt`。生成证书需要填一个密码,选一个好记的,比如 123456。 3. 双击 pfx 证书,可以安装证书,输入密码 123456。使用浏览器访问服务器的 HTTPS 地址,浏览器会提示选择客户端证书,选择正确的证书后,如果能正常访问 `https://服务器IP地址` 页面,说明 HTTPS 双向认证配置成功。 4. 或者使用 curl 命令测试:`curl -v --cert client.crt --key client.key https://服务器IP地址`,如果连接成功并返回正常响应 "Hello, mTLS!",也表明成功。 标签: https 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。