Apache-2.4

用於 DNS 轉換的帶有 SSL 的 Apache 反向代理

  • April 29, 2020

我目前正在遷移到新主機。在 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,這足以顯示日誌中正在交換的證書。

引用自:https://serverfault.com/questions/1014384