여러 SSL 인증서에 대해 HAProxy를 구성하는 방법


8

두 개의 다른 SSL 인증서로 HAProxy를 구성해야합니다

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

이제 serverfault ( Haproxy에서 여러 SSL 인증서 구성) 게시물에서 2 개의 인증서를 사용하는 방법을 배웠지 만 서버는 두 도메인 모두에서 언급 된 첫 번째 인증서를 계속 사용합니다.

구성 :

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

URL에 따라 사용할 인증서를 HAProxy에 알리는 방법은 무엇입니까?

전체 구성 :

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

전체 구성을 게시 할 수 있습니까?
— GregL

확실한. 쿼리를 업데이트했습니다.
— 멀린

위의 스니핑 구성에서 두 가지 crt지시문을 bind라인 에 나열 하지만 전체 구성에서 하나만 얻습니다 ... 의도입니까? 해당 인증서에 SAN 항목이 있습니까? 아니면 와일드 카드입니까?
— GregL

죄송합니다. 라인을 제거한 후 구성을 사용했습니다. 내 목표는 개별 도메인에 대한 개별 SSL 인증서를 허용하는 것이며 HAProxy에 익숙하지 않습니다. 위에 나열된 구성에 두 번째 인증서를 추가했습니다.
— 멀린

잘못된 인증서를 제공하는 곳에서 어떤 클라이언트를 사용하고 있습니까?
— GregL

답변:


9

HAProxy 1.6 이상을 실행 중인지 확인하십시오.

이 질문은 조금 오래되었지만 OP와 비슷한 구성 에서이 동일한 문제에 부딪 쳤습니다.

HAProxy 1.5는 옵션 에서 다중 crt구문을 허용합니다 bind. 그러나 응답 할 때 첫 번째 인증서 만 사용합니다.

HAProxy 1.6은 호출자의 요청에 따라 인증서로 응답하는 것으로 보입니다. 이것은 sni구성에 특별한 ACL 이 필요하지 않은 것으로 보입니다 .

다음은 1.6에서 작동하지만 1.5 cert2.pem에서 요청에 응답 할 때 사용되지 않는 예입니다 place2.com.

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

어떤 인증서 haproxy가 있는지 테스트하고 있습니까? 을 사용하는 경우 어떤 프록시가 어떤 인증서를 제공할지 결정해야하는 SNI 정보를 보내려면 openssl s_client추가 매개 변수 ( -servername api.domain.com)가 필요합니다.


귀하의 답변을 이해하는지 잘 모르겠습니다. 위에서 언급 한 예제는 use_backend bk_cert1 if {ssl_fc_sni my.example.com} 행을 사용하지만 둘 다에 대해 하나의 백엔드를 풀고 URL을 기반으로 수행 할 아파치를 구성합니다. 하나의 백엔드로 여러 SSL 인증서를 사용할 수 있습니까?
— 멀린

1
예, 당신은 내 대답을 이해하지 못합니다. 현재 구성이 아닌 테스트 방법이 의심됩니다.
— womble

내가 이해하는 한, 내가 제시 한 구성에는 많은 테스트가 없습니다. 테스트하는 유일한 것은 지정된 도메인이 https를 통과했는지 여부와 그렇지 않은 경우 https로 리디렉션되는 것입니다. 그러나 이것은 문제가 아닙니다. 특정 인증서를 핵심 URL에 전용으로 사용하는 방법이 궁금합니다.
— 멀린

3
"하지만 서버가 두 도메인에 대해 언급 한 첫 번째 인증서를 계속 사용합니다"– 테스트 자체가 아닌 경우 질문에서이 주장의 근거는 무엇입니까?
— womble
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.