0

0

Python与OpenSSL:使用subprocess模块创建自签名SSL证书

聖光之護

聖光之護

发布时间:2025-10-11 14:48:38

|

907人浏览过

|

来源于php中文网

原创

Python与OpenSSL:使用subprocess模块创建自签名SSL证书

本文详细介绍了如何利用python的`subprocess`模块调用openssl命令行工具,以简洁高效的方式生成自签名ssl证书。通过将复杂的openssl命令封装在python函数中,用户可以轻松实现证书和私钥的创建,适用于开发、测试或内部系统等场景,避免了直接在python中重现所有openssl参数的复杂性。

在现代网络应用中,SSL/TLS证书是确保数据传输安全的关键组件。虽然生产环境通常需要由受信任的证书颁发机构(CA)签发的证书,但在开发、测试或内部系统中,自签名证书提供了一种便捷的解决方案。当需要将复杂的OpenSSL命令行操作(如涉及CA签发或特定扩展)集成到Python脚本中时,直接使用Python的cryptography库可能需要精细地配置每一个参数,而通过subprocess模块调用OpenSSL命令行工具则能提供一种更为直接和灵活的方法。

使用subprocess模块生成自签名证书

Python的subprocess模块允许我们创建新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。这意味着我们可以像在终端中一样执行OpenSSL命令,并将其结果集成到Python程序中。

以下是一个使用subprocess模块生成自签名SSL证书和对应私钥的示例:

企奶奶
企奶奶

一款专注于企业信息查询的智能大模型,企奶奶查企业,像聊天一样简单。

下载
import subprocess
import os

def generate_self_signed_certificate(cert_path: str, key_path: str, days: int = 365):
    """
    使用OpenSSL命令行工具生成自签名SSL证书和私钥。

    Args:
        cert_path (str): 生成的证书文件的完整路径(例如:'./certs/certificate.crt')。
        key_path (str): 生成的私钥文件的完整路径(例如:'./certs/private_key.key')。
        days (int): 证书的有效期(天数)。默认为365天。
    """
    # 确保输出目录存在
    os.makedirs(os.path.dirname(cert_path), exist_ok=True)
    os.makedirs(os.path.dirname(key_path), exist_ok=True)

    # OpenSSL命令参数列表
    # -x509: 生成自签名证书
    # -newkey rsa:4096: 生成一个新的RSA私钥,位长4096
    # -keyout [key_path]: 指定私钥的输出路径
    # -out [cert_path]: 指定证书的输出路径
    # -days [days]: 指定证书的有效期
    # -nodes: 不加密私钥(通常用于自动化脚本,生产环境应考虑加密)
    # -subj "/CN=localhost": 设置证书主题的通用名称,可根据需要修改
    openssl_cmd = [
        'openssl', 'req', '-x509', '-newkey', 'rsa:4096',
        '-keyout', key_path,
        '-out', cert_path,
        '-days', str(days),
        '-nodes',  # 不对私钥进行加密,方便自动化,但安全性较低
        '-subj', '/CN=localhost/O=MyOrg/C=US' # 示例主题信息
    ]

    try:
        # 执行OpenSSL命令
        # check=True: 如果命令返回非零退出码,将抛出CalledProcessError异常
        subprocess.run(openssl_cmd, check=True, capture_output=True, text=True)
        print(f"证书和私钥已成功生成:\n  证书文件: {cert_path}\n  私钥文件: {key_path}")
    except FileNotFoundError:
        print("错误:OpenSSL命令未找到。请确保OpenSSL已安装并配置在系统的PATH中。")
    except subprocess.CalledProcessError as e:
        print(f"生成证书时发生错误:{e}")
        print(f"标准输出:\n{e.stdout}")
        print(f"标准错误:\n{e.stderr}")
    except Exception as e:
        print(f"发生未知错误:{e}")

if __name__ == "__main__":
    # 定义证书和私钥的输出路径
    output_dir = "generated_certs"
    cert_filename = "server.crt"
    key_filename = "server.key"

    full_cert_path = os.path.join(output_dir, cert_filename)
    full_key_path = os.path.join(output_dir, key_filename)

    # 调用函数生成证书
    generate_self_signed_certificate(full_cert_path, full_key_path, days=730)

