View

항상 사설인증서를 만들어서 빨간 warning 보면서 개발, 테스트를 하다가 제대로된 인증서로 해보고싶어서 구성해보았다.

Certbot을 통해서 처음에 인증을 받으려면, 외부에서 도메인을 통해 내가 컨트롤 할 수 있는(파일을 생성해서 웹으로 제공할 수 있는) 웹 서버에 접속이 가능해야한다.

Certbot이 인증서를 발급해주는 플로우는 간단히 하자면 아래와 같다.

  1. 유저에게 도메인 abcd.com을 입력받는다.
  2. 사용자에게 http://abcd.com/abcd/efgh 라는 url에 가면 0123456789 라는 문자열이 나오는 웹페이지를 만들라고 한다.
  3. 검사해서 맞으면 abcd.com이라는 도메인에 대해서 인증을 완료한다.

손이 좀 가는 부분은 도메인 설정, 웹서버 설정 부분이다. 그래서 간단하게 개발, 테스트용으로만 발급받기 위해서 아래와 같은 구조로 구성했다.

간단하게 설명하자면 ipTIME에서 일정 시간 가지고 있는 외부ip를 내가 구매한 도메인에 등록을 하고 CertBot 외부 인증을 위해 잠깐 사용하도록 설정했다. 또한 웹서버는 docker를 사용해서 간단하게 인증서만 발급받고 삭제되도록 구성했다. iptime에서 잡고있는 외부 ip는 생각보다 꽤 오래 잡고있기때문에 인증서 발급받는 데 크게 무리는 없었다.

사전사항

docker 설치, certbot 설치, 도메인 구매

iptime 고정아이피 확인 및 DMZ 설정

iptime의 외부 고정 아이피는 게이트웨이 설정 화면 제일 첫번째 페이지에서 바로 볼 수 있다.

그리고 '고급 NAT 설정>DMZ'를 활성화해주고 내 컴퓨터 아이피를 설정해준다.

Godaddy DNS 설정

특별한 건 없는데 내가 구매한 도메인이 iptime의 외부 IP 주소를 반환할 수 있도록 설정해준다.

nginx 컨테이너 실행 및 인증 준비

nginx 컨테이너를 실행하는데 80번 포트를 포워딩해준다.

docker run -d --rm -p 80:80 -e NGINX_HOST=도메인 nginx

그리고 파일을 바로 쓸 수 있도록 bash로 접근해서 대기한다.

docker exec -it 컨테이너해쉬 /bin/bash

중간확인

여기까지 하면 외부 도메인에서 내 컴퓨터 도커 컨테이너의 nginx 웹페이지 까지 접속이 도메인으로 접속이 가능해야 한다. curl 등으로 테스트해보거나 외부망(휴대폰의 LTE 망 등)을 통해서 테스트해볼 수 있다.

curl -i http://내도메인

아래와 같이 나오면 정상이다.

HTTP/1.1 200 OK
Server: nginx/1.19.6
Date: Mon, 28 Dec 2020 13:24:41 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 15 Dec 2020 13:59:38 GMT
Connection: keep-alive
ETag: "5fd8c14a-264"
Accept-Ranges: bytes

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

만약에 나오지 않는다면 DNS가 정상적으로 쿼리가 되는지, DMZ가 정상적으로 설정이 되었는지, 내 컴퓨터의 방화벽이 외부에서 접속가능하도록 80번 포트가 열려있는지 등을 확인해보아야 한다. DNS의 경우 시간이 좀 걸릴 수 있다.(내 경우 10~15분 정도). 그리고 중간중간에 네트워크가 안될경우 iptime의 외부 아이피가 변경되진 않았는지 체크해볼 수 있다.

CertBot으로 인증받기

윈도우 커맨드 프롬프트를 관리자권한으로 실행시킨 후 아래와 같이 진행한다.

certbot certonly --manual
Saving debug log to C:\Certbot\log\letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): 구매한 도메인 입력
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for 구매한 도메인

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:

asdfasdfasdf.zxcvzxcvzxcv

And make it available on your web server at this URL:

http://내도메인/.well-known/acme-challenge/asdfasdfasdf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

여기 까지 진행했다면 certbot이 시키는데로 nginx에서 파일을 만들어주어야 한다. 마지막 섹션에 보면 도메인의 `/.well-known/acme-challenge/asdfasdfasdf`로 접근했을 때 'asdfasdfasdf.zxcvzxcvzxcv' 데이터를 보여달라고 한다.

nginx 컨테이너의 bash 접근 터미널로 돌아가서, 요구한 데이터가 담긴 파일을 생성한다. nginx의 컨텐츠 root 디렉토리는 `/usr/share/nginx/html`에 있으므로 해당 폴더에 .well-known/acme-challenge 폴더를 구성하고 그 밑에 asdfasdfasdf 파일을 생성, 'asdfasdfasdf.zxcvzxcvzxcv' 데이터를 적어주면 된다.

# mkdir -p /usr/share/nginx/html/.well-known/acme-challenge
# echo "asdfasdfasdf.zxcvzxcvzxcv" > /usr/share/nginx/html/.well-known/acme-challenge/asdfasdfasdf

파일이 잘 생성되고 다시 certbot 진행 터미널로 가서 진행을 하면 해당 도메인에 대한 인증 파일을 정해진 경로로 발급해준다.

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   C:\Certbot\live\내도메인\fullchain.pem
   Your key file has been saved at:
   C:\Certbot\live\내도메인\privkey.pem
   Your cert will expire on 2021-03-28. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

 

'Basic' 카테고리의 다른 글

editorconfig  (0) 2021.07.03
라즈베리파이 개념, 기초 설정  (0) 2017.06.17
시작하기에  (0) 2017.06.17
Share Link
reply