본문 바로가기

AWS

EC2 인스턴스 nginx에 ACM 인증서 적용하기

728x90

원래 AWS Certificate Manager(ACM)은 API Gateway, CloudFront, ALB 등 AWS 서비스에만 사용 가능했다.

근데 내보내기 가능한 공인 인증서 기능이 업데이트 되어서 nginx에 ACM에서 발급 받은 인증서를 적용해보겠다.

대부분 블로그는 api 이용해서 인증서 다운 받은 걸 바로 적용하길래 순수 어떻게 적용하는 건지 알아보자.

 

 

ACM 공인 인증서 관련 내용은 여기로 -> https://engine.tistory.com/184

 

AWS Certificate Manager 공인 인증서 개념, 발급방법

ACM 공인 인증서AWS Certificate Manager 신기능, 어디서나 사용할 수 있는 공개 인증서가 출시되었다.2025년 6월 17일, AWS에서 어디에서나 사용할 수 있는 AWS Certificate Manager (ACM) 공개 인증서를 업데이트

engine.tistory.com

 

 

테스트 환경

- EC2 : Amazon Linux 2023

- 네트워크 : 인터넷 게이트웨이와 연결된 Public Subnet

 

 

테스트 방법

1. nginx 설치하기

sudo apt update && sudo apt install nginx -y

 

 

2. SSL 인증서 저장

# SSL 디렉터리 생성
sudo mkdir -p /etc/nginx/ssl

# 다운로드한 인증서/키 복사
sudo cp ~/Downloads/certificate.pem /etc/nginx/ssl/
sudo cp ~/Downloads/certificate_chain.pem /etc/nginx/ssl/
sudo cp ~/Downloads/private_key.pem /etc/nginx/ssl/

 

 

3. nginx HTTPS 설정

- site-available 폴더에 사용할 도메인 이름으로 된 파일을 생성한다

sudo mkdir /etc/nginx/site-available
sudo nano /etc/nginx/sites-available/DOMAIN.kro.kr

 

 

4. DOMAIN.kro.kr 파일에 다음 내용을 입력한다.

server {
    listen 443 ssl;
    server_name DOMAIN.kro.kr;

    ssl_certificate /etc/nginx/ssl/certificate.pem;
    ssl_certificate_key /etc/nginx/ssl/private_key.pem;
    ssl_trusted_certificate /etc/nginx/ssl/certificate_chain.pem;

    location / {
        root /var/www/html;
        index index.html;
    }
}

server {
    listen 80;
    server_name DOMAIN.kro.kr;
    return 301 https://$host$request_uri;
}

 

 

5. nginx.conf 파일을 변경한다. 이 conf 파일에 site-enabled 폴더의 심볼링 링크를 적용할 수 있도록 해준다.

27번째 줄만 추가해줘도 괜찮다.

sudo nano /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*; << 추가

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

 

 

6. 심볼릭 링크 생성 및 nginx 재시작 해준다.

sudo ln -s /etc/nginx/sites-available/test.kro.kr /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

 

만약, pem키가 필요하다고 하면 ACM 인증서 발급받을 때 설정한 비밀번호를 입력하면 된다.

 

 

만약 인증서가 암호화 되어서 nginx 적용이 불가능하다거나 하면 다음 명령을 이용해 pem 파일의 암호화를 해제한다.

이때에도 동일하게 pem 파일의 비밀번호를 입력해야한다.

* 파일이름이 바뀌면 4번에서 파일이름을 변경해주는 것 잊지말자 * 

sudo openssl rsa -in /etc/nginx/ssl/private_key.pem -out /etc/nginx/ssl/private_key_decrypted.pem

 

 

7. 그러면 nginx에 도메인 적용이 되고, 암호화된 통신이 가능해진다!

 

ACM에서 여러 활용이 가능한 기능이 나온 것 같아 도움이 많이 될 것 같다 !

728x90