9 votes

Comment configurer HAProxy pour plusieurs certificats SSL ?

Je dois configurer HAProxy avec deux certificats SSL différents.

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

J'ai appris par un post sur serverfault ( Configurer plusieurs certificats SSL dans Haproxy ) comment utiliser deux certificats, mais le serveur continue d'utiliser le premier certificat mentionné pour les deux domaines.

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

Comment indiquer à HAProxy quel certificat utiliser en fonction de l'URL ?

Configuration complète :

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

10voto

gras45 Points 11

Assurez-vous que vous utilisez HAProxy 1.6 ou une version plus récente.

Cette question est un peu ancienne, mais j'ai rencontré exactement le même problème avec des configurations similaires à celles de l'OP.

HAProxy 1.5 accepte les multiples crt sur un bind mais il n'utilise que le premier certificat pour répondre.

HAProxy 1.6 semble répondre avec le certificat en fonction de la demande de l'appelant. Cela ne semble pas nécessiter d'efforts particuliers de la part de HAProxy. sni ACL dans la configuration.

Voici un exemple qui fonctionne avec la version 1.6, mais qui n'utilise pas la fonction cert2.pem lorsqu'il s'agit de répondre à des demandes de place2.com sur 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.

2voto

Ryan Sampson Points 2898

Comment testez-vous le certificat présenté par haproxy ? Si vous utilisez openssl s_client mais il faut savoir qu'il nécessite un paramètre supplémentaire ( -servername api.domain.com ) afin d'envoyer les informations SNI dont haproxy a besoin pour décider du certificat à présenter.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X