[django] webRTC, websocket, django-channel (3)

EMMA·2022년 5월 11일

TURN server에 SSL 적용하기

로컬 환경에서는 ws(일반 websocket)만 사용해도 문제가 없다.
하지만, 실제 배포할 때는 얘기가 약간 달라지는데 바로 SSL을 적용하는 경우가 대부분이기 때문이다.

Industry의 특성 상 보안을 요구하는 것도 있지만, 최근에는 SSL을 적용하지 않으면 위험 표시가 뜨는 등 웹 환경 자체가 이러한 사항들을 요구하는 측면도 있다.

SSL이 적용된 http를 https 로 부르는 것처럼,
SSL이 적용된 websocket은 보통 wss 로 부른다.


사전세팅

원래 SSL을 적용하려면, CA를 통해 certificate를 발급받는 것이 원칙이다.
하지만 현재 프로젝트에서는 그렇게 할 수 있는 환경이 아니므로, certbot을 사용해서 무료 SSL 인증서를 발급받고 turn 서버에 적용한다.

이를 위해선 아래 2가지 사항이 필요하다.

  • 도메인
    • freenom을 통해서 도메인을 생성, EC2 ip주소와 연결함)
    • .com 등의 주소가 좋긴 하나, 유료이고 현재 단계에선 유료를 사용할 필요는 없으므로 .tk 적용
  • nginx 설치
    • 대표적인 웹 서버, SSL 지원
    • reverse proxy로 사용 가능

도메인을 검색해서 무료인 것을 찾아, 적용하면 된다.

또 몰랐다, 헬게이트가 열릴 줄은 ...

certbot 를 사용하려면 우선 설치를 해야 한다.

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot

그런데 설치에서 또 에러 발생.
워낙 많은 에러가 발생해서, 순서대로 정리할 수는 없고 주요 에러를 나열했다.

1) gpg keyring error: gpg 파일이 오염된 것으로, 해당 파일 삭제
: 해당 질문 참고했다
: 추가 참고 페이지
: launchpad-getkeys는 설치하지 않음 (gpg key를 자동으로 import 해줌)

2) 더 적합한 certbot 설치 방법
: 계속 오류가 나서, 좀 더 찾아보니 ubuntu 20버전은 아래와 같이 설치하는 것이 권장된다는 것을 확인했다
: 해당 링크

sudo apt install certbot python3-certbot-nginx

참고로, ubuntu 버전은 아래와 같이 입력하면 된다.

#1번 방법 
cat /etc/*release

#2번 방법 
lsb -release -a

3) sudo apt update 시 계속 ppa list관련 에러 발생
: 해당 ppa list 삭제하면 된다
: 제거 명령어는 구글링

sudo rm -i /etc/apt/sources.list.d/PPA_Name.list

이제 인증서를 발급하자

certbot 문서에 따르면, 인증 제공 방식에 여러 옵션이 있다.
이 중 가장 많이 사용되는 방식은 --standalone 으로 판단되어 아래와 같이 작성!

  • 다른 plugin과 다르게 별도의 설정 필요 없이 독립적이고,
  • certbotLet's encrpyt 서버가 요청한 도메인 인증을 직접 처리한다
sudo certbot certonly --standalone --preferred-challenges http \
	#option: 자동 certificate 갱신 
    --deploy-hook "systemctl restart coturn" \
    #필수 작성 사항, 사전 셋팅에서 설정한 도메인명을 넣는다 
    -d <YOUR_DOMAIN>

인증을 받을 동안에는 80을 열어둬야 하므로, 모든 서버를 닫는다.

#서버 연결 중단하기 (중단하지 않으면 포트넘버 80에 nginx가 listening됨)
sudo service nginx stop
sudo service coturn stop

#stop인지 active인지 확인하기 
sudo service nginx status
sudo service coturn status

에러가 뜬다면 처음 turn서버 설치 시 turnserver.conf에서 domain name/realm 등의 정보가 내가 추가한 도메인명과 일치하는지 더블 체크.

인증서가 성공적으로 발급되었다

이제 turn 서버에 인증서를 등록하면 된다.

#/etc/nginx/sites-available/default로 이동 
sudo vi default 

#default 파일 수정 (80도 -> 443으로 redirect) 
server {
	listen 80;
	listen [::]:80;
	return 301 https://<DOMAIN>$request_uri;
}

server {
	listen 443;
	
	ssl on;
	ssl_certificate /etc/letsencrypt/live/<DOMAIN>/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/<DOMAIN>/privkey.pem;
}

마지막으로 turnserver.conf에 가서 아래 내용을 추가해준다.

# SSL certificates
cert=/etc/letsencrypt/live/<DOMAIN>/fullchain.pem
pkey=/etc/letsencrypt/live/<DOMAIN>/privkey.pem

# 443 for TURN over TLS, which can bypass firewalls
tls-listening-port=443

결과

SSL 적용 전, nginx start한 캡처 이미지다.


아래는 SSL 적용 후 결과 - 주의 요함 경고가 자물쇠로 바뀌었다 !

만약 에러가 계속 난다면, 역시 마찬가지로 아래 내용들을 다시 살펴보는 것이 좋다.

  • EC2 보안 설정
    • 여기서 coturn/nginx 연결 관련 오류가 80%는 해결된 듯
    • http(80), https(443) 을 포함해줘야 함
  • turnserver.conf 내용 (EC2 IP주소, 도메인명 등)

참고 자료
ws, wss (주소가 너무 길어 링크 처리함)
https://gabrieltanner.org/blog/turn-server
https://velog.io/@moonyoung/HTTPS-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0
https://hue9010.github.io/aws/nginx%EB%A5%BC-%EC%A0%81%EC%9A%A9%ED%95%B4-%EB%B3%B4%EC%9E%90/

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글