카테고리 없음

TIL 240822 - certbot 이용하여 ubuntu에서 인증서 발급 및 접근권한 해제

lemonpie611 2024. 8. 22. 22:54

사실 인증서를 발급받는 가장 간단한 방법은 AWS Certificat Manager에서 받는 것이지만, 이 방법은 인증서를 pem 파일을 받는 것이 아니라 aws 시스템에서 자체적으로 제공되는 것이다.

내가 배포하려는 미디어 서버에 https 프로토콜을 적용시키려면 pem 파일의 경로를 코드에 넣어줘야 하기 때문에, 다른 방법으로 인증서를 발급해야 했다.

 

1. 인증서 발급 방법

1) 자체 서명 인증서 발급

openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

 

위 명령어로 자체 서명된 인증서를 발급받을 수 있다. 테스트용으로 사용하는 용도이기 때문에 배포에는 부적합하다.

node-media-server 공식문서에도 적혀있던 방법인데 왜인지 모르겠지만 테스트용으로도 잘 안됐다..

 

2) Let's Encrypt에서 인증서 발급 - 윈도우 로컬에서 테스트용

  • https://www.win-acme.com/ 에서 win-acme를 다운받는다.
  • 압축 해제 후 wacs.exe 를 실행한다.
  • 발급 방법으로 M(직접 옵션을 선택하여 발급)을 선택하고, 도메인 입력방법은 2(직접 입력)을 선택한다.
  • 인증받을 도메인을 입력한다. 이부분은 잘 기억이 안나는데, 로컬이니까 localhost를 입력했을..것이다.. 확실치 않음
  • 인증 방법은 1(네트워크 경로에 저장)을 선택한다.
  • 웹루트 경로를 입력한다. 테스트용 파일들이 위치한 경로를 입력하면 된다.
  • CSR 유형은 2(비대칭 암호화)를 선택한다.
  • 저장경로를 입력하고 키파일 암호 입력방식은 2(콘솔에서 복붙)을 선택한다.

로컬에서 테스트하기에 적합.

배포환경에서 사용은 불가능..(애초에 윈도우에서 받았고, 복붙한다고 해도 도메인이 localhost로 되어있어서 사용 불가능)

 

2. ubuntu에서 certbot을 이용하여 인증서 발급

route 53에 도메인이 등록되어있다는 가정 하에

 

1) HTTP-01 방법 (결과적으로 실패한 방법)

 

certbot와 nginx 플러그인을 설치한다.

sudo apt update
sudo apt install python3-certbot-nginx

 

certbot을 사용하여 인증서를 발급한다.

sudo certbot certonly --webroot -w /var/www/html -d yourdomain.com

 

원래 여기서 발급이 정상으로 돼야하는데, 나는 불가능했다..

그래서 시도한 많은 방법들 (다 실패했으니 그냥 패스하고 DNS 부터 보세요)

  • 방화벽 설정 > 80번 포트 open
  • 80번 포트 중복 문제 > Nginx만 사용할것이므로 Apache 중지
sudo systemctl stop apache2

 

  • nginx 설정 : 인증서 발급 시 domain.com/.well-known/acme-challenge/test 경로로 접속을 진행 > /.well-known/acme-challenge 디렉토리가 /var/www/certbot에 위치할 경우 다음과 같이 지정
server {
    listen 80;
    server_name domain.com;

    root /var/www/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
}

 

  • 다음 명령어로 test 파일을 올바르게 서빙하는지 확인
echo "test" | sudo tee /var/www/certbot/.well-known/acme-challenge/test
curl -I http://domain.com/.well-known/acme-challenge/test

 

여기서 아래 코드 결과 404가 떴음

 

그냥 미디어 서버는 domain.com/api/server 만 200을 반환하는것 같다...

그래서 서버에서 상태 200을 받지 않고 인증서를 발급 받을수있는 다른 방법을 찾아야 함

 

그리고 서치중 발견한 DNS-01 방법

 

2) DNS-01 방법

sudo certbot -d live.flant.club --manual --preferred-challenges dns certonly

 

다음 명령어를 입력하면 아래와 같이 키값이 뜬다.

; <<>> DiG 9.18.28-0ubuntu0.22.04.1-Ubuntu <<>> TXT _acme-challenge.live.flant.club
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17476
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;_acme-challenge.live.flant.club. IN    TXT

;; ANSWER SECTION:
_acme-challenge.live.flant.club. 300 IN TXT     "lNP7Yn7y...(키값)....u4"
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

 

route 53에 도메인을 ' _acme-challenge.domain.com'으로 생성하고, TXT 레코드값에 키값을 집어넣은 뒤,  1분정도 기다리다가 터미널창에서 엔터를 치면 완료

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/domain.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/domain.com/privkey.pem
This certificate expires on 2024-11-20.
These files will be updated when the certificate renews.

NEXT STEPS:
- This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate's expiry date.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 

3. pem 파일 접근권한 설정

코드에서 pem 파일 경로수정을 완료했는데 배포환경에서 해당 경로로 접근을 못하는 문제

 

1) ubuntu 사용자에 대해 권한 추가(가장 기본적인 방법)

sudo chown nodeuser -R /etc/letsencrypt

 

근데 이상하게 아무리 권한을 풀어줘도 풀어지지가 않는 기괴한 문제가 발생함

+ nginx나 apache 같이 cert에 접근하는 다른 프로그램들이 깨질수도 있다고 한다.

 

2) 권한을 부여할 그룹을 생성하고, ubuntu 사용자를 해당 그룹에 집어넣어 권한 부여

# Create group with root and nodeuser as members
$ sudo addgroup nodecert
$ sudo adduser ubuntu nodecert
$ sudo adduser root nodecert

# Make the relevant letsencrypt folders owned by said group.
$ sudo chgrp -R nodecert /etc/letsencrypt/live
$ sudo chgrp -R nodecert /etc/letsencrypt/archive

# Allow group to open relevant folders
$ sudo chmod -R 750 /etc/letsencrypt/live
$ sudo chmod -R 750 /etc/letsencrypt/archive

 

사실 여기서 root는 그다지 필요 없음.. 쨌든 이 방법으로 접근권한을 주는것에 성공함

 

이제 진짜 라이브스트리밍은 손절이다....