Let's encrypt 자동갱신 (feat. '_cffi_backend' error)

oswaldeff·2022년 9월 18일
0
post-thumbnail

📗 intro

https환경을 유지시켜주기위해서는 3개월주기로 ssl인증서를 갱신해야한다.

마침 작업했던 프로젝트가 수동으로 갱신하도록 처리되어 있어서
cerbot으로 ssl인증서를 발급받는 4가지 경우 중 nginx의 웹서버단에서 직접 ssl인증을 받고 난후,
자동갱신 하는 방법을 적용해보았다.

AWS EC2에서의 인스턴스는 ubuntu 20.04을 사용하였다.

ubuntu에서 처음 python을 사용하기 위해 빌드하면 default버전은 3.8이었지만,
cairosvg를 사용하기 위해 프로젝트를 빌드업해야하는 환경은 python 3.9였기에 defualt버전을 3.9로 변경해주었다.
(/usr/bin/python3.9 업데이트 후 pip3와 pipenv까지 install)

$sudo apt install certbot python3-certbot-nginx

하지만 위 python3-certbot-nginx명령어를 사용한 경우에 당연하게도 자동갱신에서 차용하는 버전은 3.9였고,

certbort commands return ModuleNotFoundError: No module named '_cffi_backend'

라는 error를 리턴하였다.

📕 debugging

stackoverflow를 비롯한 각종 블로그를 서치한 결과, ubuntu의 apt에서 관리되는 python의 시스템 버전이 cerbot-nginx를 통해 발급받은 버전과 다르기 때문에 벌어진 error라는 것을 확인하였다.
(각종 이유에 따른 각 해결법을 적용해본 결과 모두 실패하였다)

python3.8, python3.9 build

결국 처음 설정부터 python에 대해 버전관리를 해주었는데,

  1. update-alternatives명령어로 버전에 대한 우선순위 및 현재사용 버전을 알 수 있도록 설정
$sudo update-alternatives --install /usr/bin/python python3 /usr/bin/python3.8 1
$sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 2

virtualenv path setting

프로젝트에 사용한 3.9버전을 업데이트한 이후에 가상환경 패키지가 설치된 path를 설정하였다.

  1. bashrc에 프로젝트의 virtualenv경로 환경변수를 할당
$vim ~/bashrc
$export PATH=/home/ubuntu/.local/lib/python3.9:$PATH
$source ~/.bashrc 

(source ~/.bashrc로 재부팅하지않고 변경사항을 바로 적용)

cerbot build

그 다음 자동갱신이 3.8을 default로 사용할 수 있도록

  1. update-alternatives --config python3 로 python3.8를 기본으로 설정,
$sudo update-alternatives --config python3

Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.8   1         auto mode
  1            /usr/bin/python3.8   1         manual mode
  2            /usr/bin/python3.9   2         manual mode

돌다리로 두들기고 넘어갈 겸 python3 -V 로 3.8이 default 버전인 것을 확인한 다음

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d domain.com

ssl인증서를 발급
(domain.com은 임의의 값)

sudo certbot renew --dry-run

마지막으로 dry-run을 통해 처음과 같은 error가 없이 정상적으로 재발급을 simulating

🔎 additional issues

기존 배포된 프로젝트에 대해 ssl자동갱신을 적용하면서 추가적인 이슈들을 경험하게 되었는데,

SSH key RSA conflict

Permission denied (publickey)

새로운 EC2에 탄력적IP를 연결하여 SSH접속을 한 경우, 기존 EC2의 address와 충돌을 하기 때문에

ssh-keygen -R IP_address

ssh-keygen -R은 호스트키를 remove하는 명령어로 기존의 탄력적IP를 삭제함으로서 초기화해주었다.
(IP_address은 임의의 값)

⏰ auto renew

sudo crontab -e 를 통해 root권한으로 명령어 실행할 수 있도록

no crontab for root - using an empty one
Select an editor.  To change later, run 'select-editor'.
1. /bin/nano        <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed

vim basic을 선택하여,

1 1 1 */1 * sudo certbot renew --nginx

매달 1일 01시 01분에 renew를 try하도록 해주었다.

분명 사용환경에 따른 다른 방법이 있을것이라 생각하지만,
pip install pipenv로 가상환경을 빌드업한 경우 &
python 버전이 상이할 경우 &
외부업체의 ssl인증서가 아닌 cerbot기반으로 ssl인증서를 발급 및 갱신하는 경우와 같이
위 경우들이 맞물린다면 python버전을 분리하여 작업하는 것이 에러를 배제할 수 있는 좋은 방법인 것 같다.

0개의 댓글