2016-12-24 4 views
1

2 개의 VPS에 100 개의 비슷한 웹 사이트가 있습니다. ' 나는 dinamically 트래픽을 전환하는 데 haproxy를 사용하고 싶지만 같은 시간에 나는 SSL 인증서를 추가하고 싶습니다.여러 도메인에 대한 haproxy의 동적 SSL 구성

변수를 추가하여 각 웹 사이트의 특정 인증서를 호출하고 싶습니다. 예를 들어 : 나는 SSL을 실제 사용할 수 있으며 경우에 있는지 확인도하고 싶습니다

frontend web-https 
    bind 0.0.0.0:443 ssl crt /etc/ssl/certs/{{domain}}.pem 
    reqadd X-Forwarded-Proto:\ https 
    rspadd Strict-Transport-Security:\ max-age=31536000 
    default_backend website 

는 리디렉션와 HTTP에 사용할 수있는 스위치가 아닙니다.

HaProxy에서 가능합니까?

답변

4

이 작업은 수행 할 수 있지만 TLS (SSL)에서는 사용자가 의도 한대로 작업을 수행 할 수 없습니다.

먼저 HAProxy에서는 기본 인증서와 추가 인증서 디렉토리를 지정할 수 있습니다. 디렉토리 이름 대신 PEM 파일로 사용하는 경우 documentation for the crt keyword

에서

, 모든 파일 이름이 '.issuer'로 끝나는하지 않는 디렉토리를 알파벳 순서로로드됩니다 에서 발견, '.ocsp'또는 '.sctl'(예약 된 확장자). 여러 개의 파일 또는 디렉토리에서 인증서를로드하려면이 지시문을 으로 여러 번 지정할 수 있습니다. 인증서는 CN 또는 과목 중 하나와 일치하는 유효한 TLS 서버 이름 표시 필드를 제공하는 클라이언트에게 제공됩니다. 와일드 카드가 지원됩니다. 여기서 첫 번째 호스트 이름 구성 요소 대신에 와일드 카드 문자 '*'가 사용됩니다 (예 : * .example.org는 www.example.org와 일치하지만 www.subexample.org는 일치하지 않습니다).

더 SNI는 클라이언트 또는 제공되지 않은 경우 SSL 라이브러리는 TLS 확장을 지원하지 않거나 클라이언트가되지 일치하는 인증서를 않는 SNI의 호스트 이름을 제공하는 경우, 다음 첫 번째로드 된 인증서가 수여됩니다. 디렉토리에서 인증서를로드 할 때 기본값이 먼저 파일로로드되거나 이 항상 디렉토리의 첫 번째 파일이되도록하려면 높이가 인 것이 좋습니다. 당신은 또한 no-sslv3를 추가해야

bind 0.0.0.0:443 ssl crt /etc/haproxy/my-default.pem crt /etc/haproxy/my-cert-directory 

참고 :

그래서, 당신이 필요로하는 모든는 PEM 파일의 각 CERT/체인/키를 포함하는 디렉토리와 같은 구성에 대한 수정이다.

나는이 문서에서 언급 한 바와 같이 브라우저가 서버 이름 확인 (SNI)를 보내는 경우, 각 웹 사이트

에 대한 테 특정 인증서를 호출하는 변수를 추가 사용할

, 다음 HAProxy 것이다 자동으로 적절한 인증서를 사용하여 브라우저와 협상하십시오.

구성 가능한 인증서 선택이 필요하지 않지만 더 중요한 것은 불가능합니다. SSL/TLS는 (그 어디서나) 그런 식으로 작동하지 않습니다.브라우저가 보안 채널을 성공적으로 협상 할 때까지는 브라우저가 요청할 웹 사이트가 무엇인지 알지 못합니다. 브라우저가 아직 요청을 보내지 않았기 때문입니다.

브라우저에서 SNI (더 이상 관련성이 거의없는 우려 사항)를 나타내지 않거나 SNI에 표시된 호스트 이름과 일치하는 파일에 인증서가없는 경우 기본 인증서가 사용됩니다 브라우저와의 협상을 위해. 나는 또한 좋아하는 SSL이 실제 사용할 수 있으며 경우에 있는지 확인 것

는 리디렉션

이것은 또한 수 없습니다와 HTTP에 사용할 수있는 스위치가 아닙니다. 암호화는 먼저 협상되고, 그 다음에 만 브라우저가 보낸 HTTP 요청임을 기억하십시오.

기본 인증서의 호스트 이름이 브라우저가 인증서에 표시 할 것으로 기대하는 호스트 이름과 일치하지 않으므로 사용자가 브라우저의 보안 경고를 무시하지 않는 한 리디렉션을 볼 수 없습니다.

브라우저 보안 경고를 우회하여 동시에 신뢰할 수없고 아직 암호화 된 연결을 설정 했으므로이 시점에서 다시 강제로 http에 들어가는 것이 중요하지 않습니다. 연결은 기술적으로 안전하지만 브라우저가 호스트 이름 불일치로 인해 인증서가 유효하지 않다고 올바르게 판단하기 때문에 주소 표시 줄에 빨간색 ×가 표시됩니다. 그러나 경고를 우회하는 사용자의 주장에 따라 브라우저는 여전히 유효하지 않은 인증서를 사용하여 보안 채널을 설정합니다.

이 모든 작업을 수행 한 후에도 리디렉션하려는 경우 layer 5 fetches을 살펴 봐야합니다. Host 헤더가 SNI 또는 기본 인증서와 일치하는지 확인해야하며 인증서가 와일드 카드 인 경우이를 수용해야하지만 이후에만이 메시지가 나타납니다. 사용자가 보안 경고를 우회합니다.

사물이 너무 단순해서 유효한 인증서가없는 웹 서버가 서버의 인증서가 유효해야 브라우저를 리디렉션하거나 (경고를 우회하기 위해 사용자가 의도적으로 조치해야 함) 트래픽을 가로 챌 수 있다고 상상해보십시오. 원래 아이디어가 효과가 없을뿐만 아니라 실제로 작동하지 않아야하는 이유를 분명히합니다.

구성된 디렉터리에서로드 된 인증서는 모두 시작할 때로드된다는 점에 유의하십시오. 새로운 것을 발견하거나 오래된 것들을 버리기 위해 HAProxy가 필요하다면, HAProxy (보통 sudo service haproxy reload)를 다시 시작해야합니다.