Haproxy

OpenSSL/HAProxy 使用非 CA 證書驗證客戶端證書

  • February 19, 2019

我在配置具有已編譯 OpenSSL 支持的 HAProxy 實例(v1.8.13)以僅接受已由非 CA 證書籤名的客戶端證書時遇到問題。特別是,我想在驗證客戶端證書時使用中間證書(非自簽名)證書作為信任錨。

這是我正在使用的配置:

frontend myfrontend
    bind *:${PORT} ssl crt /certs/haproxy-server-cert-bundle.pem ca-file /certs/intermediate_cert2.pem verify required

客戶端通過滿足以下證書鏈的證書進行連接:

client certificate -> intermediate cert1 -> intermediate cert2 (this should become the new trust anchor) -> root CA certificate

使用此配置時,通過客戶端證書連接到 HAProxy 會導致以下錯誤: Feb 13 09:17:26 my-forwarder haproxy[108]: <ip>:<port> [13/Feb/2019:09:17:26.619] my-forwarder/1: SSL client CA chain cannot be verified

如果我將根 CA 證書指定為信任錨( HAProxy 配置中的ca-file配置參數),則可以成功建立 TLS 握手。但是,我只想接受由證書分支中間證書 2 -> root CA certificate簽名的證書,而不是由其他一些中間證書 -> root CA certificate簽名的證書。

我嘗試使用普通的 OpenSSL 驗證和一些 OpenSSL s_server/s_client 設置來重現此行為。使用這些工具似乎存在同樣的問題。

一些證據:

$ openssl verify -CAfile test-certificate-chain.pem test-cert.pem test-cert.pem: C = ..., O = ..., OU = ..., ST = ..., CN = intermediate-cert2 error 2 at 2 depth lookup:unable to get issuer certificate

將根 CA 證書附加到 -CAfile 會導致: $ openssl verify -CAfile <(cat test-certificate-chain.pem root-ca.pem) test-cert.pem test-cert.pem: OK

為了解決這個問題,我能想到的僅有的兩個選項如下:

  • 創建一個自簽名 CA 證書,該證書對中間 cert2證書的公鑰進行簽名。然後必須將自簽名 CA 證書安裝在 HAProxy 配置的ca-file配置密鑰中。
  • 通過 HAProxy 配置密鑰ca-file /certs/intermediate_cert2.pem verify required ca-ignore-err 2將 HAProxy 配置為忽略 OpenSSL 錯誤編號 2(無法獲取頒發者證書)

使用上述任一選項時,我對安全級別還不滿意。因此,我很想知道這個問題是否有“更清潔”的解決方案。

有沒有其他人遇到過類似的問題?

謝謝!

更新:我以不同的方式解決了這個問題,因為我無法找到一種方法來信任中間(非 CA)證書,而無需通過 OpenSSL 驗證證書鏈來信任父(CA)證書。

另一種方法是利用 HAProxy 強大的 ACL 功能。尤其:

frontend my-frontend
   ...
   acl my_tls_ca_issuer_acl ssl_c_i_dn(cn) -m reg ^<some-regex-matching-the-client-cert's-issuer-cn>$
   tcp-request content reject unless my_tls_ca_issuer_acl

我正在將 HAProxy 配置為僅接受由與給定通用名稱正則表達式匹配的實體頒發的客戶端證書。這就是匹配器**ssl_c_i_dn(cn)**正在做的事情(有關詳細資訊,請參閱文件)。

通過實現這一點,不幸的是,我只能匹配客戶端證書(中間證書 1)的頒發者/父級的專有名稱(DN),而不是其祖父級(中間證書 2)。

我仍然希望這可以幫助某人..

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