✅ 第一步:添加 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
的工具