원래는 흔히 사용하는 iptime 공유기를 집에서 사용하고 있었다. 내 계획은 홈서버로 프로젝트를 배포하는 것이기에 공유기의 DDNS를 설정하고 해당 도메인의 SSL/TLS 인증 후 외부에서 https 로 접근이 가능하도록 하는거였다.
그러려고 했는데.. iptime에서 제공하는 DDNS로 SSL/TLS 인증이 불가능하다.
우선 왜 iptime 공유기로는 TLS 인증이 불가능한지부터 알아보자
우선 iptime을 사용했을 때 발급되는 도메인 주소를 burimi.iptime.org
라고 하겠다. 그렇다면 나는 burimi.iptime.org
주소의 TLS 인증서 발급을 CA에 요청을 해야한다.
이때 우리는 대부분 Let's Encrypt 같은 CA(Certificate Authority)에 인증서를 요청할 것이다.
그렇다면 CA는 무작정 인증서를 발급해주는게 아닌 나에게 burimi.iptime.org
라는 도메인의 소유권이 있는지 확인을 하여 나의 소유가 맞다고 판단이 되면 해당 도메인에 대한 인증서를 발급해줄 것이다.
도메인 소유권을 확인하는 방법
신청자가 도메인의 DNS 설정에 특정한 CNAME, TXT 레코드를 추가해야 합니다. 인증 기관은 이를 통해 도메인 소유권을 확인한다.
인증 기관이 지정한 파일을 도메인의 특정 경로에 업로드하는 방식이다. CA가 해당 파일에 접근할 수 있으면 소유권이 확인된다.
CA(Certificate Authority)가 지정한 도메인과 관련된 이메일 주소를 사용하여 인증하는 방식이다.
(네이버 이메일 같은걸로 인증하는게 아님)
그렇다면 주로 DNS 인증, HTTP 파일 인증 2가지를 많이 사용하는데 HTTP 인증이 더 간편하고, 많은 웹 서버 환경에서 쉽게 설정 가능하기 때문에 주로 사용된다.
DNS 인증의 경우 서버가 외부에 노출되지 않거나,와 일드카드 인증서(예: *.example.com
)를 발급받고자 할 때 사용되며 클라우드 기반 도메인 관리 서비스(예: AWS Route 53
)를 사용하는 경우 많이 사용된다.
위에 적은대로 HTTP 파일 인증이 간편하고 좋은데 여기서 들었던 의문점은 DDNS로 도메인을 설정하고 외부에서 해당 도메인의 특정 경로에 접근할 수 있도록 하면 CA가 해당 경로의 파일로 접근이 가능하게 되어 TLS 인증이 가능하지 않을까?
생각이 들었고, iptime으로 발급받은 DDNS로 HTTP 파일 인증 방식을 시도해보았다.
Let's Encrypt로 burimi.iptime.org
의 TLS 인증서 발급을 시도하니 아래와 같은 결과를 확인할 수 있었다.
DNS의 CAA 레코드 때문에 발급이 안된다는 것을 확인할 수 있다.
DNS에는 A, AAAA, CNAME 등 다양한 레코드가 있는데 이중에 CAA 레코드
도 있다.
CAA 레코드는 도메인의 소유자가 어떤 인증 기관(CA)이 그 도메인에 대해 TLS 인증서를 발급할 수 있는지를 지정하는 DNS 레코드이다.
dig 명령어를 이용하여 도메인의 다양한 레코드를 확인할 수 있는데 iptime.org의 CAA를 보면 아래와 같다.
iptime.org. 21600 IN CAA 0 issue ";"
- 아무 인증 기관도 인증서를 발급할 수 없음
iptime.org. 21600 IN CAA 0 issuewild ";"
- 와일드카드 인증서도 아무 인증 기관에서 발급할 수 없음
iptime.org
의 도메인을 이용해서 어떤 인증 기관도 인증서를 발급할 수 없음을 표시하였기에 CA에서 TLS 인증서 발급이 불가하기에 DDNS를 지원하는 다른 공유기를 알아봐야했다. (iptime 공유기 산지 얼마 안됐는데.. 😥)
그래서 ASUS 공유기를 새로 샀다. 왜 ASUS였냐면 대충 찾아봤을 때, DDNS로 SSL 인증이 가능하고 공유기 자체에서 SSL 처리가 가능하다해서 가장 싼 모델로 구입했다. (다른 모델은 10만원이 넘더라..)
평소 iptime만 쓰다가 ASUS 공유기를 사용해보니 커스터마이징 하기에 훨씬 좋았고, 지원하는 기능들도 더 많은듯 했다.
해당 화면은 브라우저에서 ASUS 공유기 설정하는 경우이다. DDNS 설정 후 외부망에서 원격 접속한 화면인데 혹시나 포트 번호는 가렸다.
하나 더 신기했던건 ASUS 공유기를 제어할 수 있는 앱도 있었다.
외부에서 공유기에 접근하면 아이디, 패스워드를 입력한 후 제어를 하는데 주소창을 보면 Not Secure
문구를 확인할 수 있다.
어라? https를 적용하지 않으면 내 라우터에 접근하는 계정, 패스워드가 유출이 되고 누구든 내 공유기로 접근할 수 있는건가? 생각이 들어 WireShark
를 이용해 패킷을 분석해봤다.
WireShark
를 이용하여 패킷의 데이터를 확인해보면 TLSv1.2을 사용하여 암호화되어 전송을 하고 있음을 확인할 수 있다.
TLS가 적용되어 있는데 왜 브라우저 주소창에 Not Secure가 보이는걸까? 궁금하여
openssl s_client -connect burimi.asuscomm.com:포트번호
명령어를 통해 인증서를 확인해보았다.
여기서 Verification error: self-signed certificate
문구를 확인할 수 있는데 TLS 인증을 CA에서 처리해주는게 아닌 공유기 자체에서 직접 인증서를 발급하여 암호화처리를 하고있음을 확인할 수 있다.
그래서 요약해보자면 ASUS의 공유기 설정 페이지는 제 3의 인증기관(CA)을 거치지 않고 직접 인증서를 만들어 암호화를 처리하기에 your connection to this site is not secure
와 함께 보안 처리가 안되는거 같지만 실제로는 데이터를 암호화하여 전송되고 있음을 알 수 있다.
난 위와 같이 공유기 설정 자체에서 HTTPS를 위한 SSL 인증 기능이 있어 쉽게 HTTPS 배포하기 위해 구매했었다.
근데 난.. 들어가보니 SSL 설정하는 옵션이 없었다.. 😢
해당 내용을 찾아보니 공유기의 정식 펌웨어에서 지원하는 기능이 아니었고, 정식 펌웨어를 지원하지 않는 다양한 기능 제어를 위해 멀린 펌웨어
라는 커스텀 펌웨어를 설치하여 진행해야 했다.
그래서 멀린 펌웨어
를 설치하려 했는데 내 공유기는 값싼 보급형 공유기라 커스텀 펌웨어 설치가 불가능하다고 한다.. (개인적인 의견으론 보급형 공유기는 TLS의 암호 인코딩/디코딩을 처리할 정도의 하드웨어가 뒷받침이 안돼서 그런거 같다)
어쩔 수 없이 TLS 인증을 공유기가 아닌 홈서버 PC의 NGINX에서 처리하도록 할 예정이다.
그러면 홈서버에 NGINX 설치하여 HTTPS 배포하는 과정은 다음 글에 작성해보려고 한다.