我在 Raspberry Pi (Debian) 上使用 Apache 托管网页,但似乎无法让服务器颁发当前证书。我使用以下命令生成了自签名 SSL 证书/home/pi/ssl/
:
openssl req -new -sha256 -x509 -nodes -days 365 -out example.com.pem -keyout example.com.key
Apache从文件中查找.pem
和文件对,其中包含:.key
/etc/apache2/sites-enabled/owncloud.conf
SSLCertificateFile /home/pi/ssl/example.com.pem
SSLCertificateKeyFile /home/pi/ssl/example.com.key
当我删除这些文件并重新启动 Apache 时,出现错误[FAIL] Reloading web server config: apache2 failed!
。在生成新的证书文件对后重新启动时不会发生此错误,因此 Apache 似乎正在调用该证书。
然而,通过浏览器(Chrome 隐身模式或 FF/Safari 私人窗口,甚至是以前从未请求过域名的计算机上的浏览器)获得的证书是我一个月前生成的旧证书 - 如下所示:
知道为什么会发生这种情况吗?
答案1
事实证明,出于某种原因,颁发的证书是默认的 Apache“snakeoil”证书。我通过以下方式确定了这一点:
grep -i -r "SSLCertificateChainFile" /etc/apache2/
.. 它从引用了 Snakeoil 证书的文件中返回了 2 行/etc/apache2/sites-available/default-ssl
。我注释掉了这些行,浏览器现在返回了自定义证书。
答案2
此类问题的常见根源是多个正在运行的 Apache 实例。配置更改由您(重新)启动的进程获取,但请求由使用旧配置运行的旧进程处理。
停止服务:
service apache2 stop
检查网站是否仍可访问。如果可以,则您已找到原因。
现在运行
ps aux | grep apache
它将为您提供正在运行的 apache2 进程及其 PID 的列表。将它们全部杀死(请注意,此命令还可能返回名称/用户等中包含 Apache 的无关进程,例如 Apache Tomcat,您可能不想杀死它们。)
kill <pid>
再次运行 ps aux 并确保进程不再运行。
再次检查网站是否可以访问。应该不能。
现在启动 apache 服务
service apache2 start
验证新证书是否正在提供。
如果你不想终止进程,你可以重启系统。效果是一样的。