Python 实现 SSL/TLS 证书
最后修改于 2024 年 1 月 29 日
在本文中,我们将介绍如何在 Python 中实现 SSL/TLS 证书。SSL 证书是一种数字证书,用于证明网站的身份并启用加密连接。
简介
我们的生活如今已与互联的数字世界紧密交织,在线互动已无缝融入我们的日常生活。这种高度的互联性使网络安全成为我们关注的焦点。在这些互动中,每一次点击、轻触或交易都会不经意间留下易受恶意利用的机密数据痕迹。这时,SSL 证书就派上用场了。
SSL 定义
SSL(安全套接层)及其演进版 TLS(传输层安全性)是精确设计的加密协议。它们的主要目的是在 Web 服务器和用户浏览器之间建立安全连接。这些协议保护我们免受数据泄露、网络钓鱼和未经授权访问等网络威胁。
在下一节中,我们将介绍在 Python 中集成 SSL 证书的过程。如今,精通 TLS/SSL 证书对于开发人员、安全爱好者或任何试图提高自身安全性的人来说都是一项基本技能。
获取 SSL 证书
加强我们网站安全的第一步是获取 SSL 证书。为此,我们需要向信誉良好的证书颁发机构 (CA) 提交证书签名请求 (CSR)。CSR 包含组织和服务器的详细信息,在 CA 颁发证书之前会经过 CA 的严格审查。
出于开发目的,我们可以创建自签名证书。对于生产环境,重要的是仅从值得信赖的 SSL 提供商处购买 SSL 证书。
下一步是在我们的 Web 服务器上安装它。安装过程会在我们的用户和服务器之间创建安全的链接,在浏览器地址栏中显示的令人放心的挂锁图标即是证明。安装过程可能因我们服务器的独特配置而异。
SSL 类型
以下列表描述了各种 SSL 证书类型
- 域名验证 (DV) SSL 证书:DV 证书是最简单、最快获得的。它们仅验证域名的所有权,因此适用于个人网站和小型博客。我们应该选择信誉良好的 SSL 提供商或 CA,他们可以为我们提供价格实惠或最低价的廉价 SSL。对于预算有限的人来说,这是一个不错的选择。
- 组织验证 (OV) SSL 证书:OV 证书提供更高级别的信任,因为 CA 会验证域名所有权和有关组织的一些详细信息。它们非常适合企业和电子商务网站。
- 扩展验证 (EV) SSL 证书:EV 证书提供最高级别的验证。它们要求对组织进行彻底的审查,通过浏览器地址栏为用户提供最高级别的信心。建议为在线企业和金融机构使用这些证书。
- 通配符 SSL 证书:对于管理单个域内众多一级子域的组织,通配符 SSL 证书提供了一个简化的解决方案,通过将它们全部包含在一个证书下集中安全性工作,从而降低了管理复杂性。
- 多域名 SSL 证书 (SAN):主题备用名称证书,更常称为 SAN 证书,提供了一种通用的安全方法,通过使用单个证书保护多个域名及其关联的子域名。这种方法简化了对各种在线资产的管理,同时保持了强大的安全标准。
我们根据我们的需求和预算选择合适的证书。
生成 CA 签名的 SSL 证书
生成 CA 签名的 SSL 证书需要以下步骤
选择一个受信任的证书颁发机构 (CA)
第一步是选择一个信誉良好的 CA 来颁发我们的 SSL/TLS 证书。CA 负责在颁发证书之前验证我们的域名和组织详细信息。
生成私钥和 CSR
SSL 证书使用非对称加密,采用一对密钥——一个私钥和一个公钥。要开始此过程,有必要生成证书签名请求 (CSR) 并创建私钥。OpenSSL 可用于此目的。以下是供参考的代码片段
$ openssl req -new -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr -subj "/CN=example.com"
该命令为我们的域名生成私钥 (example.com.key) 和 CSR (example.com.csr)。请务必将 example.com 替换为您的域名。
存储 CSR 文件
我们为证书文件创建一个本地目录。该目录应包含 CSR 文件。我们将此 CSR 与我们的私钥一起发送给 CA 进行验证。
Python SSL 证书安装
一旦我们从 CA 获取了 SSL 证书,我们就将其从 certificate.crt
重命名为 certificate.pem
。然后,我们使用以下代码在 Python 中创建 SSL 上下文
#!/usr/bin/python import ssl context = ssl.create_default_context() context.load_cert_chain(certfile='/path/to/our/certificate.pem', keyfile='/path/to/our/private.key')
验证安装
为了确保证书已正确安装和使用,我们可以使用 Python 的 SSL 模块检查服务器提供的 SSL 证书链
#!/usr/bin/python import ssl import socket hostname = 'example.com' # Replace with your domain name context = ssl.create_default_context() with socket.create_connection((hostname, 443)) as sock: with context.wrap_socket(sock, server_hostname=hostname) as ssock: chain = ssock.getpeercert(chain=True) print(chain)
代码示例通过 443 端口与我们的域建立连接,获取服务器的证书链,然后显示它。它验证了我们 SSL 证书的正确使用。
来源
在本文中,我们介绍了 SSL 证书,并展示了如何在 Python 语言中实现 CA 签名的 SSL 证书。
作者
列出所有 Python 教程。