相互 TLS (mTLS) 身份验证为用户和 IoT 设备身份验证创建了一个安全框架。本指南将引导您实现 mTLS 确保客户端和服务器之间的安全双向认证。
快速入门指南
建立相互 TLS 遵循一个简单的过程。首先,生成必要的服务器和客户端证书。接下来,配置您的服务器以要求客户端证书。然后使用其证书设置您的客户端并实施适当的证书验证。最后,测试连接以确保一切按预期运行。
单向和双向SSL /TLS 认证
SSL /的定义功能之一TLS 协议是它在身份验证计算机网络(例如Internet)上匿名方的角色。 当您访问公众信任的网站时 SSL /TLS 证书,您的浏览器可以验证网站所有者是否已成功向受信任的第三方证书颁发机构(CA)(例如SSL.com)证明了对该域名的控制权。 如果此验证失败,则Web浏览器将警告您不要信任该站点。 对于大多数应用程序,SSL /TLS 使用这种 单向认证 服务器到客户端; 匿名客户端(网络浏览器)与网络服务器协商加密会话,该服务器会提供公共信任的SSL /TLS 证明自己身份的证书 SSL /TLS 握手: 相互认证,其中两个服务器 和 SSL /中的客户端TLS 会话经过身份验证,也是可能的,并且在某些情况下可能非常有用。 在双向身份验证中,一旦服务器在握手期间通过身份验证,它将发送一个CertificateRequest
给客户的信息。 客户端将通过向服务器发送证书进行身份验证进行响应:
通过相互的客户端身份验证 TLS 要求证书包括 Client Authentication (1.3.6.1.5.5.7.3.2)
客户端设备上安装了扩展密钥用法(EKU)。 所有SSL.com的 电子邮件,客户端和文档签名证书 包括客户端身份验证。
详细实施指南
相互理解 TLS
传统 TLS 提供服务器身份验证和加密,但相互 TLS 更进一步,要求双方出示数字证书。这种双向验证可确保服务器真实性、实现客户端身份验证、建立加密通信通道并防止中间人攻击。结果是高度安全的连接,适用于敏感应用程序和物联网设备通信。
先决条件
在开始实施之前,请确保您可以访问 OpenSSL 或类似的证书管理工具。您的 Web 服务器必须支持 TLS,并且你需要访问 证书颁发机构(CA) 或创建私有 CA 的能力。您的客户端还必须支持基于证书的身份验证。
步骤 1:证书生成和管理
首先生成服务器和客户端身份验证所需的证书。服务器证书设置需要创建私钥, 生成证书签名请求并使用您的 CA 签署证书。
# 生成服务器私钥
openssl的 根萨 退房手续 server.key 2048
?
# 创建服务器证书签名请求(CSR)
openssl的 REQ -新的 -键 server.key 退房手续 服务器.csr
?
# 使用你的 CA 签署服务器证书
openssl的 x509 -请求 -在 服务器.csr -CA ca.crt -CAkey 密钥 -CA创建串行 退房手续 server.crt这
对于客户端证书,请按照类似的过程创建其唯一凭证:
# 生成客户端私钥
openssl的 根萨 退房手续 客户端密钥 2048
?
# 创建客户端 CSR
openssl的 REQ -新的 -键 客户端密钥 退房手续 客户端.csr
?
# 签署客户端证书
openssl的 x509 -请求 -在 客户端.csr -CA ca.crt -CAkey 密钥 -CA创建串行 退房手续 客户端.crt
第2步:服务器配置
必须将服务器配置为需要并验证客户端证书。以下是 Nginx 的示例配置:
服务器 {
听 443 SSL;
服务器名称 例子.com;
?
ssl_certificate /路径/到/服务器.crt;
ssl_certificate_key /路径/到/服务器。钥匙;
ssl_客户端_证书 /路径/到/ca.crt;
ssl_验证客户端 上;
ssl_协议 TLSv1。2 TLSv1.3;
ssl_密码 高:!aNULL:!MD5;
ssl_prefer_server_ciphers 上;
}
对于 Apache 服务器,请使用以下配置:
<VirtualHost *:443>
服务器名称 example.com
SSL引擎 on
SSL证书文件 /路径/到/服务器.crt
SSL证书密钥文件 /路径/到/服务器.key
SSLCAC证书文件 /路径/到/ca.crt
SSL验证客户端 要求
SSL验证深度 1
步骤 3:客户端实施
基于浏览器的身份验证需要将客户端证书导入浏览器的证书存储区。每个浏览器处理此过程的方式不同,但通常您可以在安全或隐私设置中找到该选项。
对于 IoT 设备,您需要在代码中实现基于证书的身份验证。以下是使用 Python 的请求库的示例:
进口 要求
?
客户端证书 = (‘客户端.crt’, ‘客户端密钥’)
ca_cert = ‘ca.crt’
?
响应 = 要求.得到('https://example.com',
证书=客户端证书,
确认=ca_cert)
步骤 4:证书验证
正确的证书验证对于安全性至关重要。您的实施应验证证书链的完整性、检查到期日期、验证吊销状态并确保密钥使用正确。以下是示例实施:
在 加密技术 进口 x509
在 加密技术.危险品.后端 进口 默认后端
?
DEF 验证证书(证书路径):
- 打开(证书路径, ‘rb’) as 证书文件:
证书数据 = 证书文件.读()
证书 = x509.加载_pem_x509_证书(证书数据, 默认后端())
if 证书.之后无效 < 日期时间.日期时间.现在():
提高 值错误(“证书已过期”)
尝试:
密钥用法 = 证书.扩展.获取类的扩展名(x509.密钥用法)
if 而不去 密钥用法.折扣值.数字签名:
提高 值错误(“证书对于数字签名无效”)
除 x509.扩展.未找到扩展名:
提高 值错误(“未找到所需的密钥使用扩展”)
相互认证用例
相互 TLS 身份验证既可以用于对最终用户进行身份验证,也可以用于计算机网络上设备的相互身份验证。用户认证
企业和其他组织可以将数字客户端证书分发给最终用户,例如员工,承包商和客户。 这些客户端证书可以用作访问公司资源(例如Wi-Fi,VPN和Web应用程序)的身份验证因素。 代替(或补充)传统的用户名/密码凭证时,相互 TLS 具有几个安全优势:- 相互 TLS 身份验证不容易通过诸如 钓鱼. Verizon的 2020数据违规调查报告 表示将近四分之一(22%)的数据泄露是由于网络钓鱼造成的。 网络钓鱼活动旨在获取容易获得的凭据,例如网站登录密码,而不是用户客户端证书的私钥。 为了进一步防范网络钓鱼,SSL.com的所有 电子邮件,客户端和文档签名 证书包括公共信任的 S/MIME 用于签名和加密的电子邮件。
- 相互 TLS 不良的密码卫生或暴力破解密码不会破坏身份验证。 您可以要求用户创建强密码,但是您如何知道他们没有在50个不同的网站上使用相同的“安全”密码,或者没有将其写在便笺上? 一个 2019年Google调查 表示52%的用户重复使用多个帐户的密码,而13%的用户重复使用相同的密码 所有 他们的帐户。
- 客户证书提供清晰的 信任链,并且可以集中管理。 与彼此 TLS,哪个证书颁发机构(CA)颁发了用户凭据的验证将直接进入身份验证过程。 SSL.com的 在线管理工具, 软件接口,以及对标准协议(如SCEP)的访问,使签发,更新和吊销这些凭证变得非常容易!
- 只需要一个或几个证书的个人或组织就可以订购 电子邮件,客户端和文档签名证书 来自SSL.com的点菜。
- 诸如SCEP,EST和CMP之类的协议可用于自动为公司拥有的和BYO设备进行客户端证书注册和续订。
- 对于需要大量证书的客户,可通过我们的批发折扣获得 经销商和批量购买计划.
安全最佳实践
强大的安全性不仅仅需要实施 mTLS:
- 实施自动证书轮换,以确保证书定期更新
- 维护证书撤销列表,以快速使受损证书失效
- 对于 RSA 密钥,使用至少 2048 位的强密钥大小
- 将服务器配置为仅接受安全 TLS 版本和强密码套件
您的客户端安全策略应包括使用强大的访问控制来保护私钥。定期的安全审核将有助于长期维护系统的完整性。
解决常见问题
证书链问题
在实施m时TLS,您可能会遇到证书链问题。这些问题通常源于:
- 证书链不完整
- 中间证书安装不正确
要解决这些问题:
- 验证您的信任锚配置是否正确
- 确保所有必要的证书均已存在
连接问题
连接问题通常与以下方面有关:
- 防火墙设置阻止 TLS 交通
- 证书权限不正确
解决方法:
- 检查您的证书是否正确命名
- 确保它们符合其预期用途
性能注意事项
在规模化时,性能考虑变得非常重要。要优化性能,请执行以下操作:
- 实现会话缓存,以减少重复握手的开销
- 选择平衡安全性和性能的高效密码套件
- 监控证书验证过程,确保不会产生不必要的开销
总结
相互 TLS 为用户和 IoT 设备身份验证提供强大的安全性。本指南引导您完成实施的基本步骤,从证书生成到解决常见问题。通过遵循这些准则并保持良好的安全实践,您可以创建一个安全的身份验证系统,该系统可防止基于网络的攻击,同时确保可靠的客户端识别。