配置Apache的国密SSL证书私钥自动输入,核心是使用 `SSLPassPhraseDialog exec:` 指令,但也有一种更安全的选择。
一、主流方案:使用 `exec:` 脚本(风险与便利并存)
这种方法的本质是创建一个输出密码的脚本,让Apache在启动时自动执行它以获取密码。
步骤详解:
1. 创建脚本文件
首先,在服务器上创建一个脚本文件,例如 `/etc/ssl/apache_pass.sh`,内容如下:
bash
#!/bin/sh
echo "你的私钥密码"
关键要求:
输出格式化:`echo` 命令输出必须且只能是你的私钥密码,不能包含任何其他字符,如空格、引号、制表符或多余的换行。建议写成 `echo "你的密码"`。
精确的路径:脚本路径必须是绝对路径,例如 `/etc/ssl/apache_pass.sh`。
正确的换行符:脚本文件必须使用 Unix 换行符 (LF),绝不能使用 Windows 的 CRLF,否则会导致密码匹配失败。
2. 设置安全权限
为了最小化风险,需要严格限制脚本的访问权限:
bash
chmod 500 /etc/ssl/apache_pass.sh
这会使脚本仅对 root 用户可读和可执行。
3. 配置 Apache
编辑 Apache 的 SSL 配置文件,通常是 `ssl.conf` 或 `httpd-ssl.conf`,在全局配置或 `<IfModule ssl_module>` 模块内添加如下行:
apache
SSLPassPhraseDialog exec:/etc/ssl/apache_pass.sh
务必使用**绝对路径。
脚本方案的核心风险
此方法的安全性完全依赖于脚本本身,存在明显的安全隐患:密码以明文形式存储在脚本中,任何能读取该文件的人都能获得私钥密码,等同于私钥未加密。
二、首选方案:移除私钥密码(更安全)
考虑到安全性,**更推荐在确保服务器物理安全后,直接为私钥移除密码**。这是目前国内主流生产环境(如腾讯云)的通用做法。
操作步骤:
1. 备份原始密钥
在进行任何操作前,务必备份你的原始国密私钥文件,这是个好习惯。
bash
cp server.key server.key.encrypted
2. 使用 `gmssl` 移除密码
国密证书使用 `gmssl` 工具进行处理,而非标准的 `openssl`。
bash
# -nodes 参数表示不对输出密钥进行加密(无密码)
gmssl ec -in server.key.encrypted -out server.key -nodes
如果你使用的是支持国密算法的 `openssl` 分支,命令可能为 `openssl pkey` 或 `openssl ec`。
3. 再次强调:严格权限控制
移除密码后的明文私钥文件权限必须设置得极其严格:
bash
chmod 600 server.key
此命令确保该文件仅能被其所有者(通常是 root 用户)读取,是保护明文私钥的唯一防线。
三、Geek 技巧:保障 exec: 脚本在 Windows 环境运行
如果你在 Windows(如 phpEnv)下使用 `exec:` 脚本,还需额外注意以下两点:
确保脚本路径位于 Apache 进程有权访问的盘符和目录。
确认 Windows 系统环境(如 WSL)下的 `/bin/sh` 或 bash 解释器可以正确执行该脚本。由于 Windows 的权限模型差异,`exec:` 模式有时会遇到问题,届时建议直接采用移除私钥密码的方案。