用於 DNS 轉換的帶有 SSL 的 Apache 反向代理
我目前正在遷移到新主機。在 apache 中,大約有 20 個域都設置為基於名稱的 VHost。
我讀到了 Apache 的反向代理能力作為克服 DNS 停機時間的一個想法,因為並非所有域都在我的直接控制之下,而且我不確定它們的所有者將如何準時更新它們。
由於這是通過 Internet 代理敏感數據,因此我一直需要 SSL。
源伺服器上的虛擬主機:
ServerAdmin a@b.com ServerName abc.domain.com SSLEngine On SSLCertificateFile /path/to/cert SSLCertificateKeyFile /path/to/key SSLProxyEngine On ProxyRequests Off ProxyPreserveHost On UseCanonicalName On SSLProxyVerify require SSLProxyCheckPeerName On ProxyPass / https://1.2.3.4/ ProxyPassReverse / https://1.2.3.4/
目標伺服器上的虛擬主機:
ServerAdmin a@b.com ServerName abc.domain.com SSLEngine On SSLCertificateFile /path/to/cert SSLCertificateKeyFile /path/to/key
我的問題是驗證。如果我將 SSLProxyVerify 設置為關閉,一切都會按預期工作。
我已經在舊伺服器和新伺服器上複製了證書——我顯然必須這樣做——所以 /path/to/cert 和兩台伺服器上的密鑰會導致相同的數據。
瀏覽器顯示 500,在我看到的原始伺服器上的錯誤日誌中:
AH02039: Certificate Verification: Error (20): unable to get local issuer certificate
我已經閱讀了很多關於這個主題的內容,但我仍然對如何設置它感到困惑。
我相信我可能應該使用自簽名證書和 CA 作為 origin->target 分支,但是應該如何配置呢?證書上的通用名稱/主題替代項應該是什麼?
任何幫助表示讚賞!謝謝!
我能夠使用自簽名 CA 和證書自行完成這項工作。
代理伺服器必須具有指向生成的 CA 證書的 SSLProxyCACertificateFile。
遠端伺服器必須使用 SSLCertificateFile 的自簽名鏈以及 SSLCertificateKeyFile 中客戶端證書的密鑰文件。
由於我在客戶端證書上沒有有效的公用名/SAN,代理伺服器還必須禁用 SSLProxyCheckPeerName 和 SSLProxyCheckPeerCN,但保持 SSLProxyVerify 設置為要求。
此配置意味著最終使用者 -> 代理伺服器使用有效證書,而代理伺服器 -> 遠端伺服器使用您的自簽名證書。雖然我們不檢查常用名稱等,但代理伺服器將只接受驗證您的自簽名 CA 的響應。
有助於診斷的事情:
- 將遠端伺服器上的 VirtualHost 移動到它自己的埠,這樣我就可以直接訪問它並驗證它所服務的證書等。
- 增加代理伺服器上 VirtualHost 的 LogLevel,我使用了 LogLevel ssl:debug,這足以顯示日誌中正在交換的證書。