了解如何实施相互 TLS (mTLS) 身份验证以保护用户和 IoT 设备连接。包括分步证书设置、服务器配置、客户端实施和故障排除指南。
相互 TLS (mTLS) 身份验证创建了一个用于对用户和 IoT 设备进行身份验证的安全框架。本指南将引导您实施 mTLS,以确保客户端和服务器之间的安全双向身份验证。
设置双向 TLS 的过程很简单。首先,生成必要的服务器和客户端证书。接下来,配置服务器以要求客户端证书。然后使用客户端证书设置客户端并实施适当的证书验证。最后,测试连接以确保一切按预期运行。
SSL/TLS 协议的一个定义特征是它在计算机网络(如互联网)上对原本匿名的各方进行身份验证时所起的作用。当您访问具有公众信任的SSL/TLS 证书的网站时 ,您的浏览器可以向受信任的第三方证书颁发机构 (CA)(如 wosign.com)验证网站所有者是否已成功证明对该域名的控制权。如果此验证失败,则 Web 浏览器将警告您不要信任该网站。
对于大多数应用程序,SSL/TLS 使用这种服务器到客户端的单向身份验证;匿名客户端(Web 浏览器)与 Web 服务器协商加密会话,该服务器在SSL/TLS 握手期间提供公共信任的 SSL/TLS 证书来识别自己 :
相互认证(即 SSL/TLS 会话中的服务器和客户端都经过认证)也是可行的,在某些情况下非常有用。在相互认证中,一旦服务器在握手过程中通过了认证,它就会 CertificateRequest 向客户端发送一条消息。客户端将通过向服务器发送证书进行认证来做出响应:
Client Authentication (1.3.6.1.5.5.7.3.2) 通过相互 TLS 进行客户端身份验证需要在客户端设备上安装 包含扩展密钥用法 (EKU) 的证书 。wosign.com 的所有电子邮件、客户端和文档签名证书都包含客户端身份验证。
了解双向 TLS
传统 TLS 提供服务器身份验证和加密,但相互 TLS 更进一步,要求双方提供数字证书。这种双向验证可确保服务器真实性、实现客户端身份验证、建立加密通信通道并防止中间人攻击。结果是高度安全的连接,适用于敏感应用程序和物联网设备通信。
先决条件
在开始实施之前,请确保您可以访问 OpenSSL 或类似的证书管理工具。您的 Web 服务器必须支持 TLS,并且您需要访问证书颁发机构 (CA)或能够创建私有 CA。您的客户端还必须支持基于证书的身份验证。
步骤 1:证书生成和管理
首先生成服务器和客户端身份验证所需的证书。服务器证书设置需要创建私钥、生成证书签名请求,并使用您的 CA 签署证书。
# 生成服务器私钥
openssl genrsa -out server.key 2048
?
# 创建服务器证书签名请求(CSR) openssl req -new -key server.key -out server.csr
?
# 使用您的 CA 签署服务器证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
对于客户端证书,请按照类似的过程创建其唯一凭证:
# 生成客户端私钥
openssl genrsa -out client.key 2048
?
# 创建客户端 CSR
openssl req -new -key client.key -out client.csr
?
# 签署客户端证书
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
第 2 步:服务器配置
必须将服务器配置为需要并验证客户端证书。以下是 Nginx 的示例配置:
服务器{
监听443 ssl ;服务器名称example.com; ? ssl_certificate /path/to/ server .crt; ssl_certificate_key /path/to/ server .key; ssl_client_certificate /path/to/ca.crt; ssl_verify_client开启; ssl_protocols TLSv1. 2 TLSv1 .3; ssl_ciphers HIGH: !aNULL : !MD5 ; ssl_prefer_server_ciphers开启;
}
对于 Apache 服务器,请使用以下配置:
服务器名称example.com
SSLEngine在 SSLCertificateFile /path/to/server.crt SSLCertificateKeyFile /path/to/server.key SSLCACertificateFile /path/to/ca.crt SSLVerifyClient需要 SSLVerifyDepth 1
步骤 3:客户端实施
基于浏览器的身份验证需要将客户端证书导入浏览器的证书存储区。每个浏览器处理此过程的方式不同,但通常您可以在安全或隐私设置中找到该选项。
对于 IoT 设备,您需要在代码中实现基于证书的身份验证。以下是使用 Python 的请求库的示例:
导入 请求
?
client_cert =(’client.crt’,’client.key’
) ca_cert = ‘ ca.crt’ ?
响应 = 请求.get ( ‘ https : //example.com’,cert = client_cert,verify = ca_cert)
步骤 4:证书验证
正确的证书验证对于安全性至关重要。您的实施应验证证书链的完整性、检查到期日期、验证吊销状态并确保密钥使用正确。以下是示例实施:
从 cryptography 导入 x509
从 cryptography.hazmat.backends导入default_backend
?
defvalidate_certificate ( cert_path
) :使用open ( cert_path,’ rb ‘ )作为cert_file:cert_data = cert_file.read ( ) cert = x509.load_pem_x509_certificate ( cert_data,default_backend ( ) )如果cert.not_valid_after < datetime.datetime.now ( ) :引发ValueError ( “证书已过期” )尝试: key_usage = cert.extensions.get_extension_for_class ( x509.KeyUsage )如果不是key_usage.value.digital_signature:引发ValueError ( “证书对于数字签名无效” )除了x509.extensions 。 ExtensionNotFound:引发ValueError(“未找到所需的密钥使用扩展”)
相互 TLS 身份验证既可用于身份验证最终用户,也可用于计算机网络上设备的相互身份验证。
用户身份验证
企业和其他组织可以将数字客户端证书分发给最终用户,例如员工、承包商和客户。这些客户端证书可用作访问 Wi-Fi、VPN 和 Web 应用程序等公司资源的身份验证因素。当使用双向 TLS 替代(或补充)传统用户名/密码凭据时,双向 TLS 具有以下几个安全优势:
相互 TLS 身份验证不易受到通过网络钓鱼等手段窃取凭证的攻击。Verizon的《2020 年数据泄露调查报告》显示,近四分之一 (22%) 的数据泄露是由于网络钓鱼造成的。网络钓鱼活动的目的是获取容易获取的凭证,例如网站登录密码,而不是用户客户端证书的私钥。为了进一步防范网络钓鱼,wosign.com 的所有电子邮件、客户端和文档签名证书都包含用于签名和加密电子邮件的公开信任的S/MIME。
双向 TLS 身份验证不会因密码卫生不良或暴力破解而受到损害。您可以要求用户创建强密码,但您如何知道他们不会在 50 个不同的网站上使用相同的“安全”密码,或者将其写在便签上?2019 年的一项 Google 调查显示,52% 的用户在多个帐户中重复使用密码,13% 的用户在所有帐户中重复使用相同的密码 。
客户端证书提供清晰的信任链,并可集中管理。使用相互 TLS,验证哪个证书颁发机构 (CA) 颁发了用户的凭据将直接纳入身份验证流程。
wosign.com 提供多种颁发和管理客户端证书的选项:
只需要一张或几张证书的个人或组织可以从 wosign.com 订购电子邮件、客户端和文档签名证书。
SCEP、EST 和 CMP 等协议可用于自动化公司拥有和 BYO 设备的客户端证书注册和更新。
对于需要大量证书的客户,可以通过我们的批量采购计划获得批发折扣。
强大的安全性不仅仅需要实施 mTLS:
实施自动证书轮换,以确保证书定期更新
维护证书撤销列表,以快速使受损证书失效
对于 RSA 密钥,使用至少 2048 位的强密钥大小
配置您的服务器以仅接受安全的 TLS 版本和强密码套件
您的客户端安全策略应包括使用强大的访问控制保护私钥并实施证书锁定。定期的安全审核将有助于长期维护系统的完整性。
证书链问题
实施 mTLS 时,您可能会遇到证书链问题。这些问题通常源于:
证书链不完整
中间证书安装不正确
要解决这些问题:
验证您的信任锚配置是否正确
确保所有必要的证书均已存在
连接问题
连接问题通常与以下方面有关:
防火墙设置阻止 TLS 流量
证书权限不正确
故障排除:
检查您的证书是否正确命名
确保它们符合其预期用途
性能注意事项
在规模化时,性能考虑变得非常重要。要优化性能,请执行以下操作:
实现会话缓存,以减少重复握手的开销
选择平衡安全性和性能的高效密码套件
监控证书验证过程,确保不会产生不必要的开销
双向 TLS 为用户和 IoT 设备身份验证提供了强大的安全性。本指南引导您完成实施的基本步骤,从证书生成到解决常见问题。通过遵循这些准则并保持良好的安全实践,您可以创建一个安全的身份验证系统,该系统可防止基于网络的攻击,同时确保可靠的客户端识别。