본문 바로가기

Etc

윈도우 & 리눅스 HTTPS 인증서 발급 방법 (Let's Encrypt)

728x90

회사에서 프로젝트를 진행할 때, HTTPS 인증서를 발급받는 작업을 한적 있다. 

예전에 네이버 블로그에 포스팅 했었는데, 노션에 기록했던 거에 비해서 간단하게 적은 것 같다.

그래서 이번 기회에 다시 복습할 겸 정리하려 한다. 

 

우선 회사에서 필요한 https 인증서는 상업적인 인증기관에서 발급받을 필요도 없었고, 유효기간이 길 필요도 없었다. 

그래서 무료 인증서인 Let's Encrypt를 사용했다. 

 

https 사용한 적은 처음이라 폭풍 구글링부터 시작해서 많이 헤맸다.

그 과정을 적을거기 때문에 급한 사람들은 "정리 - 성공과정"을 읽으면 된다.

 

 

1. 리눅스 

우선 회사 서버에 미리 설치해야 했기 때문에 리눅스 환경에서 https 인증서를 발급받았다.

Cerbot라는 Let's Encrypt SSL/TLS 인증서를 발급하고 관리하는 도구를 사용했다. 

 

1) 실패과정

- 도메인 연결

 

우선 https 인증서를 발급받으려면 도메인 서버를 연결해야 한다.

가비에 기존에 사용하던 도메인이 있어서 연결해 줬다.

 

생각지도 못한 건 도메인 연결하는데 최대 42시간이 걸린다는 거다ㅠ

아무리 ping을 날려도 연결이 안돼서 검색해 봤더니..

그러니 미리 도메인을 연결해 두는 게 좋다. 

 

 

- Certbot로 인증서 발급받기 

 

certbot로 인증서를 발급받는 것에는 여러 방법이 있다. 

우선 테스트 작업으로 https를 설정하는 거라 standalone 방법을 사용했다. 

 

yum install certbot
sudo certbot certonly --standalone

 

certbot를 설치해 주고, 인증서 발급을 시작했다. 

 

이메일주소, 연결한 도메인을 작성하고 나면 "Successfully received certificate"라고 뜬다.

그럼 인증서 발급에 성공했다는 거다.

 

 

"certbot certificates" 명령어를 통해 확인해 보니 인증서가 제대로 있는 것을 볼 수 있었다.

 

 

 

- nginx 연결

 

https를 설정해야 하는 웹의 서버가 nginx였기 때문에 nginx 연결을 따로 해줘야 했다. 

nginx를 처음 설정했을 때부터 느꼈는데 진짜 nginx,, 고약하다

 

//http > https로 리다이렉션
server {
   listen 80;
   server_name   domain-girl.com www.domain-girl.com;
   return 301 https://$server_name$request_url;
}

server {
    listen       443;
    server_name  domain-girl.com www.domain-girl.com;

    //인증서 연결
    ssl                 on;
    ssl_certificate     /etc/letsencrypt/live/domain-girl.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain-girl.com/privkey.pem; # managed by Certbot

    ssl_protocols TLSvl TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:MEDIUM:!SSLv2:!PSK:!SRP:!ADH:!AECDH;
    ssl_prefer_server_ciphers on;
    
    ...

}

 

우선 기존 http 요청을 https로 리디렉션 하도록 설정해 주고, 발급받은 인증서들을 연결해 줬다.

 

Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.

 

인증서까지 무사히 발급받았겠다 성공한 줄 알았는데.. 역시나 에러가 발생했다. 

 

8월 22 09:49:13 localhost.localdomain nginx[3939439]: nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /etc/nginx/conf.d>

 

systemctl status nginx.service 로 에러를 확인해 봤다.

검색해 보니 NGINX 1.15.0 버전부터 ssl 지시문은 더 이상 사용되지 않기 때문에 발생한 에러란다.

ssl on 부분을 삭제해 줬다.

 

8월 22 09:49:13 localhost.localdomain nginx[3939439]: nginx: [emerg] invalid value "TLSvl" in /etc/nginx/conf.d/default.conf:16

 

 다시 실행했더니 다른 에러가 발생했다. 

