브라우저의 '주의 요함' 경고는 무료 SSL 인증서인 Let's Encrypt를 적용하면 사라집니다. 앞선 5편에서 Portainer에 접속할 때, 7편에서 리버스 프록시를 붙였을 때 계속 보이던 그 경고의 정체가 바로 'SSL 인증서 없음'이었죠. 이 글에서는 Nginx Proxy Manager(NPM)에 내장된 Let's Encrypt 기능으로 https를 적용해 https://portainer.ddlabx-home.duckdns.org가 자물쇠로 열리게 만든 실제 과정을 정리합니다.
이 글은 7편(리버스 프록시)에서 이어집니다. NPM에 프록시 호스트가 등록돼 있고, 6-2편(포트포워딩)으로 80번이 열려 있어야 이번 편을 진행할 수 있습니다.
'주의 요함' 경고의 정체와 SSL이 하는 일
'주의 요함' 경고는 사이트가 위험하다는 뜻이 아니라 '통신이 암호화되지 않았다'는 표시입니다. http로 접속하면 주고받는 데이터(비밀번호 포함)가 암호화 없이 오가기 때문에, 브라우저가 사용자에게 주의를 주는 것이죠. 실제로 7편에서 Portainer 로그인 페이지가 http로 떴을 때 '실제 로그인은 하지 말라'고 미뤄둔 이유가 이것입니다. 비밀번호를 입력하는 서비스라면 반드시 암호화(https)를 먼저 적용해야 합니다.
SSL 인증서는 이 암호화를 가능하게 하고, 동시에 '이 주소가 진짜 내 서버가 맞다'는 신원 보증 역할을 합니다. 과거에는 인증서가 유료라 개인이 쓰기 부담스러웠지만, Let's Encrypt가 무료로 발급해주면서 누구나 https를 쓸 수 있게 됐습니다. 유일한 단점은 인증서 유효기간이 90일로 짧다는 것인데, NPM을 쓰면 만료 전에 자동으로 갱신해주기 때문에 한 번 설정하면 신경 쓸 일이 없습니다. 즉 우리가 할 일은 최초 발급 한 번뿐입니다.
NPM에서 Let's Encrypt 인증서 발급하기
인증서 발급은 리버스 프록시 설정 안에서 클릭 몇 번으로 끝납니다. NPM 관리 화면에서 7편에 만든 프록시 호스트(portainer.ddlabx-home.duckdns.org)의 점 세 개 메뉴 → Edit → 상단 'SSL' 탭으로 이동합니다. 여기서 'SSL Certificate' 드롭다운을 'Request a new Certificate'로 선택합니다.
함께 켜두면 좋은 옵션이 두 가지 있습니다. 'Force SSL'은 http로 들어온 접속을 자동으로 https로 돌려보내 항상 암호화된 연결을 쓰게 하고, 'HTTP/2 Support'는 속도를 개선해줍니다. 저는 두 옵션을 모두 켜고 Save를 눌렀습니다. 참고로 자료에 따라 이메일 입력칸과 약관 동의 체크박스가 나온다고 되어 있는데, 최신 NPM 버전에서는 이 항목이 표시되지 않고 계정 정보로 바로 처리되는 경우가 있습니다. 제 경우에도 이메일칸이 나타나지 않았지만 Save를 누르자 곧바로 '성공' 메시지가 떴습니다. 즉 이메일칸이 안 보여도 당황하지 말고 그대로 저장하면 됩니다.

여기서 발급이 성공하는 핵심 조건이 있습니다. 이 기본(HTTP) 방식에서 Let's Encrypt는 우리 도메인으로 직접 접속을 시도해 소유권을 확인하는데, 이때 6-2편에서 열어둔 80번 포트 포워딩이 반드시 살아 있어야 합니다. 저는 앞서 80번이 열린 것을 확인해둔 상태라 별도 오류 없이 한 번에 발급됐습니다. 만약 여기서 'Internal Error'가 뜬다면 대부분 80번 접근 문제이니, 포트포워딩과 방화벽을 점검하면 됩니다.
초록 자물쇠 확인과 한국 환경 우회법
발급이 끝난 뒤, 휴대폰 데이터(5G)로 이번엔 https://portainer.ddlabx-home.duckdns.org에 접속해봤습니다. 결과는 성공이었습니다. 주소창의 '주의 요함' 경고가 사라지고, Portainer 로그인 화면이 깔끔하게 열렸습니다. 7편에서 http로 접속했을 때와 비교하면, 같은 주소인데 이제 암호화된 https 연결로 바뀐 것입니다. 이렇게 자물쇠가 적용됐으니, 7편에서 미뤄둔 실제 로그인도 이제 안전하게 할 수 있습니다.

다만 모든 환경에서 이렇게 한 번에 되는 것은 아닙니다. 한국 가정용 인터넷 일부는 6편에서 다룬 CGNAT(통신사 이중 NAT)라 외부 접속 자체가 막히거나, 통신사가 80·443 인바운드를 차단해 HTTP 방식 인증이 실패합니다. 이때의 해결책이 'DNS 방식(DNS Challenge) 인증'입니다. 이 방식은 외부에서 우리 서버로 접속할 필요 없이, 도메인의 DNS 설정에 특정 값을 넣어 소유권을 증명하므로 포트가 막혀 있어도 인증서를 받을 수 있습니다. 가장 널리 쓰이는 조합은 도메인을 Cloudflare(무료)에 연결한 뒤, NPM의 SSL 화면에서 'Use a DNS Challenge'를 켜고 Cloudflare API 토큰을 넣는 방법입니다. 이 방식은 와일드카드 인증서(*.내도메인)까지 한 번에 받을 수 있어, 서비스가 늘어날수록 오히려 더 편합니다. 개인 도메인이 있고 CGNAT 환경이라면 처음부터 DNS 방식을 쓰는 것을 추천합니다.
이것으로 홈서버의 기초 인프라(외부 접속·주소 정리·암호화)가 모두 완성됐습니다. 주소를 만들고(DDNS) → 문을 열고(포트포워딩) → 길을 안내하고(리버스 프록시) → 자물쇠를 채우는(SSL) 흐름이 하나로 이어졌습니다. 이제 이 튼튼한 토대 위에 진짜 재미있는 앱들을 올릴 차례입니다. 다음 편부터는 설치하면 바로 효과가 느껴지는 실전 앱을 하나씩 다룹니다. → 9편. AdGuard Home으로 집 전체 광고 차단