Education*
Devops
Architecture
F/B End
B.Chain
Basic
Others
CLOSE
Search For:
Search
BY TAGS
linux
HTTP
golang
flutter
java
fintech
개발환경
kubernetes
network
Docker
devops
database
tutorial
cli
분산시스템
www
블록체인
AWS
system admin
bigdata
보안
금융
msa
mysql
redis
Linux command
dns
javascript
CICD
VPC
FILESYSTEM
S3
NGINX
TCP/IP
ZOOKEEPER
NOSQL
IAC
CLOUD
TERRAFORM
logging
IT용어
Kafka
docker-compose
Dart
Let's encrypt로 SSL 인증서 관리하기
Recommanded
Free
YOUTUBE Lecture:
<% selectedImage[1] %>
yundream
2024-10-01
2024-10-01
262
![Let's encrypt](https://docs.google.com/drawings/d/e/2PACX-1vRXHboYWKsVpXZ4yXG-0j2CZ4PennGCOcz7eRX9t_rwJ8HqhVmtWb4sW1WSq23MU4__rivMjuWRmyLF/pub?w=974&h=481) # Let's encrypt Let's Encrypt는 무료로 SSL/TLS 인증서를 발급해 주는 **인증 기관(Certificate Authority, CA)** 이다. Let's Encrypt를 이용하면 복잡한 과정없이 무료로 빠르게 SSL 인증서를 설치해서 웹 서비스에 적용 할 수 있다. 예전에는 꽤나 복잡한 과정을 거쳐야 했지만 지금은 **certbot** 을 이용해서 nginx와 apache 웹 서버에 간단하게 인증서를 설치 할 수 있다. # SSL 인증서 설치 환경 * 도메인 준비: 테스트에 사용할 도메인을 준비해야 한다. 나는 개인적으로 가지고 있는 joinc.co.kr 도메인을 사용하기로 했다. 20년전에 구매한 이 도메인은 [whois.co.kr](https://whois.co.kr) 에서 관리하고 있다. * 운영체제: 우분투 리눅스 22.04 * 웹서버: NginX 웹 서버 # 도메인 설정 테스트를 위해서 **s-test.joinc.co.kr** 도메인을 설정했다. A 레코드에 가상서버의 IP를 등록하면 된다. ![도메인 설정](https://docs.google.com/drawings/d/e/2PACX-1vTUm22X5K3WJsJPteA4l4enas0FDdOBul-XZdH6b3ZGNOyhFSPxbsDbSy5V7TkCeUFBOg7FxezYieo_/pub?w=839&h=283) ``` dig s-test.joinc.co.kr ``` 혹은 ``` nslookup s-test.joinc.co.kr ``` # Nginx 웹 서버 설치 **apt**로 nginx 패키지를 설치한다. ```shell sudo apt-get update sudo apt-get install nginx ``` 패키지를 설치하면 nginx 서버가 실행된다. systemctl 로 서버 상태를 확인 할 수 있다. ```shell sudo systemctl status nginx ``` **curl**로 웹 서버에 접근 가능한지 테스트한다. ``` $ curl s-test.joinc.co.kr <html> <head><title>301 Moved Permanently</title></head> <body> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx/1.18.0 (Ubuntu)</center> </body> </html> ``` # certbot 설치 및 인증서 발급 Let's Encrypt 인증의 설치, 삭제, 업데이트를 위한 프로그램인 certbot을 설치한다. ```shell sudo apt install certbot python3-certbot-nginx ``` certbot을 이용해서 s-test.joinc.co.kr 도메인에 대한 인증서를 발급한다. ```shell sudo certbot --nginx -d s-test.joinc.co.kr ``` 아래와 같이 인증서가 발급된 걸 확인 할 수 있다. ``` Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/s-test.joinc.co.kr/fullchain.pem Key is saved at: /etc/letsencrypt/live/s-test.joinc.co.kr/privkey.pem This certificate expires on 2024-12-29. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for s-test.joinc.co.kr to /etc/nginx/sites-enabled/default Congratulations! You have successfully enabled HTTPS on https://s-test.joinc.co.kr We were unable to subscribe you the EFF mailing list because your e-mail address appears to be invalid. You can try again later by visiting https://act.eff.org. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ``` **/etc/letsencrypt/live/s-test.joinc.co.kr** 디렉토리에 fullchain.pem과 privkey.pem 파일이 생성된 걸 확인 할 수 있다. * fullchain.pem: **인증서 체인파일**로, SSL 인증서와 인증서를 발급한 인증기관에 대한 인증서가 포함된다. * privkey.pem: 서버의 비공개 **개인(private)** 키가 저장된 파일이다. SSL 통신에서 서버가 자신의 진짜 소유임을 증명하기 위해서 사용한다. 클라이언트는 서버의 공개키를 이용해서 암호화된 정보를 서버에 전송하면, 서버는 개인 키로 이를 복호화 할 수 있다. 이제 인증서 정보를 이용해서 NginX에 HTTPS(443) 설정을 해줘야 하는데, Certbot이 알아서 설정을 변경해준다. 변경된 내용을 살펴보자. 설정파일의 이름은 /etc/nginx/sites-availables/default 이다. 새로운 도메인을 설정하기 위한 server 블럭이 추가된 걸 확인 할 수 있다. 필요 없는 주석은 모두 제거했다. ``` server { root /var/www/html; server_name s-test.joinc.co.kr; # managed by Certbot location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/s-test.joinc.co.kr/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/s-test.joinc.co.kr/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = s-test.joinc.co.kr) { return 301 https://$host$request_uri; } # managed by Certbot listen 80 ; listen [::]:80 ; server_name s-test.joinc.co.kr; return 404; # managed by Certbot } ``` https 포트(443), 프로토콜(ssl) 인증서 ssl_certificate & ssl_certificate_key 설정을 확인할 수 있다. 또한 80번 포트로 연결할 경우 443으로 리다이렉트하는 server 블럭도 확인 할 수 있다. # HTTPS 테스트 curl를 이용해서 HTTPS 연결이 잘 되는지 확인 해보자. ``` $ curl -v https://s-test.joinc.co.kr * Host s-test.joinc.co.kr:443 was resolved. * IPv6: (none) * IPv4: 34.22.83.190 * Trying 34.22.83.190:443... * Connected to s-test.joinc.co.kr (34.22.83.190) port 443 * ALPN: curl offers h2,http/1.1 * TLSv1.3 (OUT), TLS handshake, Client hello (1): * CAfile: /etc/ssl/certs/ca-certificates.crt * CApath: /etc/ssl/certs * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / X25519 / id-ecPublicKey * ALPN: server accepted http/1.1 * Server certificate: * subject: CN=s-test.joinc.co.kr * start date: Sep 30 22:58:48 2024 GMT * expire date: Dec 29 22:58:47 2024 GMT * subjectAltName: host "s-test.joinc.co.kr" matched cert's "s-test.joinc.co.kr" * issuer: C=US; O=Let's Encrypt; CN=E6 * SSL certificate verify ok. * Certificate level 0: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA384 * Certificate level 1: Public key type EC/secp384r1 (384/192 Bits/secBits), signed using sha256WithRSAEncryption * Certificate level 2: Public key type RSA (4096/152 Bits/secBits), signed using sha256WithRSAEncryption * using HTTP/1.x > GET / HTTP/1.1 > Host: s-test.joinc.co.kr > User-Agent: curl/8.5.0 > Accept: */* > * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * old SSL session ID is stale, removing ``` # 인증서 관리 ### 인증서 정보 확인 인증서가 유효한지, 언제 만들어졌는지 확인 할 수 있다. ``` sudo certbot certificates ``` ### 인증서 갱신 Certbot이 현재 설치된 인증서를 확인하고, 만료일이 가까운 인증서를 자동으로 갱신한다. ``` sudo certbot renew ``` ### 인증서 갱신 테스트 인증서가 제대로 갱신되는지를 시뮬레이션 해볼 수 있다. ``` sudo certbot renew --dry-run ``` # certbot 작동 원리 심심하면 읽어보자. certbot가 도메인을 확인하고 인증서를 설치하는 과정을 정리했다. SSL 인증서는 "도메인"에 대한 인증서이다. 따라서 인증서를 요청하는 자가 도메인의 소유자라는 것을 확인하는 과정을 거쳐야 한다. Let's encrypt는 도메인 소유를 확인하기 위해서 **HTTP-01 챌린지** 와 **DNS-01** 챌린지를 사용한다. **HTTP-01 챌린지** 이 문서에서는 HTTP-01 챌린지 방식을 사용했다. 1. **챌린지 생성**: Let's Encrypt는 클라이언트(certbot)에게 특정 파일을 생성하고 이 파일을 웹 서버에 배포하라고 지시한다. 2. **검증 파일 생성**: 클라이언트는 지정된 위치에 파일을 생성한다. 예를 들어 http://s-test.joinc.co.kr/.well-known/acme-challenge/ 경로에 파일을 배치한다. 3. **검증 요청**: Let's Encrypt 서버는 해당 URL에 GET 요청을 보내서 파일의 내용을 확인한다. 4. **소유권 확인**: 파일의 내용이 예상값과 일치하면 도메인 소유권이 확인되고, 나머지 절차를 진행한다. **DNS-01 챌린지** - **DNS 레코드 생성**: Let's Encrypt는 클라이언트에게 특정 DNS TXT 레코드를 생성하도록 요청한다. - **레코드 추가**: 클라이언트는 자신의 DNS 관리 패널에 접속하여 지시된 TXT 레코드를 추가한다. - **검증 요청**: Let's Encrypt 서버는 도메인에 대한 DNS 조회를 수행하여 TXT 레코드가 올바르게 추가되었는지 확인한다. - **소유권 확인**: TXT 레코드가 일치하면 도메인 소유권이 확인된다.
Recent Posts
GPT를 이용한 Reranker 테스트
5분만에 만들어보는 Streamlit 챗봇
Let's encrypt로 SSL 인증서 관리하기
Upscayl을 이용한 이미지 업스케일링
스테이블 디퓨전 설치 및 사용해보기
Elasticsearch 설치
AI / LLM에 대한 친절한 소개
SLA 다운타임 계산기
Docker로 GitLab 설치하기
Ubuntu Linux에 NVIDIA 드라이버 설치
Archive Posts
Tags
devops
HTTP
SSL
Copyrights © -
Joinc
, All Rights Reserved.
Inherited From -
Yundream
Rebranded By -
Joonphil
Recent Posts
Archive Posts
Tags