본문 바로가기
aws

5탄. 아마존리눅스2023: SSL 인증서와 HTTPS 리디렉션 설정

by 요몽이 2024. 1. 14.
본 포스트는 www.mydomain.com 이  가상의 웹서비스를 구축한다고 가정하고 웹서버 접속 및 폴더 생성, 권한 부여, SSL 설정, 도메인 가상호스트 및 HTTPS 리디렉션 작업, 웹서버 재시작 및 검증, SSL 적용 확인에 대한 가이드입니다.

목차

    1. 웹서버 접속

    이전 포스트 참조

    2. 폴더생성

    웹서비스를 할 모든 코드가 들어갈 폴더 생성  

    • /var/www 이동 : cd /var/www
    • domain 폴서 생성 : mkdir domain

    ※ 폴더 이름은 다르게 정해도 무관함(설명의 편의를 위해 도메인명과 일치시킴.)

    3. 권한부여

    새로생성한 폴더에 권한을 부여한다.

    sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
    find /var/www -type f -exec sudo chmod 0664 {} \;
    • sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
      • sudo : 관리자 권한 획득
      • chmod 2775 
    2 : Setgid 비트 설정
    7 : user에게 읽기 쓰기 실행 권한 부여
    7 : group에게 읽기 쓰기 실행 권한 부여
    5 : other에게 읽기와 실행 권한 부여
     ※ Setgid 비트는 디렉토리에서 사용되며, 해당 디렉토리에 새로운 파일이 생성되면 파일을 생성한 소유자가  속한 그룹도 자동으로 파일의 소유자의 권한을 갖게 됨.(주로 여러명이 협업할 때 필요한 기능임.)
    ※ 각 숫자의 의미  
    0: 권한 없음  1: 실행 권한  2: 쓰기 권한  3: 쓰기와 실행 권한  4: 읽기 권한 5: 읽기와 실행 권한
    6: 읽기와 쓰기 권한 7:  읽기, 쓰기, 실행 권한
    • && find /var/www -type d -exec sudo chmod 2775 {} \;
    && : 앞의 명령어가 성공적으로 실행된 후에만 뒤의 명령어를 실행 
    find /var/www 에서 부터 찾는데,  type이 d(폴더)인 것을 모두 찾아서 
    -exec 이후 명령을 실행하는데, 
    sudo 관리자권한을 획득하고
    chmod 2775 권한을
    {} 앞서 find로 찾은 모든 디렉토리를 { } 여기 안에 대입하여 시행하고
    \; 종료한다. 
    • find /var/www -type f -exec sudo chmod 0664 {} \;
    find /var/www 에서 부터 찾는데, type이 f(파일)인 것을 모두 찾아서
    -exec 이후 명령을 실행하는데,
    sudo 관리자권한을 획득하고
    chmod 0664 권한을
    {} 앞서 find로 찾은 모든 디렉토리를 { } 여기 안에 대입하여 시행하고
    \; 종료한다. 

    4. SSL 설치

    • 사전지식
    Let's Encrypt는 무료 SSL 인증서를 제공하는 서비스로, 이 인증서는 90일마다 갱신해야 함. 
    CertbotLet's Encrypt은 무료 SSL 인증서를 사용하기 위해 설치하는 프로그램으로 파이썬 환경에서 동작함. 
    cronie-noanacronSSL 인증서를 자동으로 갱신하기 위한 프로그램
    • openssl, mod_ssl 설치 : 설치 도중에 질문하면 → y 
    sudo su
    dnf install openssl mod_ssl
    • Certbot 설치과정
    리눅스의 패키지 관리자인 DNF(Dandified Yum)를 사용하여 `python3`, `augeas-libs`, `pip` 패키지를 설치
    sudo dnf install -y python3 augeas-libs pip
    파이썬 가상환경 설정 : Python 3의 `venv` 모듈을 사용하여 `/opt/certbot/` 위치에 가상 환경을 생성
    sudo python3 -m venv /opt/certbot/​
    설치 내용 확인 
    ls /opt/certbot

    위 명령어로 다음 파일이 나오면 정상 : bin include lib lib64 pyvenv.cfg   

    ls /opt/certbot/bin

    위 명령어로 다음 파일이 나오면 정상 :

    Activate.ps1 activate.csh pip pip3.9 python3

    activate activate.fish pip3 python python3.9

    pip 업그레이드
    sudo /opt/certbot/bin/pip install --upgrade pip
    Certbot 설치
    sudo /opt/certbot/bin/pip install certbot

     

    Certbot 심볼릭 링크 설정
    sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot

     

    `/opt/certbot/bin/certbot` 파일에 대한 심볼릭 링크를 `/usr/bin/certbot`로 생성하라는 의미로 위 명령어로 어디서든 certbot 명령이 실행이 가능해진다.

     

    • Certbot 실행하여 SSL 인증서 발급
    아파치 서버 정지 
    sudo systemctl stop httpd​

     

    도메인(domain.com)에 SSL 인증서 발급
    sudo certbot certonly --standalone -d domain.com


    ※ 콘솔에서 요청이 있으면 아래와 같은 순서로 응답 분홍색 부분을 나의 환경에 맞게 바꿔서 입력한다.  

    • 이메일입력 : 나의 이메일 입력 ( SSL에 문제가 발생하면 등록한 메일로 우편이 온다. )
    • agree in order to register with the ACME server. Do you agree? : Y
    • We'd like to send you email about our work encrypting the web…. : N
    • you would like on your certificate (comma and/or space separated) (Enter 'c' to cancel): www.domain.com

     

    도메인(www.domain.com) SSL 인증서 발급 
    sudo certbot certonly --standalone -d www.domain.com

     

     

    domain.com 과 www.domain.com SSL 인증서 설정
    sudo vi /etc/httpd/conf.d/ssl.conf

    (아래 설정에서 도메인 주소 및 DocumentRoot 를 본인의 것으로 바꿔서 입력) 

    <VirtualHost *:443>
    DocumentRoot "/var/www/domain"
    ServerAlias domain.com

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/domain.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/domain.com/chain.pem
    </VirtualHost>
    <VirtualHost *:443>
    DocumentRoot "/var/www/domain"
    ServerAlias www.domain.com

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/www.domain.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www.domain.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/www.domain.com/chain.pem
    </VirtualHost>

     

    5. 도메인 가상호스트 및 HTTPS 리디렉션 작업 

    (아래 설정에서 도메인 주소 및 DocumentRoot 바꿔서 입력)

    • sudo vi /etc/httpd/conf.d/domain.com.conf 로 파일을 열어서 맨 하단에 아래 내용을 추가한다. 
    더 좋은 방법은 이후 포스트를 참조하세요( 가상호스트 별도 파일을 관리하는 방법입니다. )
    <VirtualHost *:80>
    ServerAdmin myemail@gmail.com
    ServerName domain.com
    ServerAlias www.domain.com
    DocumentRoot "/var/www/domain"
    ErrorLog domain.com
    CustomLog domain.com combined 

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    </VirtualHost>

    위 설정은 domain.com 해도 www.domain.com  가고,

    www.domain.com 해도 https://www.domain.com 으로 가도록 리다이렉션 작업을 한 것이다. 

    6. 웹서버 재시작 및 검증

    • sudo systemctl restart httpd 으로 웹서버를 재시작
    • sudo apachectl configtest 으로 입력한 명령어들의 문법 체크

    7. SSL 인증서 자동갱신

    크로니-노아나크론 설치( cronie-noanacron )
    sudo dnf install cronie-noanacron
    SSL인증서 자동갱신 설정
    sudo vi /etc/crontab
    아래 그림처럼 파일을 열면 제일 하단에 다음 코드를 붙여 넣는다.

    30 1 * * 2 root /usr/bin/certbot renew --post-hook “systemctl reload httpd”

    crontab 설정 화면

    ※ 이 명령어는 cron 작업 스케줄러를 사용하여 매주 화요일 새벽 1시 30분에 `certbot renew` 명령을 실행하여 SSL/TLS 인증서를 갱신하고, 갱신 후에는 `httpd` 서비스를 재시작하는 작업을 스케줄링하는 것

    이렇게 하면 Let's Encrypt은 무료 SSL 인증서의 유효기간인 90일 전에 주기적으로 위 명령어를 실행하여 인증서를 자동갱신하게 된다.  

    8. SSL 적용 확인

    웹서버를 재시작하고 Ctrl + Shift + Del로 "캐시된 이미지 및 파일"에 체크하고 "인터넷 사용 기록 삭제" 클릭하면 즉시 SSL이 적용되어 주소창 앞에 아래와 같은 아이콘을 확인할 수 있음.

    SSL이 적용된 상태

    웹서버 접속, 폴더 생성, 권한 부여, SSL 설정, 도메인 가상호스트, HTTPS 리디렉션, SSL 적용 확인 등의 단계를 따라 웹서버를 구성하였습니다. 이를 통해 웹사이트의 안전하고 원활한 운영이 가능해졌습니다. 
    다음 포스트에서는 워드프레스를 서버에 올리고 관리자 페이지(phpMyAdmin) 설정하는 것 까지 가보겠습니다.