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

mquat·2022년 5월 11일
0

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개의 댓글