[인증서] Let's Encrypt 를 사용하여 인증서 연결 + nginx
이번 포스팅은 Let's Encrypt에서 인증서를 발급받아
특정 도메인으로 보안 접속을 활성화하는 것에 대한 포스팅
Let's Encrypt
Let's Encrypt는 비영리 인터넷 보안 연구 그룹 (ISRG)에서 가져온 무료, 자동 및 공개 인증 기관
이곳을 통해 무료로 인증서를 발급받아 사용할 예정
Let's Encrypt 클라이언트 다운로드
$ git clone https://github.com/letsencrypt/letsencrypt
> git clone을 사용하여 해당 클라이언트를 다운로드
해당 폴더로 접근 및 자동 설치 진행
# git clone 받은 폴더로 접속
$ cd letsencrypt
# 자동 설치 진행
$ ./letsencrypt-auto --help
> 설치가 완료되면 아래와 같은 화면을 볼 수 있다
인증서 발급 방식 : webroot 사용
> webroot / Standalone / DNS와 같은 여러 방식이 존재함
> 이번 포스팅에서는 webroot를 사용
> 실제 구동되고 있는 웹 서버에 특정 파일의 쓰기 작업이 가능한지를 통해 인증하는 방식
webroot로 사용할 폴더 생성
#webroot_path로 사용할 폴더 생성
$ mkdir -p /var/www/letsencrypt
> webroot-plugin은 {webroot-path}/.well-known/acme-challenge에 파일을 생성함
nginx의 conf 파일 변경
nginx를 이용해서 webroot 에 접근할 통로 오픈, 위 경로에 80 포트가 접근 가능하도록
# 현재 80으로 들어오면 키바나로 연결되도록 5601 포트로 proxy_pass를 설정함
server {
listen 80;
server_name [도메인];
set $proxy_pass_url http://127.0.0.1:5601;
location / {
proxy_pass $proxy_pass_url;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
## 인증서 발급을 위함 추가 설정
location ~ /\.well-known/acme-challenge/ {
allow all;
root /var/www/letsencrypt;
}
}
> 현재 80포트로 들어오면 proxy_pass로 키바나가 실행되는 포트로 전달되도록 설정
> webroot 인증을 위해 아래 3줄 추가
NGINX 재시작
$ systemctl restart nginx
인증서 발급 요청
letsencrypt 폴더로 접근 후 생성
# 인증서 발급 요청
$ ./letsencrypt-auto certonly -a webroot --agree-tos -m [메일] -w /var/www/letsencrypt -d [도메인] --rsa-key-size 4096
> -m : 메일주소
> -w : 위에서 생성한 webroot path (/var/www/letsencrypt)
> -d : 도메인 이름
> 인증서 발급에 성공한다면 위와 같은 화면 출력
발급된 인증서 확인
생성된 인증서 위치 : /etc/letsencrypt/live/[도메인명]
# 해당 인증서로 접근
cd /etc/letsencrypt/live/[도메인명]
총아래와 같이 4개의 인증서가 존재함
- cert.pem : 도메인 인증서
- chain.pem : Let's Encrypt chanin 인증서
- fullchain.pem : cert.pem + chain.pem
- privkey.pem : 인증서 개인키
인증서 적용하기
현재 nginx 설정 파일 (ssl 설정 X)
현재 아래 설정 파일은 80 포트로 접속할 경우 키바나로 연결되도록 설정
# 현재 80으로 들어오면 키바나로 연결되도록 5601 포트로 proxy_pass를 설정함
server {
listen 80;
server_name [도메인];
set $proxy_pass_url http://127.0.0.1:5601;
location / {
proxy_pass $proxy_pass_url;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
## 인증서 발급을 위함 추가 설정
location ~ /\.well-known/acme-challenge/ {
allow all;
root /var/www/letsencrypt;
}
}
새로운 nginx 설정 파일 (ssl 설정)
기존 모든 HTTP 요청을 ssl 인증서를 통해 연결하도록 HTTPS로 리다이렉팅 한다
두 가지 방법이 존재함
- 모든 http 요청을 잡아서 https로 리다이렉팅
- 특정 apps/sites만 리다이렉팅
여기서는 모든 HTTP 요청을 HTTPS로 가도록 리다이렉팅
# 모든 http(80포트) 요청을 https로 리다이렉팅
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
# 모든 https(443포트) 요청으로 들어오면 키바나로 연결되도록 5601 포트로 proxy_pass를 설정함
server {
listen 443 ssl;
server_name [도메인];
ssl_certificate [위에서 생성한, 지정 도메인에 대한 fullchain.pem 키의 경로]
ssl_certificate_key [위에서 생성한, 지정 도메인에 대한 privkey.pem 키의 경로]
set $proxy_pass_url https://127.0.0.1:5601;
location / {
proxy_pass $proxy_pass_url;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
## 인증서 발급을 위함 추가 설정
location ~ /\.well-known/acme-challenge/ {
allow all;
root /var/www/letsencrypt;
}
}
> 위와 같이 설정하여, 모든 http 요청을 https로 리다이렉팅 하고, 그 후에 키바나로 접속하도록 proxy_pass 설정 완료
> 또한 위에서 생성한 인증서를 nginx에 연결해준다.