반응형

 

인증서 기간이 만료돼서 새로 발급받아 교체하는 작업을 진행했습니다.

처음 해보는 작업이기도 했고, 자주 있는 작업이 아니라는 말씀에 다음 번엔 헷갈리지 않기 위해 과정을 남겨둡니다.

특히 dec_key.pem을 만드는 부분에서 헤맸는데, 같은 실수 하실 분들께 도움이 됐으면 합니다.

 


상황 정리

 

서버에는 키와 인증서 관련 파일이 세 개 있었습니다. 

  • key.pem : 발급받은 개인키 (passphrase가 걸려 있는 암호화된 키)
  • cert.pem : 인증서
  • dec_key.pem : 암호를 푼 키. Nginx가 실제로 읽는 파일

여기서 헷갈리기 쉬운게 dec_key.pem입니다. 이건 제가 내용을 직접 채워 넣는 파일이 아니라,

key.pem의 암호를 풀어서 만들어내는 결과물입니다.

 

Nginx는 구동될 때 passphrase를 입력받을 수 없기 때문에, 미리 암호를 풀어둔 키 파일이 따로 필요합니다.

 

처음에 이걸 모르고 dec_key.pem을 직접 만들려다가 시간을 날렸습니다. 

 


제가 만났던 에러

 

새 인증서로 교체하고 "nginx -t"를 돌렸더니 아래와 같은 에러가 떴습니다.

 

nginx: [emerg] cannot load certificate key ".../dec_key.pem": PEM_read_bio_PrivateKey() failed
(SSL: error:1E08010C:DECODER routines::unsupported:No supported data to decode. Input type: PEM)
nginx: configuration file /etc/nginx/nginx.conf test failed

 

이후에는 ASN.1관련 에러도 같이 떴는데, 결국 원인은 하나였습니다.

dec_key.pem이 정상적인 키 파일이 아니었다는 것.

 

제가 임의로 만든 파일이라 안에 제대로 된 키 내용이 없었던 겁니다.

 


해결 과정

 

1. 새 키 파일이 정상인지부터 확인

 

먼저 새로 받은 key.pem이 정상인지 확인했습니다.

 

openssl rsa -in /home/OOO/webapps/ssl/key.pem -noout -text

 

이때 passphrase를 물어봅니다. 여기서 한 번 실수했는데, 비밀번호를 틀리게 넣었더니 이런 메시지가 나왔습니다.

 

bad decrypt

 

암호가 틀리면 키가 깨진 것처럼 보이지만 사실 파일 문제가 아니라 비밀번호를 잘못 입력한 것입니다.

정확한 passphrase를 넣으니 키 정보가 정상적으로 출력됐습니다.

 

2. dec_key.pem 생성

 

키가 정상인 걸 확인했으니, 암호를 풀어서 dec_key.pem을 만듭니다. 

 

openssl rsa -in /home/OOO/webapps/ssl/key.pem -out /home/OOO/webapps/ssl/dec_key.pem

 

passphrase를 입력하면 아래 메시지가 뜨면서 파일이 생성됩니다.

 

writing RSA key

 

-out 뒤에 지정한 파일이 자동으로 만들어집니다. 기존에 제가 임의로 만들어둔 꺠진 파일은 이 과정에서 덮어써집니다. 

혹시 기존 파일을 남겨두고 싶다면 미리 백업해두시기 바랍니다.

 

mv /home/OOO/webapps/ssl/dec_key.pem /home/OOO/webapps/ssl/dec_key.pem.bak

 

3. 키와 인증서가 짝이 맞는지 확인

 

갱신할 때 키와 인증서가 어긋나는 경우가 있어서, 두 파일이 같은 짝인지 확인했습니다. 

각각의 moduls해시값을 뽑아 비교합니다.

 

openssl rsa -in /home/OOO/webapps/ssl/dec_key.pem -noout -modulus | openssl md5
openssl x509 -in /home/OOO/webapps/ssl/cert.pem -noout -modulus | openssl md5

 

두 줄의 결과값이 똑같이 나오면 짝이 맞는 겁니다. 다르면 키와 인증서가 서로 다른 것이니 발급받은 파일을 다시 확인해야합니다.

 

4. 설정 테스트 후 적용

 

이제 nginx설정을 다시 점검합니다.

 

sudo nginx -t

 

nginx: configuration file /etc/nginx/nginx.conf test is successful

 

성공 메시지가 나오면 설정을 다시 읽어 적용합니다.

reload는 서비스 중단 없이 설정만 갱신해줍니다.

 

systemctl reload nginx

 

5. 적용 확인

 

마지막으로 새 인증서가 제대로 반영됐는지 만료일을 확인했습니다.

 

echo | openssl s_client -connect localhost:443 -servername 도메인주소 2>/dev/null | openssl x509 -noout -dates

 

notAfter 날짜가 새로 갱신한 만료일로 나오면 완료입니다.

브라우저에서 사이트에 접속해 자물쇠 아이콘을 눌러 인증서 만료일을 확인해도 됩니다.

 


정리하며

 

이번에 가장 크게 깨달은 건 dec_key.pem은 손으로 만드는 파일이 아니라 key.pem에서 뽑아내는 결과물이라는 점이었습니다. 

그리고 bad decrypt 에러는 키가 망가진 게 아니라 비밀번호를 틀린 경우가 많으니, 당황하지 말고 passphrase부터 다시 확인하면 됩니다. 

 

다음 갱신 때 또 헤매지 않으려고 남겨둡니다

 

728x90
반응형