Cách định cấu hình HAProxy cho nhiều chứng chỉ SSL


8

Tôi cần định cấu hình HAProxy với hai Chứng chỉ SSL khác nhau

  1. www.example.com
  2. api.example.com

Bây giờ tôi đã học được từ một bài đăng trên serverfault (Định cấu hình nhiều chứng chỉ SSL trong Haproxy ) cách sử dụng 2 chứng chỉ, tuy nhiên máy chủ tiếp tục sử dụng chứng chỉ đầu tiên được đề cập cho cả hai miền.

Cấu hình:

frontend apache-https
    bind 192.168.56.150:443 ssl crt /certs/crt1.pem crt /certs/cert2.pem
    reqadd X-Forwarded-Proto:\ https
    default_backend apache-http

backend apache-http
    redirect scheme https if { hdr(Host) -i www.example.com } !{ ssl_fc }
    redirect scheme https if { hdr(Host) -i api.example.com } !{ ssl_fc }
    ...

Làm thế nào để nói với HAProxy nên sử dụng chứng chỉ nào tùy thuộc vào URL?

Cấu hình đầy đủ:

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
    ssl-default-bind-options no-sslv3
    tune.ssl.default-dh-param 2048 // better with 2048 but more processor intensive

defaults
        log     global
        mode    http
        option tcplog
        option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000

frontend apache-http
        bind 0.0.0.0:80
        mode http
        option http-server-close                # needed for forwardfor
        option forwardfor                       # forward IP Address of client
        reqadd X-Forwarded-Proto:\ http
        default_backend apache-http
        stats enable

frontend apache-https
        bind 0.0.0.0:443 ssl crt cer1.pem cert2.pem
        reqadd X-Forwarded-Proto:\ https
        default_backend apache-http

backend apache-http
        redirect scheme https if { hdr(Host) -i db.example.com } !{ ssl_fc }
        redirect scheme https if { hdr(Host) -i api2.example.com } !{ ssl_fc }
        balance roundrobin
        cookie SERVERID insert indirect nocache
        server www-1 10.0.0.101:80 cookie S1 check
        server www-2 10.0.0.102:80 cookie S2 check
        server www-3 10.0.0.103:80 cookie S3 check

Bạn có thể gửi cấu hình đầy đủ của bạn?
GregL

chắc chắn rồi. Tôi đã cập nhật quesiton.
merlin

Trong cấu hình snipped ở trên, bạn liệt kê hai lệnh crttrên binddòng của bạn , nhưng trong cấu hình đầy đủ, bạn chỉ có một ... Điều đó có ý định không? Chứng chỉ đó có mục SAN hay nó là ký tự đại diện?
GregL

Xin lỗi, tôi đã lấy cấu hình sau khi xóa dòng. Mục tiêu của tôi là cho phép các ssl certs riêng lẻ cho các miền riêng lẻ và tôi khá mới đối với HAProxy. Đã thêm chứng chỉ thứ hai trong cấu hình được liệt kê ở trên.
merlin

Khách hàng nào bạn đang sử dụng khi cung cấp chứng chỉ sai?
GregL

Câu trả lời:


9

Đảm bảo rằng bạn đang chạy HAProxy 1.6 trở lên

Câu hỏi này hơi cũ, nhưng tôi gặp vấn đề chính xác tương tự với các cấu hình tương tự như OP.

HAProxy 1.5 chấp nhận nhiều crtcú pháp trên một bindtùy chọn; tuy nhiên, nó chỉ sử dụng chứng chỉ đầu tiên khi trả lời.

HAProxy 1.6 xuất hiện để trả lời với chứng chỉ dựa trên yêu cầu của người gọi. Điều này dường như không yêu cầu bất kỳ sniACL đặc biệt nào trong cấu hình.

Đây là một ví dụ hoạt động trên 1.6, nhưng không sử dụng cert2.pemkhi trả lời các yêu cầu cho place2.comngày 1.5:

frontend http-in
        bind *:80
        bind *:443 ssl crt cert1.pem crt cert2.pem
        mode http

        acl common_dst hdr(Host) -m str place1.com place2.com

        use_backend be_common if common_dst

backend be_common
        # nothing special here.

2

Làm thế nào bạn đang kiểm tra chứng chỉ haproxy đang trình bày? Nếu bạn đang sử dụng openssl s_client, hãy lưu ý rằng nó yêu cầu một tham số bổ sung ( -servername api.domain.com) để gửi thông tin SNI mà haproxy cần để quyết định xuất trình chứng chỉ nào.


Tôi không chắc chắn nếu tôi hiểu câu trả lời của bạn. Ví dụ được đề cập ở trên sử dụng dòng: use_backend bk_cert1 if {ssl_fc_sni my.example.com} tuy nhiên tôi không mở một phụ trợ cho cả hai và định cấu hình apache để phân biệt dựa trên URL phải làm gì. Có thể có nhiều chứng nhận SSL với một phụ trợ không?
merlin

1
Vâng, bạn không hiểu câu trả lời của tôi. Tôi nghi ngờ về phương pháp thử nghiệm của bạn, không phải cấu hình hiện tại của bạn.
womble

Theo như tôi hiểu thì không có nhiều thử nghiệm trong cấu hình mà tôi đã trình bày. Điều duy nhất mà nó kiểm tra là liệu tên miền được chỉ định có thông qua https hay không và nếu không, nó sẽ chuyển hướng sang https. Nhưng đây không phải là câu hỏi. Tôi tự hỏi làm thế nào để dành chứng chỉ cụ thể cho một URL lõi.
merlin

3
"Tuy nhiên, máy chủ tiếp tục sử dụng chứng chỉ đầu tiên được đề cập cho cả hai miền" - cơ sở cho khẳng định này trong câu hỏi của bạn là gì, nếu không phải là thử nghiệm của riêng bạn?
womble
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.