Cara mengkonfigurasi HAProxy untuk beberapa Sertifikat SSL

8

Saya perlu mengkonfigurasi HAProxy dengan dua Sertifikat SSL yang berbeda

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

Sekarang saya belajar dari posting di serverfault ( Mengkonfigurasi beberapa sertifikat SSL di Haproxy ) cara menggunakan 2 sertifikat, namun server terus menggunakan sertifikat pertama yang disebutkan untuk kedua domain.

Konfigurasi:

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 }
    ...

Bagaimana cara memberitahu HAProxy sertifikat mana yang digunakan tergantung pada URL?

Konfigurasi penuh:

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
merlin
sumber
Bisakah Anda memposting konfigurasi lengkap Anda?
GregL
Tentu. Saya telah memperbarui pertanyaannya.
merlin
Dalam konfigurasi terpotong di atas, Anda mendaftar dua crtarahan pada bindbaris Anda , tetapi dalam konfigurasi penuh Anda hanya punya satu ... Apakah itu dimaksudkan? Apakah sertifikat itu memiliki entri SAN atau itu wildcard?
GregL
maaf kesalahan saya, saya mengambil konfigurasi setelah saya menghapus baris. Tujuan saya adalah mengizinkan sertifikat ssl individual untuk domain individual dan saya cukup baru di HAProxy. Menambahkan sertifikat kedua dalam konfigurasi yang tercantum di atas.
merlin
Klien apa yang Anda gunakan di tempat yang menyediakan sertifikat yang salah?
GregL

Jawaban:

9

Pastikan Anda menjalankan HAProxy 1.6 atau lebih tinggi

Pertanyaan ini agak lama, tapi saya mengalami masalah yang sama persis dengan konfigurasi yang mirip dengan OP.

HAProxy 1.5 menerima beberapa crtsintaks pada suatu bindopsi; namun, ia hanya menggunakan sertifikat pertama saat merespons.

HAProxy 1.6 muncul untuk merespons dengan sertifikat berdasarkan permintaan pemanggil. Tampaknya ini tidak memerlukan sniACL khusus dalam konfigurasi.

Berikut adalah contoh yang berfungsi pada 1.6, tetapi gagal digunakan cert2.pemketika menanggapi permintaan untuk place2.compada 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.
davidzarlengo
sumber
2

Bagaimana Anda menguji haproxy sertifikat yang disajikan? Jika Anda menggunakan openssl s_client, maklumi bahwa itu memerlukan parameter tambahan ( -servername api.domain.com) untuk mengirim informasi SNI yang haproxy perlu memutuskan sertifikat mana yang akan disajikan.

womble
sumber
Saya tidak yakin apakah saya mengerti jawaban Anda. Contoh yang disebutkan di atas menggunakan baris: use_backend bk_cert1 jika {ssl_fc_sni my.example.com} namun saya tidak memiliki satu backend untuk keduanya dan mengkonfigurasi apache untuk membedakan berdasarkan URL apa yang harus dilakukan. Apakah beberapa sertifikat SSL dimungkinkan dengan satu backend?
merlin
1
Ya, Anda tidak mengerti jawaban saya. Saya ragu dengan metodologi pengujian Anda, bukan konfigurasi Anda saat ini.
womble
Sejauh yang saya mengerti tidak ada banyak pengujian dalam konfigurasi yang saya sajikan. Satu-satunya hal yang diuji adalah jika domain yang ditentukan telah melewati https atau tidak dan jika tidak diarahkan ke https. Tapi ini bukan pertanyaannya. Saya bertanya-tanya bagaimana cara mendedikasikan sertifikat spesifik ke URL yang sesuai.
merlin
3
"namun server terus menggunakan sertifikat pertama yang disebutkan untuk kedua domain" - apa dasar pernyataan ini dalam pertanyaan Anda, jika bukan pengujian Anda sendiri?
womble