리눅스/실습

웹서버에 TLS 적용하기

dbswjdahr 2025. 11. 8. 22:54

워드프레스가 제대로 붙었으니 이제 http를 https로 만들어 볼 생각이다.
간단하게 테스트 환경에서 적용할 수 있는 openssl이랑 실제 인증서를 받아서 적용 가능한 let's encrypt가 있는데,
let's encrypt를 써서 적용해보도록 할 생각이다. 이미 이전에 도메인을 구입한 적이 있어서 이걸 씀.
없으면 openssl로 tls 적용을 할 순 있지만 인증이 안 됨

통신사의 이중 NAT 설정 때문에 공유기에서는 포워딩이 가능하지만 모뎀 쪽에서 막혀버리기 때문에 공인 IP에 도메인을 바로 A레코드로 붙여서 쓸 수가 없다...

그래서 다른 방법으로 도메인을 붙여 해보려고 함. 렛츠 인크립트는 도메인을 보고 tls 인증을 해서 도메인이 필요하다고 한다.
TLS 인증서를 발급하기 위해 패키지를 깔고 아래처럼 실행하면 

[root@Alma ~]# dnf install certbot -y
[root@Alma ~]# certbot certonly --manual --preferred-challenges dns -d <구입한 도메인>

명령어 실행 모습

서트봇으로 tls 인증서 달라고 하면 이메일 입력, 약관 동의, 뉴스나 캠페인 등 메일로 소식 주는 거 물어보는데 2번째는 동의하고 나머지는 자유롭게 하면 됨.
그러면 with the following value 뜨는데 그거 그대로 복사해서 txt에 추가시키면 됨
호스팅 업체마다 설정 방법이 다를 수 있음. 나는 카페24의 도메인을 사용함

카페24 도메인 관리에서 TXT 레코드 추가
TXT 레코드 제대로 등록됐나 확인

그리고 다른 터미널 창을 열어서 실제로 잘 등록됐나 확인하고 문제 없으면 다시 certbot 실행한 터미널로 돌아와서 엔터치면 된다.

인증서가 생김

그럼 이렇게 인증서가 생겼다고 알려준다. 이걸 이제 nginx 설정 파일에 적용시켜주면 됨
기존 80포트(http)로 서버가 열렸었는데, 이걸 https로 해주면 됨
80으로 요청이 들어오면 https로 리다이렉트해주고, 도메인으로 연결해놨으니 server_name 부분에 인증서에 등록된 도메인 적어주면 됨
참고로 글을 쓴 시점에서 http의 최신 버전은 2.0 tls는 1.3임

 [root@Alma ~]# vi /etc/nginx/nginx.conf
 ...
 server {
        listen  80;
        listen  [::]:80;
        server_name <인증서 도메인>;

        return 301 https://$host$request_uri;
}

    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name <인증서 도메인>;

        ssl_certificate /etc/letsencrypt/live/pssuai.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/pssuai.com/privkey.pem;

        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 10m;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256';
        ssl_prefer_server_ciphers on;

        root /mnt/web;
        index index.php index.html index.htm;

        location / {
            try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
            fastcgi_pass unix:/run/php-fpm/www.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }

        location ~ /\. {
            deny all;
        }

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
    ...
[root@Alma ~]# firewall-cmd --add-port 443/tcp --permanent
[root@Alma ~]# firewall-cmd --reload

TLS 적용 완료! 하지만 인증은..?

그러면 https로 접속이 되는 게 보임! 이건 https로 잘 열렸다는 뜻
근데, 처음에도 말했지만 도메인 기반으로 인증하는 형태라 VM IP로 접속하면 저렇게 인증서에 빨간불이 들어옴.
그래서 여기선 임의로 테스트 하기 위해 윈도11의 hosts파일에 도메인을 매핑시켜 접속해봄

TLS 인증을 위해 수동으로 도메인 설정!

원래라면 공인 IP를 도메인에 붙여서 인증을 시켜야 하지만 개인적인 환경상 이중 NAT로 공유기 포워딩은 가능하나 모뎀에서 포워딩이 막혀서 임의로 함

인증서는 도메인으로 확인이 됨

근데 보면 https로 설정했음에도 보안 연결이 안 됐다고 나온다 공인 IP가 없이 임의로 실습을 위해 hosts 파일 조작으로 내부망(Hyper-V의 디폴트 스위치 네트워크 대역) IP로 접근했기 때문에 그렇다. 하지만 도메인은 맞게 되어 있으니 인증서가 유효하다고 뜨는 모습이 보인다.

근데 아직 해결 안 된 문제가 하나 더 있다. 워드프레스는 db랑 php-fpm으로 연결되어 여러 페이지로 구성되기 됨
따라서 다른 페이지로 넘어가면 아래와 같이 다시 도메인에서 IP로 리다이렉트되어 인증이 풀리게 됨
이걸 다시 설정해주면 된다

IP로 리다이렉트됨..

마리아DB에 들어가서 확인해보면 워드프레스용으로 설정한 db안에 옵션 테이블이 생성되는데, 여기 사이트가 어디로 연결되는지 뜬다.
사이트 url이 http://로 된 걸 볼 수 있는데, nginx에서 http(80)을 https(443)으로 리다이렉트(301)하라고 해서 https로 접속은 되는데, 도메인으로 접근해도 IP로 가게 됨
hosts 파일을 임의로 정해서 어쩔 수 없지만 이걸 https://<도메인>으로 변경하면 된다.

[root@Alma ~]# mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 38064
Server version: 10.5.29-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use wpdb;
Database changed
MariaDB [wpdb]> select option_name, option_value from wp_options where option_name in('siteurl','home');
+-------------+----------------------+
| option_name | option_value         |
+-------------+----------------------+
| home        | http://172.23.202.10 |
| siteurl     | http://172.23.202.10 |
+-------------+----------------------+
2 rows in set (0.001 sec)
MariaDB [wpdb]> update wp_options set option_value = "https://<내도메인>" where option_name in ("home", "siteurl");
Query OK, 2 rows affected (0.010 sec)
Rows matched: 2  Changed: 2  Warnings: 0

MariaDB [wpdb]> select option_name, option_value from wp_options where option_name in('siteurl','home');
+-------------+--------------------+
| option_name | option_value       |
+-------------+--------------------+
| home        | https://<내도메인> |
| siteurl     | https://<내도메인> |
+-------------+--------------------+
2 rows in set (0.001 sec)

DB 변경 후 자동으로 끊김

그리고 다시 브라우저 보면 DB가 변동되어 로그인이 끊김. 다시 로그인해주자.

성공적으로 반영됨

그리고 관리자 대시보드에서 설정 > 일반 에서 워드프레스 주소랑 사이트 주소를 확인해주면 바뀐 값으로 보임
마찬가지로 브라우저 주소창도 도메인으로 확인 되니 tls 적용까지 끝냈다! 

'리눅스 > 실습' 카테고리의 다른 글

IaC 실습하기-2  (0) 2025.11.09
IaC 실습하기-1  (0) 2025.11.09
워드프레스 LEMP 서버 구축하기-2  (0) 2025.11.08
워드프레스 LEMP 서버 구축하기-1  (0) 2025.11.07
리눅스 실습(4) - 프로세스와 자원 실습  (0) 2025.11.02