티스토리 뷰

Nginx에서 SSL 인증서 만료가 되면 갱신을 해야한다.
만약 갱신을 제때 못하면 신한카드 SSL 인증서 만료로 인한 결제 장애 생기는 일이 생긴다.
이번에 갱신을 하면서 대표적인 인증 기관(CA : Certificate Authority), 각각의 인증서가 어떻게 이루어져 있는지, 갱신은 어떻게 하는지에 대해 알아보았다.


일단 인증 기관을 정리하면 아래와 같다.
1. Let's Encrypt: Let's Encrypt
- 무료로 SSL/TLS 인증서를 발급하는 비영리 기관이다. 많은 웹 호스팅 서비스 및 웹 서버에서 Let's Encrypt를 지원하고 있어, 사용자들이 쉽게 무료 SSL/TLS 인증서를 획득할 수 있다.

2. DigiCert: DigiCert
- 글로벌 인증 기관 중 하나로, 고급 보안 솔루션을 제공하며 SSL/TLS 인증서를 발급합니다. 기업 및 기관용으로 다양한 보안 서비스를 제공한다.

3. Comodo 
- Comodo는 SSL/TLS 인증서 제공 업체 중 하나로, 다양한 유형의 SSL/TLS 인증서를 제공한다. Sectigo로 재명명되었지만, 여전히 Comodo로 불리는 경우가 있다.

4. GlobalSign: GlobalSign
- 글로벌에서 활동하는 인증 기관으로, SSL/TLS 인증서 및 디지털 인증서 솔루션을 제공한다.

5. Symantec 
- Symantec은 SSL/TLS 인증서를 제공하는 글로벌 기업 중 하나였으며, 현재는 Norton 브랜드 아래에서 SSL/TLS 인증을 계속 제공하고 있습니다. 



인증서 종류

인증서는 서버 인증서, 중간(체인) 인증서, 루트 인증서로 나뉜다.
예를 들어 naver.com 기준으로 인증서를 보면 

openssl s_client -connect naver.com:443

네이버의 SSL 인증기관은 DigiCert 으로 나와있고
0번 서버 인증서 > 1번 중간(체인) 인증서 > 2번 루트 인증서로 나뉘는 걸 볼 수 있다.
0번 인증서를 보면 http://www.naver.net 도메인에 대한 서버 인증으로, DigiCert TLS RSA SHA256 2020 CA1 서명되어 있다.
1번 인증서는 서버 인증서를 발급한 중간 단계의 인증서로 DigiCert Global Root CA에 의해 서명되어 있고
2번 인증서는 루트 계층에 최상위 인증서로, 자기 자신을 발급한 형태로 구성되어 있다.

서버 인증서: 웹 서버에 설치되어 웹사이트의 신뢰성을 제공하고, 사용자와 서버 간의 암호화된 통신을 활성화한다.
중간 인증서: 루트 인증 기관과 서버 인증서 사이에서 연결 역할을 하며, 루트 인증 기관의 개인 키를 간접적으로 보호한다
루트 인증서: 모든 다른 인증서의 꼭대기에 위치하며, 브라우저 및 운영 체제에 미리 설치되어 있어 SSL/TLS 연결의 믿음성을 제공한다.

 

인증서 갱신하기(with.NGINX)

인증서를 신청해서 파일을 다운받으면 .zip 형태로 받는다. (주관적인 기준)
.zip 파일을 열면 서버의 각 인증서를 포함하는 파일(.crt , .pem)이랑 개인 키 파일이 들어있다.
여기서 확인해볼 것은 각 인증서를 포함하는 파일에서 서버 인증서 > 중간(체인) 인증서 > 루트 인증서가 순서대로 있는지 확인이 필요하다. 만약 순서가 바뀌면 인증이 되지 않기 때문이다.
인증에 대한 서명 정보를 확인할 수 있는 명령어는 아래와 같다. (서명에 대한 정보는 한 개씩 볼 수 있다.)

openssl x509 -text -in xxx.pem

 

Nginx 설정
Nginx SSL 인증서를 갱신할려면 설정 파일에(nginx.conf) 기존 인증서 파일을 새로운 인증서 파일로 변경해야 한다.

http {
   ....

   server {
       listen       443 ssl;
       server_name  xxx.com;

       // 새로운 인증서 파일로 변경
       ssl_certificate /usr/local/etc/nginx/ssl/star_xxx_com_cert.crt;
       ssl_certificate_key /usr/local/etc/nginx/ssl/key_nopass.pem;
        
       ....
   }
}

ssl_certificate, ssl_certificate_key에 새로운 인증서 파일로 변경한다. 만약 파일 경로가 기존과 동일하면 따로 수정할 부분은 없다.

ssl_certificate는 서버의 공개 키, 인증서 체인 및 중간 인증서를 포함하는 파일을 지정한다. 주로 .crt 또는 .pem 확장자를 가진 파일이며, 클라이언트가 서버에 접속할 때 클라이언트에 제공될 공개 키를 포함한다.

ssl_certificate_key는 ssl_certificate에서 지정된 인증서에 대한 개인 키를 지정한다. 이는 서버가 클라이언트로부터 받은 데이터를 해독하고, 서버가 클라이언트에게 데이터를 암호화하는 데 사용됩니다. 개인 키 파일은 일반적으로 .pem 확장자를 가진다.

Nginx 재시작
이제 SSL 인증서 설정을 바꿨으니 Nginx 재시작해야 한다.
기존에는 reload 할 줄 알았는데 관련 문서를 읽어보니 restart 해야한다고 한다.
그 이유는 reload를 하게 되면 새로운 요청부터는 새로운 인증서가 사용되지만 기존 연결은 이전의 인증서를 사용한다고 한다.
그래서 현재 실행 중인 프로세스를 종료하고 새로운 프로세스로 시작하게 해서 새로운 인증서로 요청할 수 있도록 해야한다.

sudo service nginx restart



Nginx 삽질
Nginx 재시작을 하면 실행 로그가 보여지는데 로그만 봤을 때 정상적으로 되는 줄 알았다.

정상적으로 실행되는지 확인하기 위해서 ps -ef | grep nginx 명령어를 사용해서 확인해봤지만 서버는 띄워지지 않았다. 일단 nginx 상태를 확인하는 명령어인 brew services list (mac brew 설치 기준) 실행했더니

nginx 상태가 error 상태였다. 그 이유를 파악하기 위해 nginx에서 에러 로그를 관리하는 파일을 보았다.
경로 : /usr/local/var/log/nginx/error.log

SSL 인증서 파일 교체할 때 에러 로그를 따로 추가해줬는데 그 로그 파일에 대한 권한이 없어서 에러가 발생하고 있었다.
그래서 권한을 준 다음 다시 시작했더니 정상적으로 Nginx 실행이 되었다!


+ Tomcat SSL 설정

SSLCertificateFile [PATH]/star_xxx_com_cert.pem # server cert
SSLCertificateChainFile [PATH]/Chain_RootCA_Bundle.crt # chain rootCA
SSLCertificateKeyFile [PATH]/key_nopass.pem # privaty key



+ Nginx SSL 설정 시 Bundle 파일 설정

ssl_certificate [PATH]/star_xxx_com_cert.pem; # server cert
ssl_trusted_certificate [PATH]/Chain_RootCA_Bundle.crt; # chain rootCA
ssl_certificate_key [PATH]/key_nopass.pem; # privaty key

침고
SSL 인증서 정보 확인하기
openssl 유용한 명령어