代码解析

  1. import subprocess 和 import os: 导入所需的模块。subprocess用于执行外部命令,os用于处理文件路径和目录创建。
  2. generate_self_signed_certificate 函数:
    • 接收cert_path(证书输出路径)、key_path(私钥输出路径)和days(有效期)作为参数。
    • os.makedirs(os.path.dirname(cert_path), exist_ok=True): 确保证书和私钥的输出目录存在,如果不存在则创建。
    • openssl_cmd 列表: 这是传递给subprocess.run的OpenSSL命令及其参数。
      • 'openssl': 调用OpenSSL可执行文件。
      • 'req': 用于证书签名请求(CSR)管理。
      • '-x509': 指示生成自签名证书而不是CSR。
      • '-newkey rsa:4096': 生成一个新的RSA私钥,位长为4096位。
      • '-keyout [key_path]': 将生成的私钥写入指定文件。
      • '-out [cert_path]': 将生成的证书写入指定文件。
      • '-days [days]': 设置证书的有效期(例如365天)。
      • '-nodes': 不加密私钥。在自动化脚本中这很方便,但请注意,未加密的私钥安全性较低。在生产环境中,通常会选择加密私钥并妥善保管。
      • '-subj "/CN=localhost/O=MyOrg/C=US"': 设置证书的主题信息。/CN是通用名称(Common Name),/O是组织(Organization),/C是国家(Country)。您可以根据实际需求修改这些值。
    • subprocess.run(openssl_cmd, check=True, capture_output=True, text=True):
      • check=True: 如果OpenSSL命令以非零状态码退出(表示错误),subprocess.CalledProcessError将被抛出,便于错误处理。
      • capture_output=True: 捕获OpenSSL命令的标准输出和标准错误。
      • text=True: 将捕获的输出解码为文本(字符串),而不是字节
    • 错误处理: 使用try-except块捕获可能发生的FileNotFoundError(如果OpenSSL未安装或不在PATH中)和subprocess.CalledProcessError(如果OpenSSL命令执行失败)。

注意事项

  1. OpenSSL安装: 此方法要求您的系统上已安装OpenSSL,并且其可执行文件位于系统的PATH环境变量中,以便Python能够找到并执行它。
  2. 安全性:
    • 自签名证书不会被主流浏览器操作系统默认信任,因此在使用时会收到安全警告。它们主要用于开发、测试或内部服务间的加密通信。
    • 示例中使用了-nodes参数来生成未加密的私钥。在生产环境中,为了提高安全性,建议移除此参数,让OpenSSL提示输入私钥密码。然后,在Python代码中加载私钥时,您需要提供相应的密码。
  3. 证书主题信息: 示例中的-subj参数提供了基本的证书主题信息。对于更复杂的证书需求,例如包含SAN(Subject Alternative Name)或其他扩展,您可能需要创建一个OpenSSL配置文件(.cnf文件),并通过-config参数将其传递给OpenSSL命令。
  4. 替代方案: 对于纯Python环境,cryptography库提供了更底层的API来生成证书和私钥,无需依赖外部OpenSSL可执行文件。然而,对于习惯OpenSSL命令行参数或需要复制特定OpenSSL行为的场景,subprocess方法通常更为直接。

总结

通过Python的subprocess模块调用OpenSSL命令行工具,为生成自签名SSL证书提供了一个强大且灵活的途径。这种方法允许开发者利用OpenSSL的全部功能和丰富的命令行参数,同时将证书生成过程无缝集成到Python应用程序中。虽然它要求OpenSSL在系统上可用,但其简洁性和对复杂OpenSSL命令的直接支持,使其成为许多开发和自动化场景的理想选择。

立即学习Python免费学习笔记(深入)”;

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

758

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

639

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

761

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1265

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

548

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

708

2023.08.11

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 3万人学习

Django 教程
Django 教程

共28课时 | 3.2万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号