Come configurare HAProxy per più certificati SSL


8

Devo configurare HAProxy con due diversi certificati SSL

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

Ora ho imparato da un post su serverfault ( Configura più certificati SSL in Haproxy ) come utilizzare 2 certificati, tuttavia il server continua a utilizzare il primo certificato menzionato per entrambi i domini.

config:

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

Come dire a HAProxy quale certificato usare a seconda dell'URL?

Configurazione completa:

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

Puoi pubblicare la tua configurazione completa?
GregL,

sicuro. Ho aggiornato il quesiton.
merlin,

Nella configurazione snipped sopra, elenchi due crtdirettive sulla tua bindlinea, ma nella configurazione completa ne hai solo una ... È previsto? Quel certificato ha voci SAN o è un carattere jolly?
GregL

scusate il mio errore, ho preso la configurazione dopo aver rimosso la linea. Il mio obiettivo è consentire singoli certificati SSL per singoli domini e sono abbastanza nuovo su HAProxy. Aggiunto il secondo certificato nella configurazione sopra elencata.
merlin,

Quale client stai usando dove fornisce il certificato sbagliato?
GregL

Risposte:


9

Assicurati di eseguire HAProxy 1.6 o versioni successive

Questa domanda è un po 'vecchia, ma ho riscontrato questo stesso identico problema con configurazioni simili all'OP.

HAProxy 1.5 accetta la crtsintassi multipla su bindun'opzione; tuttavia, utilizza solo il primo certificato quando risponde.

HAProxy 1.6 sembra rispondere con il certificato in base alla richiesta del chiamante. Ciò non sembra richiedere sniACL speciali nella configurazione.

Ecco un esempio che funziona su 1.6, ma non riesce a utilizzare cert2.pemquando si risponde alle richieste per place2.com1.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

Come stai testando quale certificato haproxy sta presentando? Se stai utilizzando openssl s_client, -servername api.domain.comtieni presente che richiede un parametro aggiuntivo ( ) per inviare le informazioni SNI di cui haxyxy deve decidere quale certificato presentare.


Non sono sicuro di aver capito la tua risposta. L'esempio sopra menzionato usa la riga: use_backend bk_cert1 se {ssl_fc_sni my.example.com} tuttavia sto annullando un backend per entrambi e configuro apache per distinguere in base all'URL cosa fare. Sono possibili più certificati SSL con un back-end?
merlin,

1
Sì, non capisci la mia risposta. Sono dubbioso sulla tua metodologia di test, non sulla tua configurazione attuale.
Womble

Bene, per quanto ho capito, non ci sono molti test nella configurazione che ho presentato. L'unica cosa che verifica è se il dominio specificato ha attraversato https o meno e in caso contrario reindirizza a https. Ma questa non è la domanda. Mi chiedo come dedicare certificati specifici a un URL corrispondente.
merlin,

3
"tuttavia il server continua a utilizzare il primo certificato menzionato per entrambi i domini" - qual è la base di questa affermazione nella tua domanda, se non i tuoi test?
womble
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.