TLSvl을 삭제해 줬다.

 

nginx: [emerg] unknown "request_url" variable

 

또 다른 에러가 발생했다ㅋㅋㅋㅋ

request_uri로 바꿔줬다. 

 

이렇게 까지 했는데 계속 제대로 실행이 안되더라..

이유가 뭐지 하고 폭풍 검색하고 머리를 싸매고 고민해 봤는데 바로바로 방화벽 문제였다

진짜 허무하다

 

https는 443 포트를 사용하기 때문에 해당 포트가 열려있어야 한다.

혹시 몰라서 telent으로 확인해 봤더니 통신이 안되더라..

이것 때문에 계속 제대로 설정이 안 됐던 거다ㅠ

 

443 포트를 열어줬더니 제대로 열렸다. 

 

 

 

- https에서 http api 호출

Mixed Content: The page at 'https://domain-girl.com/' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://...'. This request has been blocked; the content must be served over HTTPS.

 

무사히 끝났다고 생각했는데 api 호출하는데서 에러가 발생했다. 

https에서 http로 api를 호출하면 위와 같은 Mixed Contet 에러가 발생한다더라

 

그래서 api 호출 주소를 https로 변경하고 nginx proxy_pass로 실 api 주소로 이동되도록 수정했다. 

그리고 드디어 성공했다

 

그리고 나중에 검색해 보고 알았는데 --nginx 모드가 따로 있어서 nginx 설정을 자동으로 조절해 준다고 하더라..

우선 나는 nginx를 직접 설정했기 때문에 해당 옵션을 사용하진 않았다ㅠ

 

nginx default 파일이 변경된다고 한다. 

 

 

 

2) 정리 - 성공과정

- 도메인 연결 

 

우선 https 인증서를 발급받으려면 도메인 서버를 연결해야 한다.

필자는 가비아에서 도메인을 발급받아 연결했다. 

 

DNS 관리 > DNS 설정에서 레코드를 추가하면 ip를 연결할 수 있다. 

도메인을 연결하는데 최대 42시간이 걸리니 미리 연결하는 게 좋다.

 

ping 도메인주소

 

도메인 주소로 ping을 날렸을 때, 연결한 ip가 출력되면 제대로 된 것이다. 

 

*Ping : 두 네트워크 장치 간의 연결 상태를 확인할 때 사용한다. 

 

 

- 인증서 발급

 

certbot를 사용해서 인증서를 발급해 준다. 

certbot는 리눅스 환경에서 Let's Encrypt SSL/TLS 인증서를 발급하고 관리하는 데 사용하는 도구이다.

옵션에는 Standalone, Webroot, Manual, Nginx, Apache 5가지 방법이 있다. 

각자 서버 상태에 맞는 방법으로 인증서를 발급받아주면 된다.

 

만일 nginx를 연결할 거라면 나처럼 방황하지 말고 nginx 옵션을 선택하는 걸 추천한다!

자동으로 nginx default 설정을 해주기 때문이다.

 

sudo yum update

 

우선 certbot를 설치하기 전 업데이트를 해준다.

업데이트 안 하고 설치하려고 했다가 에러가 발생했기 때문에 업데이트하고 진행하는 걸 추천한다. 

 

yum install certbot

 

그 후 certbot를 설치해 준다. 

 

sudo certbot certonly --standalone //node
--nginx //nginx 사용할거면 붙이기 

이메일 주소
Y
Y
연결한 도메인 작성 

Successfully received certificate.라고 뜨면 성공

 

이제 인증서를 발급받아준다.

위에서 말했듯이 nginx 연결할 거면 --nginx 하면 된다. 

 

certbot certificate

 

이제 인증서가 제대로 발급되었는지 확인해 준다. 

 

/etc/letsencrypt/live 안에 fullchain.pem,

privkey.pem /etc/letsencrypt 안에 options-ssl-nginx.conf & ssl-dhparams.pem

파일이 존재하면 제대로 인증서가 발급된 거다. 

 

 

- nginx 연결

telnet 443

 

nginx 연결하기 전에 443 포트가 열려있는지 확인해 준다.

