使用certutil生成证书后缺失私钥,如何获取私钥并在Apache中配置使用?
certutil生成证书后缺失私钥,如何获取私钥并在Apache中配置使用?
嘿,别担心!你的私钥根本没丢——当你运行那个PowerShell脚本里的certreq -new命令时,私钥就已经自动存在本地计算机的个人证书存储里了(因为脚本里设置了MachineKeySet = TRUE,所以是机器级别的存储,不是用户个人存储)。certreq -retrieve只是从CA下载了颁发的证书文件,并没有把本地的私钥一起导出,所以你需要把证书和私钥打包成PFX格式,再转换成Apache能用的格式。
下面一步步来操作:
第一步:导出包含私钥的PFX文件
你可以用图形界面或者命令行来做,选你顺手的方式就行:
图形界面方式
- 按下Win+R,输入
certlm.msc回车,打开本地计算机证书管理器 - 展开左侧的「个人」→「证书」,找到你刚申请的证书(看CN名称就能识别)
- 右键这个证书 → 「所有任务」→ 「导出」
- 在导出向导里选择「是,导出私钥」,然后下一步选择「个人信息交换 - PKCS #12 (.PFX)」格式
- 设置一个安全的密码(后续转换需要用到),然后选择保存路径,完成导出。
命令行方式
- 先获取证书的指纹:打开PowerShell,运行
certutil -store My,找到对应CN的证书,复制它的指纹(一串十六进制字符,记得去掉中间的空格) - 运行导出命令,替换成你的密码、指纹和文件名:
certutil -exportpfx -p "你的安全密码" My "证书指纹(无空格)" "$CN.pfx"
比如:certutil -exportpfx -p "MyPass123!" My "A1B2C3D4E5F67890" "test.pfx"
第二步:将PFX转换成Apache支持的PEM格式
Apache通常需要分开的证书文件(.crt)和私钥文件(.key),我们用OpenSSL来转换:
- 导出私钥(如果不想让私钥带密码保护,就加
-nodes参数;如果需要密码保护,去掉这个参数):
openssl pkcs12 -in "$CN.pfx" -nocerts -out "$CN.key" -nodes
- 导出证书文件:
openssl pkcs12 -in "$CN.pfx" -nokeys -out "$CN.crt"
运行时会提示你输入之前设置的PFX密码,输入即可完成转换。
第三步:配置Apache使用证书
找到Apache的SSL配置文件(通常是ssl.conf或者httpd.conf里的SSL块),修改以下配置项:
# 指定证书文件路径 SSLCertificateFile "/path/to/your/certificate/$CN.crt" # 指定私钥文件路径 SSLCertificateKeyFile "/path/to/your/private-key/$CN.key" # 如果需要让客户端信任你的CA,还可以加上根证书路径 # SSLCACertificateFile "/path/to/your/root-ca.crt"
保存配置后,重启Apache服务,你的HTTPS服务就能正常使用这个证书了。
备注:内容来源于stack exchange,提问作者Daviid




