ZeroSSL Windows - 로컬 https 적용하기

jinvicky·2025년 1월 21일

개발 환경 셋팅

목록 보기
5/6

Intro


전 ssl이 어렵습니다 (진지하게정말로너짜증나). 수많은 블로그들이 잘만 해낸 것들을 보면서 나는 왜 안되지 오만가지 생각이 들지만, 그럼에도 쿠키 테스트 + 여러 이유로 ssl 적용이 꼭 필요합니다.

회사 컴으로 Windows 환경에서 nginx 설치하고 로컬에서 https 적용을 성공한 후기입니다.

어느 SSL이 더 쉬운가?

개인적으로 lets' encrypt보다 zerossl이 더 쉬웠습니다. 패스트코밋 상담원과도 진솔한(?!) 대화도 나눠보고 호스팅케이알에 진솔한(??) 문의 편지도 남기고.... 결제도 했다 취소해보고 온갖 ⛏삽질과 블로그 수소문을 하고 다녔죠.

zerossl은 9개월까지만 무료 지원한다고 단점이라고 적혀있지만 오래 운영할 것이라면 달에 10달러를 그냥 주자고 마음먹었습니다. (ssl에 1n일을 날렸거든요.)

플로우를 파악하는게 중요한 것 같습니다.

환경 소개

저는 호스팅케이알 사이트에서 jinvicky.shop이라는 도메인을 구입했고, DDNS와 포트포워딩 설정을 했습니다.
가장 최근에 http://www.jinvicky.shop으로 접근에 성공했습니다.

ZeroSSL

먼저 사이트에 들어가서 회원가입을 해주세요
개인적으로 이 블로그가 정리를 잘한 것 같습니다.
💗https://gruuuuu.github.io/network/openssl/💗

주의

CNAME 타입으로 도메인 레코드를 아래처럼 추가했습니다.

ZeroSSL에서 받은 Name은 도메인 레코드의 호스트 이름입니다.

🚨꼭 Name에서 내 도메인 이름은 제외해야 합니다.
맨 뒤에 붙은 .jinvicky.shop 을 제거한 값을 넣습니다.

값은 통째로 붙여넣기 해줍니다.

원래 www.jinvicky.shop으로 할려고 했는데
(https://devjh.tistory.com/357) 에서 ZeroSSL은 서브도메인 사용이 안된다는데? 이야기를 듣고 리스크 줄이고자 그냥 jinivcky.shop으로 해봤습니다.

호스팅케이알의 경우 적용이 빨랐습니다. 만약 인증에 실패했다면 값에 오류가 있을 확률이 높습니다.

인증서 내용 합치기

인증에 성공하면 웹서버를 고르고 인증서 zip을 다운받습니다. 저는 Nginx를 선택했습니다.

공식 문서(https://help.zerossl.com/hc/en-us/articles/360058295894-Installing-SSL-Certificate-on-NGINX)에서 nginx.conf에 적용하기 전에 인증서 파일 내용을 합쳐야 한다고 합니다.

메모장으로 켜서 ca_bundle.crt 내용을 복사해서 certificate.crt 맨 끝에 붙여넣으면 됩니다.

--END CERTIFICATE ---- 가 이전 파일 내용 끝이고 밑에가 붙여넣은 내용입니다. 그럼 이제 certificate.crt가 완성되었습니다.

🤔 이해가 안 가지만 mac mini에서 구글링한대로 cat 명령어를 사용했다가 그 GB가 소모되고 out of disk 에러가 난 경험이 있습니다;; (왜인지 아직도 이해 못했음. 맥미니 새거였다고;;)

Nginx 설정

Windows용 nginx를 사전에 설치합니다. nginx 명령어는 아래 블로그 정도로 충분합니다.
👉 https://it.gwangtori.com/19

가장 중요한 nginx.conf

여러 블로그를 참고해가면서 짜집기를 했습니다.
어느 블로그는 pki-validation이 가장 중요하다고도 하고 저기는 또 다르고 그랬지만 최대한 구성해봤습니다.

nginx.conf


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  jinvicky.shop;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location ~^/.well-known/pki-validation {
            allow all;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    server {
       listen       443 ssl;
       server_name  jinvicky.shop;

       ssl_certificate      C:/Users/jinvi/Downloads/jinvicky.shop/certificate.crt;
       ssl_certificate_key  C:/Users/jinvi/Downloads/jinvicky.shop/private.key;

       ssl_session_cache    shared:SSL:1m;
       ssl_session_timeout  5m;

       ssl_ciphers  HIGH:!aNULL:!MD5;
       ssl_prefer_server_ciphers  on;

       location / {
           root   html;
           index  index.html index.htm;

           try_files $uri $uri/ /index.html;
       }
    }

}

테스트

두근거리는 마음으로 테스트해보는데... http://localhost 접속밖에 안됩니다(욕) https://는 빗금 쳐진 채로 무시되고.... 그러다가 오전에 검색해봤던 Mac mini local https에 관해 검색했던 게 생각나서 Windows에서 테스트삼아 호스트 변경을 했습니다.

Windows Host 설정

보통 로컬에서 HTTPS 테스트 환경이 필요하신 분들이 많이 사용하는 방식입니다.

👉 https://likedev.tistory.com/entry/윈도우-PC에서-Hosts-파일-설정-방법

메모장을 관리자 실행해서 아래와 같이 로컬 포트와 도메인명을 등록해줍니다.

결과

윈도우 호스트 적용을 해야 https://가 성공적으로 적용됩니다. 당연히 핫스팟 킨 외부 접속에는 도메인을 못 찾는다고 뜨지만

🔥그렇다는건 127.0.0.1jinvicky.shop이 연결이 안되었듯이 도메인 레코드에 원인이 숨겨져 있을 가능성이 있다

라는 힌트 하나라도 얻었습니다. 기존의 DDNS를 의심해보러 갑니다.

참고

📃 https://velog.io/@pjj186/docker-compose-에서-nginx-zeroSSL-인증서-발급받고-적용하기

profile
개발, 그림, 기록

1개의 댓글

comment-user-thumbnail
2025년 1월 21일

127.0.0.1 www.jinvicky.shop으로 호스트를 변경했더니 www.jinvicky.shop으로도 로컬 https 접속할 수 있었다.
그러면 zerossl도 서브 도메인을 지원하는 것이 아닌가...? 생각한다.

답글 달기