https는 443 포트를 기본 포트로 사용하기 때문에 Https를 사용하기 위해선 열어줘야 한다. 

 

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

//server 443에 추가  
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;  # 인증서 경로
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  # 인증서 키 경로
include /etc/letsencrypt/options-ssl-nginx.conf;  # Certbot이 생성한 SSL 설정 포함
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;  # 추가 보안 설정

 

그 후 nginx.default 파일에 들어가서 ssl 연결을 해준다.

사실 --nginx로 했다면 이미 다 설정되어 있을 것이다. 

 

 

erver {
    listen 443 ssl;
    server_name domain-girl.com;

    ...

    location /api/ {
        proxy_pass http://연결할 주소;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

 

만일 http api를 연결해야 한다면 proxy_pass 설정을 통해 연결해 준다. 

api 호출 주소에 /api가 있다면 "http://연결할 주소"로 연결될 것이다.

 

예를 들어 https://domain-girl.com/api/... 로 api 요청이 들어온다면 http://연결주소/로 프록시 처리된다.

 

 

2. 윈도우

이미 리눅스에서 한 번 해봐서 그런지 윈도우에서 진행하는거는 어렵지 않았다.

따로 실패 과정은 적지 않고 방법만 적으려 한다. 

 

리눅스와 마찬가지로 도메인 연결을 하고 시작해야 한다. 

 

윈도우에서 사용한것은 win-acme이다.

윈도우에서 Let's Encrypt 인증서를 발급하고 관리할 수 있도록 도와주는 도구이다. 

 

 

- win-acme 설치 & 인증서 발급 

 

https://www.win-acme.com/ 로 이동한 후, win-acme을 설치해 준다. 

폴더 압출 해제 후, wacs.exe를 실행해 준다. 

 

Create certificate : 기본 옵션으로 SSL 발급 (N)
Create certificate : 직접 옵션을 선택해 SSL 발급 (M)
Run renewals : 갱신 (R)
Manage renewals : 갱신 관리 (A)
More options : 더 많은 옵션 (O)
Quit : 종료 (Q)

 

그럼 이렇게 발급 방법을 선택하라는 옵션이 나올 것이다. 

여기서 M을 선택해 준다. 

 

Read site bindings from IIS : IIS에서 바인딩 (1)
*IIS = internet Information Sevices / 웹서버
Manual input : 직접 입력 (2)
CSR created by another program : 다른 프로그램에서 만든 CSR (3)
Abort : 중단 (C)

 

도메인 입력 방법을 선택하면 된다.

직접 입력할 것이기 때문에 2를 선택해준다. 

 

Host : 도메인주소 입력

 

이제 미리 연결한 도메인 주소를 입력해 준다. 

도메인 주소는 여러 개 작성할 수 있는데, 그럴 경우 쉼표로 구분해서 적어준다.

 

입력한 모든 도메인은 인증되어야 하기 때문에 막 입력하면 안 된다. 

 

Friendly name '[Manual] 도메인'. <Enter> to accept or type desired name:

 

도메인 별칭을 입력하면 된다. 안 할 거면 enter 누르고 넘어가면 된다. 

 

1: [http-01] Save verification files on (newwork) path : 네트워크 경로에 인증 파일 저장 (1)
2: [http-01] Serve verification files from memory : 메모리에 인증 파일 저장 (2)
3: [http-01] Upload verification files via FTP(s) : FTP를 통한 인증 파일 업로드 (3)
4: [http-01] Upload verification files via SSH-FTP : SSH-FTP를 통한 인증 파일 업로드 (4)
5: [http-01] Upload verification files via WebDav : WebDav를 통한 인증 파일 업로드 (5)
6: [dns-01] Create verification records manually (auto-renew not possible) : 수동으로 인증 레코드 생성(자동갱신 불가능) (6)
7: [dns-01] Create verification records with acme-dns : acme-dns를 통한 인증 레코드 생성 (7)
8: [dns-01] Create verification records with your own script : 본인 소유의 스트립트를 통해 인증 레코드 생성 (8)
9: [tls-alpn-01] Answer TLS verification request from win-acme : win-acme의 TLS 인증요청 응답 (9)
C: Abort

How would you lick prove ownership for the domain(s)?: 1

 

이제 인증 방법을 선택하면 된다.

각자 원하는 방식을 선택하면 된다.

 

3-5번은 제공해 주는 파일을 직접 업로드하는 방식이고, 6-8번은 DNS 레코드 설정을 해줘야 한다.

필자는 1번을 선택했다.

 

네트워크 경로에 인증 파일을 저장한다는 것은 해당 서버에 인증파일을 저장한다는 것과 같은 말이다. 

 

Path : 웹루트 경로 입력

 

이제 웹루트 경로를 입력해 준다.

도메인이 있다면, 도메인의 파일이 위치한 경로를 입력해 주면 된다. 

만일 바탕화면에 코드 파일이 있다면, 해당 경로를 입력해주면 된다.

 

 

Copy default web. config before validation? (y/n*) : n

 

그럼 웹 설정을 복사할 건지 묻는데 y or n 중에 선택하면 된다. 

 

 

1: Elliptic Curve key : 타원곡선 암호화
2: RSA key : 비대칭 암호화
c: Abort

What kind of private key should be used for the certificate? 2

 

이제 암호화를 선택해 준다. 

 

타원곡선 암호화가 비대칭 암호화보다 좀 더 높은 수준의 보안을 제공한다.

그러나 일부 오래된 시스템에서는 지원이 안될 수도 있다. 

 

비대칭 암호화는 가장 널리 사용되는 것으로 대부분의 시스템이 지원한다. 

필자는 높은 암호화가 필요하진 않았아서 2번을 선택했다. 

 

 

1. IIS Central Certificate Store (.pfx per host) : IIS용 인증서(.pfx)
2: PEM encoded files (Apache, nginx, etc.) : 아파치, nginx 계열 인증서 (.pem)
3. PFX archive : .pfx 파일
4. windows Certificate Store : 윈도우 인증서 저장소
5. No (additional) store steps : (추가적인) 인증서 미저장 

How would you lick to store the certificate?: 2

 

인증서 저장방식을 선택해 준다.

nginx를 사용할 거면 2번을 선택하면 된다.

 

File path : 인증서 저장 경로

 

이제 https 인증서 저장 경로를 입력해 준다.

 

1: None : 안함
2: Type/paste in consle : 콘솔에서 입력/붙여넣기 
3. Search in vault  : vault에서 검색 

Choose from the menu : 1

 

키 파일 암호 입력 방식을 선택해 준다.

비밀번호 설정이라고 생각하면 된다.

 

1. IIS Central Certificate Store (.pfx per host) : IIS용 인증서(.pfx)
2: PEM encoded files (Apache, nginx, etc.) : 아파치, nginx 계열 인증서 (.pem)
3. PFX archive : .pfx 파일
4. windows Certificate Store : 윈도우 인증서 저장소
5. No (additional) store steps : (추가적인) 인증서 미저장 

woduld you lick to store it in another way too? : 5

 

추가로 인증서를 저장하고 싶다면 위 옵션 중 하나를 선택하고, 그게 아니라면 5번을 선택해 준다.

 

1. create or update bindings in IIS : IIS에 직접 바인딩 혹은 생성
2. Start external script or program : 외부 스크립트 실행 
3. No (additional) installation steps : 추가 설치 과정 없음 

which installation step should run first? : 3

 

위 옵션까지 선택했으면 인증서가 발급될 것이다. 

아까 지정한 path에 .pem 파일이 제대로 생성되어 있는지 확인하면 된다. 

 

nginx 설정은 바로 위 리눅스에 있다!

 

 


 

이렇게 https 인증서 발급 과정이 끝났다..

nginx에서 고생을 많이 했던 것 같다ㅠ 

 

그래도 리눅스에서 한 번 설정하고 난 뒤에 윈도우를 진행하니까 훨씬 수월했다.

실 서버는 윈도우였는데 테스트 한 보람이 있었다

 

자동갱신 혹은 갱신하는 방법도 쓰려고 했는데 포스팅이 너무 길어져서 다음에 올려야겠다!! 

 

728x90