몇년 전에 Lets’ Encrypt SSL 와일드카드 인증서 발급/갱신과 관련된 글을 작성했는데요.

Lets’ Encrypt SSL 와일드카드 인증서 발급/갱신

설치/설정 과정이 번거롭기도 하고 스케줄러로 동작시킬 때 제대로 인증서를 갱신하지 못하는 문제도 있고해서 도커 컨테이너로 만들어봤습니다.

지인과 함께 테스트해보니 잘 동작되어서 도커 헙에도 배포하였습니다.

https://hub.docker.com/r/isul/letsencrypt-aws-lightsail

 

이 컨테이너를 사용하기 위해서는 DNS 서비스로 AWS Lightsail을 사용해야 됩니다.

컨테이너를 실행하면 모든 것이 자동으로 완료됩니다.

 

1. 준비사항

  • 인증서를 발급 받고자 하는 도메인
  • AWS(Amazon Web Services) 계정 – 결제 신용카드 등록까지 필요

 

2. 이용 서비스

  • Lets’ Encryt
  • AWS Lightsail – DNS 서비스(3개 도메인까지 무료, 월 3백만 쿼리까지 무료)

 

3. Amazon Lightsail 설정 및 네임서버 변경

DNS 서비스를 이용하기 위해서 Amazon Lightsail 사이트에 접속합니다. 먼저 아마존 웹서비스(AWS)에 가입되어 있어야 됩니다.

https://lightsail.aws.amazon.com/ls/webapp/home/networking

위 사이트에 접속하여 “DNS 영역 생성” 버튼을 눌러 도메인을 입력하고 진행합니다.

그리고, 기존에 사용하던 DNS 레코드를 그대로 모두 입력합니다. DNS 서비스를 이전하기 전에 미리 설정해두는 것이 좋습니다.

DNS 레코드를 모두 설정한 후 화면 제일 아래에 표시되는 “이름 서버”를 자신이 도메인을 등록한 업체의 웹사이트에 접속해서 네임서버의 정보에 모두 입력합니다.

네임서버 정보가 변경되기까지 서비스 업체별로 시간이 조금 다릅니다. DNS 레코드에 새로운 서브도메인을 하나 추가해두고 ping 테스트를 해보면 변경되었는지 쉽게 확인할 수 있습니다.

 

4. AWS 액세스키 발급 및 설정

인증서 발급 과정 중에 Lets’ Encrypt에서 자신의 도메인이 맞는지 확인하는 과정이 있습니다. 이를 위해 해당 도메인에 Lets’ Encrypt에서 알려주는 값으로 TXT 레코드를 등록해야 되는데요. 이 컨테이너에서는 이를 자동으로 처리합니다. 이를 위해서 컨테이너 내부에 설치된 awscli가 AWS Lightsail에 접근할 수 있도록 액세스 키를 생성해야 됩니다. 아래 URL에 접속하여

https://lightsail.aws.amazon.com/ls/webapp/account/advanced
고급 – IAM 콘솔로 이동 – 보안 자격 증명으로 계속 – 액세스 키(액세스 키 ID 및 보안 액세스 키) – 새 액세스 키 만들기를 해서 생성합니다. 이렇게 생성된 키는 다음 단계에서 사용됩니다.

 

5. 인증서 발급

아래 도커 명령으로 인증서를 발급받습니다. 아래 명령은 샘플로 각종 파라미터를 자신의 환경에 맞게 변경해야 됩니다.

/volume1/letsencrypt:인증서 파일이 저장될 경로입니다. 도커 host에 존재하는 경로입니다. 이 폴더 하위에 도메인명으로 폴더가 생성되고, 그 안에 인증서 파일이 생성됩니다.

domain: 자신의 도메인을 입력합니다.

email: 이메일 주소를 입력합니다. 인증서 만료가 다가오면 이 이메일로 알려줍니다.

attempts: 인증서 발급 과정 중 Lets’ Encrypt에서 알려주는 값으로 TXT 레코드를 설정하는데요. 이때 해당 값이 제대로 설정되었는지 검사하는 횟수를 설정합니다. 짧게 설정하면 발급에 실패할 수도 있습니다. 기본값은 3으로 생략할 경우 3번까지 검사합니다.

sleep_time: TXT 레코드 설정 후 그 값을 조회할 때 기다리는 시간을 설정합니다. DNS 캐시로 인하여 “ERROR: Challenge is invalid!” 에러가 발생할 경우 시간을 늘려줍니다. 기본 값은 30초입니다. 크게 설정할수록 안정적으로 동작됩니다.

aws_region: AWS Region으로 “us-east-1”로 설정해야 됩니다.

aws_access_key_id: 4번 과정에서 생성한 access key를 입력합니다.

aws_secret_access_key: 4번 과정에서 생성한 access key에 대한 secret key를 입력합니다.

* 도커 이미지 버전은 업데이트될 수도 있으니 아래 링크에 접속하여 최신 버전을 확인하기 바랍니다.

https://hub.docker.com/r/isul/letsencrypt-aws-lightsail

위 도커 명령을 실행하면 아래와 같이 인증서 발급이 시작되고

완료되면 아래와 같이 인증서 파일이 생성된 것을 볼 수 있습니다.

* 이 컨테이너는 –rm 옵션 사용으로 인증서 발급 완료 후 자동으로 삭제됩니다.

 

이제 생성된 인증서를 자신의 웹 서버에 적용하면 됩니다.

 

6. 샘플 스크립트

참고로 저는 아래처럼 스크립트로 만들어서 한 달에 한 번 호출되도록 스케줄러에 등록하여 사용 중입니다. 한 달 후에 자동 갱신까지 문제없이 완료되어야 최종 성공입니다. 성공 여부는 그때 업데이트하겠습니다.

시작, 종료 시에 텔레그램으로 알림 메시지를 보내고, 인증서 발급 후 프록시 프로그램인 haproxy를 재시작하여 인증서가 적용되게 처리하였습니다.

*2020-08-06: DNS 캐시로 인하여 “ERROR: Challenge is invalid!” 에러가 발생하는 경우가 있어서 sleep_time 파라미터를 추가하고, 도커 이미지 버전을 1.2로 업데이트하였습니다.