
我在 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從 file 中尋找.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 Incognito 或 FF/Safari 私有窗口,甚至以前肯定從未請求過域的計算機上的瀏覽器)中通過的證書是我一個月前生成的舊證書 - 見下文:
有什麼想法為什麼會發生這種情況嗎?
答案1
事實證明,出於某種原因,所頒發的憑證是預設的 Apache“snakeoil”憑證。我透過以下方式建立了這一點:
grep -i -r "SSLCertificateChainFile" /etc/apache2/
/etc/apache2/sites-available/default-ssl
..它從引用蛇油證書的文件中返回 2 行。我註解掉了這些行,瀏覽器現在會返回自訂憑證。
答案2
此類問題的常見根源是多個正在執行的 Apache 實例。配置變更由您(重新)啟動的進程獲取,但請求由使用舊配置運行的舊進程提供服務。
停止服務:
service apache2 stop
檢查該網站是否仍然可以訪問。如果是,那麼您已經確定了原因。
現在運行
ps aux | grep apache
它將為您提供正在運行的 apache2 進程及其 PID 的清單。將它們全部殺死(注意,此命令也可能返回名稱/用戶等中包含 Apache 的不相關進程,例如 Apache Tomcat,您可能不想殺死它們。)
kill <pid>
再次運行 ps aux 並確保進程不再運行。
再次檢查網站是否可訪問。不應該的。
現在啟動apache服務
service apache2 start
驗證是否正在提供新證書。
如果您不想殺死進程,可以重新啟動系統。也會有同樣的效果。