✅ 第一步:添加 GUI 界面(使用 PySide6

我们将使用 PySide6 构建一个简单的 GUI 界面,包含输入框、按钮和输出日志。


🧰 安装依赖

pip install PySide6 cryptography ipaddress

📁 文件结构建议

cert-chain-gui/
├── certgen.py          # 核心逻辑(与上文一致)
├── main.py             # GUI 主程序
└── icons/              # 图标资源(可选)

📦 第二步:编写 GUI 程序 —— main.py

import sys
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QTextEdit, QComboBox, QDateTimeEdit, QMessageBox
from PySide6.QtCore import Qt, QDateTime
from certgen import generate_root_ca, generate_intermediate_ca, generate_server_cert, parse_sans


class CertChainGUI(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("证书链生成器")
        self.setGeometry(100, 100, 600, 600)

        layout = QVBoxLayout()

        # Common Name
        self.cn_input = QLineEdit("localhost")
        layout.addWidget(QLabel("Common Name:"))
        layout.addWidget(self.cn_input)

        # SANs
        self.san_input = QLineEdit("DNS:localhost,IP:127.0.0.1")
        layout.addWidget(QLabel("SAN (例如 DNS:example.com,IP:192.168.1.1):"))
        layout.addWidget(self.san_input)

        # Root CA 配置
        root_layout = QHBoxLayout()
        self.root_key_type = QComboBox()
        self.root_key_type.addItems(["RSA", "EC"])
        self.root_start = QDateTimeEdit(QDateTime.currentDateTime())
        self.root_end = QDateTimeEdit(QDateTime.currentDateTime().addYears(10))
        root_layout.addWidget(QLabel("Root CA 类型/时间范围:"))
        root_layout.addWidget(self.root_key_type)
        root_layout.addWidget(self.root_start)
        root_layout.addWidget(self.root_end)
        layout.addLayout(root_layout)

        # Intermediate CA 配置
        inter_layout = QHBoxLayout()
        self.inter_key_type = QComboBox()
        self.inter_key_type.addItems(["RSA", "EC"])
        self.inter_start = QDateTimeEdit(QDateTime.currentDateTime().addDays(10))
        self.inter_end = QDateTimeEdit(QDateTime.currentDateTime().addYears(5))
        inter_layout.addWidget(QLabel("Intermediate CA 类型/时间范围:"))
        inter_layout.addWidget(self.inter_key_type)
        inter_layout.addWidget(self.inter_start)
        inter_layout.addWidget(self.inter_end)
        layout.addLayout(inter_layout)

        # Server Cert 配置
        server_layout = QHBoxLayout()
        self.server_key_type = QComboBox()
        self.server_key_type.addItems(["RSA", "EC"])
        self.server_start = QDateTimeEdit(QDateTime.currentDateTime().addDays(20))
        self.server_end = QDateTimeEdit(QDateTime.currentDateTime().addDays(110))
        server_layout.addWidget(QLabel("Server Cert 类型/时间范围:"))
        server_layout.addWidget(self.server_key_type)
        server_layout.addWidget(self.server_start)
        server_layout.addWidget(self.server_end)
        layout.addLayout(server_layout)

        # 日志输出
        self.log_output = QTextEdit()
        self.log_output.setReadOnly(True)
        layout.addWidget(QLabel("日志输出:"))
        layout.addWidget(self.log_output)

        # 按钮
        btn = QPushButton("生成证书链")
        btn.clicked.connect(self.generate_chain)
        layout.addWidget(btn)

        self.setLayout(layout)

    def log(self, msg):
        self.log_output.append(msg)

    def generate_chain(self):
        try:
            common_name = self.cn_input.text()
            sans = parse_sans(self.san_input.text())

            root_key_type = self.root_key_type.currentText()
            root_start = self.root_start.dateTime().toPython()
            root_end = self.root_end.dateTime().toPython()

            inter_key_type = self.inter_key_type.currentText()
            inter_start = self.inter_start.dateTime().toPython()
            inter_end = self.inter_end.dateTime().toPython()

            server_key_type = self.server_key_type.currentText()
            server_start = self.server_start.dateTime().toPython()
            server_end = self.server_end.dateTime().toPython()

            self.log("🔐 开始生成根CA...")
            root_key, root_cert = generate_root_ca(
                key_type=root_key_type,
                start_time=root_start,
                end_time=root_end
            )

            self.log("🔐 开始生成中间CA...")
            inter_key, inter_cert = generate_intermediate_ca(
                root_key, root_cert,
                key_type=inter_key_type,
                start_time=inter_start,
                end_time=inter_end
            )

            self.log("🔐 开始生成服务器证书...")
            generate_server_cert(
                inter_key, inter_cert,
                common_name=common_name,
                sans=sans,
                key_type=server_key_type,
                start_time=server_start,
                end_time=server_end
            )

            self.log("✅ 证书链生成完成!")
            QMessageBox.information(self, "成功", "证书链已生成,请查看当前目录下的文件。")

        except Exception as e:
            self.log(f"❌ 错误:{str(e)}")
            QMessageBox.critical(self, "错误", str(e))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = CertChainGUI()
    window.show()
    sys.exit(app.exec())

📦 第三步:打包为 .exe(使用 pyinstaller

安装 pyinstaller:

pip install pyinstaller

打包命令:

pyinstaller --noconfirm --onefile --windowed --icon=icons/cert.ico main.py

如果你没有图标文件,可以省略 --icon 参数。


输出路径:

打包完成后,在 dist/main.exe 就是你的可执行文件!


📁 生成文件说明

运行后会在当前目录下生成如下文件:

文件说明
ca.key, ca.crt根CA
intermediate.key, intermediate.crt中间CA
server.key, server.crt服务器证书

✅ 示例截图(文字描述)

+-----------------------------------------------------+
| 证书链生成器                                         |
|                                                     |
| Common Name: [localhost]                            |
| SAN: [DNS:localhost,IP:127.0.0.1]                  |
|                                                     |
| Root CA 类型/时间范围: [EC] [2025-06-01T00:00] -> [2035-06-01T00:00] |
| Intermediate CA 类型/时间范围: [RSA] [2025-06-10T00:00] -> [2030-06-10T00:00] |
| Server Cert 类型/时间范围: [EC] [2025-06-20T00:00] -> [2025-09-20T00:00] |
|                                                     |
| [生成证书链]                                        |
|                                                     |
| 日志输出:                                           |
| ✔ 生成根CA                                          |
| ✔ 生成中间CA                                        |
| ✔ 生成服务器证书                                    |
+-----------------------------------------------------+

🚀 总结

你现在拥有了一个:

  • ✅ 支持 ECC/RSA 的完整证书链生成器
  • ✅ 带 GUI 的桌面应用
  • ✅ 可以打包为 .exe 的工具