必须用XAMPP自带openssl.exe在XAMPP\apache\bin\目录下以管理员权限执行命令生成证书,输出路径严格匹配httpd-ssl.conf配置,并确保Common Name与访问域名一致、证书含SAN字段、文件放至conf\ssl.key\和conf\ssl.crt\目录且无BOM及锁定问题。

能直接用 XAMPP 自带的 openssl.exe 生成,但必须在正确路径下执行、用对参数、放对位置——否则 Apache 启动失败或浏览器仍报“不安全”。
用 XAMPP 自带 openssl 生成证书的正确路径和命令
XAMPP 的 openssl.exe 在 XAMPP\apache\bin\ 目录下,不能在任意目录运行。它依赖同目录下的配置文件(如 openssl.cnf),路径错会导致生成的证书缺 SAN 或格式异常。
在管理员权限的 CMD 中执行:
cd C:\xampp\apache\bin openssl req -x509 -nodes -days 365 -newkey rsa:2048 ^ -keyout ..\conf\ssl.key\server.key ^ -out ..\conf\ssl.crt\server.crt
-
-nodes是关键:禁用私钥密码,否则 Apache 每次启动都要手动输密码,无法自动加载 -
Common Name必须填你实际访问的域名(如localhost、test.local),浏览器会校验该字段 - 输出路径必须与
httpd-ssl.conf中默认配置一致:conf/ssl.key/server.key和conf/ssl.crt/server.crt
为什么生成后浏览器仍提示“您的连接不是私密连接”
常见现象是锁图标显示“证书由未知颁发机构签发”,点开看到证书主体(Subject)是 CN=localhost,但你访问的是 dev.example.local——这说明证书没包含你的域名。
根本原因:openssl req -x509 默认不写入 Subject Alternative Name (SAN),而现代浏览器强制校验 SAN 字段。
- 若要支持
dev.example.local,必须手写openssl.cnf配置文件,显式声明[alt_names]段落 - XAMPP 自带的
makecert.bat脚本不支持自定义 SAN,不要依赖它 - 生成命令中必须加
-config dev.example.local.cnf参数,否则 SAN 不生效
证书文件放错位置或权限不对导致 Apache 启动失败
Apache 启动时报 SSL Library Error: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch,大概率是证书和私钥不匹配,或文件被 Windows 权限拦截。
- 确保
server.key和server.crt放在XAMPP\apache\conf\ssl.key\和XAMPP\apache\conf\ssl.crt\下(目录不存在就手动创建) - 检查文件是否被记事本另存为 UTF-8 with BOM —— 这会让
openssl解析失败;务必用 VS Code 或 Notepad++ 保存为 UTF-8 无 BOM - Windows 下若从 ZIP 解压或复制粘贴得到的文件可能被标记为“来自其他计算机”,右键属性 → 勾选“解除锁定”
真正卡住人的地方不是命令怎么敲,而是证书里有没有 SAN、文件放哪、权限干不干净——这三个点只要一个没对,HTTPS 就起不来,还很难定位。


















