[Nginx] SSL 적용 (With Chain 인증서)

Gomil·2023년 1월 19일
1

Linux 삽질기

목록 보기
2/2

🔋 도메인 SSL 인증서 적용

이번에 회사 도메인의 SSL 인증서가 새로 발급되어 적용하려는데
다른 방식의 SSL을 구입하였는지 추가로 Chain 인증서가 함께 발급되었다.

Nginx에 적용하는 방법을 찾으며 수집한 정보를 기록하는 겸 기존에 SSL 적용법까지 정리해보려 한다.

📜 Nginx SSL 설정

기존에 이용하던 업체에서 인증서를 발급받을 경우, 보통 crt파일을 전달받게 된다.
우리는 이 파일을 pem 파일로 변환해야 한다.
(가비아는 nginx 전용 pem 파일을 전달해준거같기도 하고..)

🚥 Chain 인증서가 있을 경우

Chain 인증서?

Chain 인증서는 Root 인증서와 도메인 인증서 간 연결을 인증해주는 인증서라고 한다.

인증서를 전달받으면 아마 Root 인증서, Chain 인증서, Domain 인증서, Key 파일 총 4개를 전달받을 수 있다.

전달받은 파일들을 하나의 crt 인증서 파일로 합쳐야 한다.

# Linux
cat Domain인증서.crt Chain인증서.crt Root인증서.crt > bundle.crt

# Windows는 메모장으로 각 파일의 내용을 하나로 합치면 된다.

합치고 난 이후, 아래와 같이 인증서 구분(개행)이 제대로 적용되어 있는지 확인해야 한다.

# 잘못된 경우
-----END CERTIFICATE----------BEGIN CERTIFICATE-----

# 올바른 경우 
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----

🚥 CRT 파일을 PEM으로 변환

Root , Chain, Domain 인증서 병합본을 nginx에 적용할 경우 제대로 적용되지 않는 현상이 있다.

아래에서는 방법만 설명하고, 실제 conf에는 crt를 사용하여 적용한다.

우선 파일을 변환하기 위해서는 openssl을 이용한다.
(설치 방법은 따로 정리하겠다.)

전달받은 crt파일 (또는 변환한 crt파일)을 아래 명령어로 pem으로 변환할 수 있다.

# 전달받은 crt (혹은 변환한 crt) : bundle.crt
openssl x509 -inform PEM -in bundle.crt > bundle.pem

key 파일은 적용해본 결과 pem으로 변환하지 않아도 큰 문제는 없었지만,
혹시 모르니 일단 기록해본다.

openssl rsa -in bundle.key -text > bundle.key.pem

🚥 Nginx SSL 설정

이제 nginx설정만 바꾸면 끝난다.

SSL 설정은 각 도메인의 server 섹터에서 변경할 수 있다.

conf.d 분리를 해놓지 않았다면 nginx.conf에서, 분리를 해놓았다면 해당 파일에서 수정하면 된다.

기존 설정은 아래와 같이 server_name에 해당 도메인이 들어간 상태로 적용되어 있을 것이다.

server {
	listen 80;
    listen [::]:80;
    server_name sample.co.kr;
    
    location / {
    
    }
}

해당 설정 파일에 SSL을 적용시켜보자.

server {
	listen 443;
    listen [::]:443;
    server_name sample.co.kr;
    
    location / {
    
    }
    
    ssl on;
    # ssl_certificate [인증서 전체 경로]
    # ssl_certificate /var/cert/bundle.pem;
    ssl_certificate /var/cert/bundle.crt;
    
    # ssl_certificate_key [Key 파일 위치]
    ssl_certificate_key /var/cert/bundle.key.pem;
    
    
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    
}

# 일반 HTTP로 접속 시 HTTPS로 Redirect 설정
server {
	if ($host = sample.co.kr) {
    	return 301 https://$host$request_uri;
    }
    
	listen 80;
    listen [::]:80;
    server_name sample.co.kr;
    
    return 404;
}

ssl_certificate로 인증서 파일을 설정하고, ssl_certificate_key로 인증서 비밀키를 설정, 기타 설정을 마무리하면 SSL 적용이 완료된다.

📍 적용 테스트

테스트는 SSL 테스트 사이트 에서 본인의 도메인 주소를 입력하여 테스트할 수 있다.

테스트 시, 아래와 같이 Chain이 불안정하다는 메세지가 표시될 수 있다.

해당 메세지가 표시될 경우, 앞서 메모한 대로 pem 대신 변환을 거치지 않은 crt 파일 (Root + Chain + Domain crt)을 적용시킬 경우 해결됬다.

🔎 마무리

위 코드는 이전에 작업한 코드를 바탕으로 작성된 것이다.
분명 그때 ssl_ciphers는 다른 오류가 있어 적용한것인데.. 왜 적용했는지 기억이 안난다 ㅎ
ssl 상세 설정에 대한 설명은 나중에~

0개의 댓글