HTTPS SNI 소개 와 Nginx 다 중 도 메 인 지원

4103 단어 nginx
소개
    초기 SSLv 2 는 전형 적 인 공개 키 인 프 라 PKI (Public Key Infrastructure) 디자인 에 따라 서버 한 대 (또는 IP 한 개) 가 하나의 서 비 스 를 제공 하기 때문에 SSL 악 수 를 할 때 서버 에서 클 라 이언 트 가 신청 한 인증서 가 무엇 인지 확신 할 수 있 었 다.
그러나 가상 호스트 가 크게 발전 하면 서 하나의 IP 가 여러 도 메 인 이름 에 대응 하 는 상황 이 생 겼 다 는 것 은 생각 지도 못 했다.해결 방법 은 일부 가 있 습 니 다. 예 를 들 어 범 도 메 인 인증 서 를 신청 하면 모든 *. yourdomain. com 의 도 메 인 이름 을 인증 할 수 있 습 니 다. 그러나 yordomain. net 의 도 메 인 이름 이 있다 면 안 됩 니 다.
HTTP 프로 토 콜 에서 요청 한 도 메 인 이름 은 호스트 헤더 (Host) 로 HTTP Header 에 놓 여 있 기 때문에 서버 에 서 는 요청 을 어느 도 메 인 으로 가 져 가 야 하 는 지 알 고 있 지만 초기 SSL 에 서 는 이 를 할 수 없 었 습 니 다. SSL 악 수 를 하 는 과정 에서 Host 의 정보 가 전혀 없 었 기 때문에 서버 에 서 는 설정 의 첫 번 째 사용 가능 한 인증 서 를 되 돌려 줍 니 다.따라서 일부 오래된 환경 에 서 는 여러 도 메 인 이름 이 각각 인증 서 를 맞 출 수 있 지만 돌아 오 는 것 은 똑 같 습 니 다.
문제 의 원인 은 SSL 악수 시 호스트 헤드 정보 가 부족 하기 때 문 이 라면 보충 하면 된다.
SNI (Server Name Indication) 는 RFC 4366 으로 SSL / TLS 를 개선 하 는 기술 로 SSLv 3 / TLSv 1 에서 사용 된다.이 는 클 라 이언 트 가 SSL 악수 요청 을 할 때 (구체 적 으로 말 하면 클 라 이언 트 가 SSL 요청 중의 Client Hello 단계) 요청 한 Host 정 보 를 제출 하여 서버 가 정확 한 도 메 인 으로 전환 하고 해당 하 는 인증 서 를 되 돌려 줄 수 있 도록 합 니 다.
SNI 를 사용 하려 면 클 라 이언 트 와 서버 측 이 조건 을 동시에 충족 시 켜 야 하 는데 다행히 현대 브 라 우 저 에 서 는 대부분 SSLv 3 / TLSv 1 을 지원 하기 때문에 SNI 가 가 져 온 편 의 를 누 릴 수 있다.
2. 인 스 턴 스 회사 도 메 인 이름 이 바 뀌 는 동시에 신 구 도 메 인 이름 도 동시에 실행 해 야 합 니 다.그렇다면 https 의 도 메 인 이름 에 대해 같은 IP 에 어떻게 여러 개의 가상 호스트 가 동시에 존재 합 니까?다음 nginx 매 뉴 얼 을 보 았 습 니 다. 다음 과 같은 내용 이 있 습 니 다. 같은 IP 에 여러 개의 HTTPS 호스트 를 설정 하면 보편적 인 문제 가 발생 할 수 있 습 니 다.
server {

    listen          443;
    server_name     www.example.com;
    ssl             on;
    ssl_certificate www.example.com.crt;
    ...

}

 
server {
    listen          443;
    server_name     www.example.org;
    ssl             on;

    ssl_certificate www.example.org.crt;
    ...
}

위의 설정 을 사용 하면 브 라 우 저가 어떤 호스트 를 요청 하 든 기본 호스트 www. example. com 의 인증서 만 받 을 수 있 습 니 다.SSL 프로 토 콜 자체 의 행동 으로 인 한 것 입 니 다. SSL 연결 을 만 들 고 HTTP 요청 을 보 내기 때문에 nginx 가 SSL 연결 을 만 들 때 요청 한 호스트 의 이름 을 모 르 기 때문에 기본 호스트 의 인증서 만 되 돌려 줍 니 다.가장 오래된 것 도 가장 안정 적 인 해결 방법 은 모든 HTTPS 호스트 가 서로 다른 IP 주 소 를 사용 하 는 것 이다.

server {
    listen          192.168.1.1:443;
    server_name     www.example.com;
    ssl             on;
    ssl_certificate www.example.com.crt;
    ...

}

server {

    listen          192.168.1.2:443;
    server_name     www.example.org;
    ssl             on;
    ssl_certificate www.example.org.crt;
    ...

}

그렇다면 같은 IP 에 여러 개의 HTTPS 호스트 를 어떻게 설정 합 니까?nginx 는 TLS 프로 토 콜 의 SNI 확장 을 지원 합 니 다.단, SNI 확장 은 클 라 이언 트 의 지원 이 있어 야 합 니 다. 또한 로 컬 OpenSSL 은 지원 해 야 합 니 다.
SSL 지원 을 사용 하면 nginx 는 자동 으로 OpenSSL 을 인식 하고 SNI 를 사용 합 니 다.SNI 지원 을 사용 할 지 여 부 는 컴 파일 할 때 ssl. h 에 의 해 결 정 됩 니 다 (SSL CTRL SET TLSEXT HOSTNAME). 컴 파일 할 때 사용 하 는 OpenSSL 라 이브 러 리 가 SNI 를 지원 하면 대상 시스템 의 OpenSSL 라 이브 러 리 가 지원 하면 SNI 를 정상적으로 사용 할 수 있 습 니 다.
nginx 의 TLS SNI support 가 disabled 라면
사용 방법 은 다음 과 같 습 니 다:
nginx 를 다시 컴 파일 하고 TLS 를 사용 해 야 합 니 다.절 차 는 다음 과 같다.
# wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz # tar zxvf openssl-1.0.1e.tar.gz # ./configure --prefix=/usr/local/nginx --with-http_ssl_module \ --with-openssl=./openssl-1.0.1e \
-- with - openssl - opt = "enable - tlsext" \ # make \ # make install 활성화 여 부 를 봅 니 다: \ # / usr / local / nginx / sbin / nginx - V TLS SNI support enabled 이렇게 하면 같은 IP 에 여러 개의 HTTPS 호스트 를 설정 할 수 있 습 니 다.실례 는 다음 과 같다.
server  {
	listen 443;
	server_name   www.yk.com;
	index index.html index.htm index.php;
	root  /data/wwwroot/www.ttlsa.com/webroot;
	ssl on;
	ssl_certificate "/usr/local/nginx/conf/ssl/www.ttlsa.com.public.cer";
	ssl_certificate_key "/usr/local/nginx/conf/ssl/www.ttlsa.com.private.key";  
	......

}

server  {
	listen 443;
	server_name   www.myweb.com;
	index index.html index.htm index.php;
	root  /data/wwwroot/www.heytool.com/webroot;
	ssl on;
	ssl_certificate "/usr/local/nginx/conf/ssl/www.heytool.com.public.cer";
	ssl_certificate_key "/usr/local/nginx/conf/ssl/www.heytool.com.private.key";  
	......
}

이렇게 모든 가상 호스트 에 접근 하 는 것 은 정상이다.

좋은 웹페이지 즐겨찾기