SSL/TLS와 설정 방법(apache, nginx, node.js)❓

beluga000·2024년 8월 20일
0
post-thumbnail

SSL과 TLS

SSL(보안 소켓 계층, Secure Sockets Layer)과 TLS(전송 계층 보안, Transport Layer Security)는 인터넷에서 데이터를 안전하게 전송하기 위한 암호화 프로토콜로, TLS는 SSL의 발전된 버전이며, 현재는 TLS가 표준으로 사용됩니다.

SSL/TLS 주요 구성 요소

  • 암호화(Encryption) : 전송되는 데이터를 암호화하여 제3자 데이터를 이해하지 못하게 합니다.
  • 인증(Authentication) : 클라이언트와 서버가 서로를 확인하여 신뢰할 수 있는 통신을 보장합니다.
  • 무결성(Integrity) : 데이터가 전송 중에 변경되지 않았음을 확인합니다.

SSL/TLS 핸드셰이크 과정

SSL/TLS 핸드셰이크는 클라이언트와 서버 간의 초기 통신 과정으로, 세션 키를 생성하고 서로를 인증하는데 사용됩니다.

  1. 클라이언트 헬로(Client Hello) : 클라이언트가 서버에 연결 요청을 보내며, 지원하는 SSL/TLS 버전과 암호화 방식 등을 제안합니다.
  2. 서버 헬로(Server Hello) : 서버가 클라이언트의 요청을 수락하고, 사용할 SSL/TLS 버전과 암호화 방식을 선택하여 클라이언트에 응답합니다. 또한 서버의 디지털 인증서를 클라이언트에게 제공합니다.
  3. 서버 인증 및 키 교환 : 클라이언트는 서버의 인증서를 검증하고, 서버의 공개 키를 사용해 세션 키를 암호화하여 서버에 보냅니다.
  4. 세션 키 생성 : 서버는 클라이언트가 보낸 암호화된 세션 키를 자신의 개인 키로 복호화하여 세션 키를 생성합니다. 이제 클라이언트와 서버는 이 세션키를 사용하여 대칭 암호화 방식으로 안전한 통신을 시작합니다.
  5. 핸드셰이크 완료 : 양측이 서로 통신 준비가 완료되었음을 알리며, 핸드셰이크가 종료되고 암호화된 데이터 전송이 시작됩니다.

SSL/TLS 설정

공통적으로 인증기관(CA)에서 SSL 인증서를 발급받아야 합니다. 추가로 Let's Encrypt와 같은 무료 CA를 사용할 수도 있습니다.

인증서 파일은 .crt(인증서), .key(비공개 키), .pem(인증서 체인) 파일이 제공됩니다.

Apache HTTP Server 설정

  1. Apache SSL 모듈 활성화
sudo a2enmod ssl
  1. 가상 호스트 파일 수정

/etc/apache2/sites-available/__.conf 파일을 열어 수정합니다. 파일 위치와 이름은 사용자의 프로젝트 구조에 맞춰서 작성

<VirtualHost *:443>
    ServerAdmin webmaster@your-site.com
    ServerName your-site.com

    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/your-site.crt
    SSLCertificateKeyFile /etc/ssl/private/your-site.key
    SSLCertificateChainFile /etc/ssl/certs/chain.pem

    <Directory /var/www/html>
        AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  1. SSL 설정 활성화 및 서버 재시작
sudo a2ensite your-site 
sudo systemctl restart apache2

Nginx 설정

  1. Nginx 설정 파일수정

/etc/nginx/sites-available/your-site 파일을 열어 수정합니다.

server {
    listen 443 ssl;
    server_name your-site.com;

    ssl_certificate /etc/ssl/certs/your-site.crt;
    ssl_certificate_key /etc/ssl/private/your-site.key;
    ssl_trusted_certificate /etc/ssl/certs/chain.pem;

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

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
}

server {
    listen 80;
    server_name your-site.com;

    return 301 https://$host$request_uri;
}
  1. 서버 재시작
sudo systemctl restart nginx

Node.js (Express.js) 설정

  1. 필요 모듈 설치
npm install https fs
  1. 서버 코드 작성
const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();

const options = {
    key: fs.readFileSync('/path/to/your-site.key'),
    cert: fs.readFileSync('/path/to/your-site.crt'),
    ca: fs.readFileSync('/path/to/chain.pem')
};

app.get('/', (req, res) => {
    res.send('Hello, world!');
});

https.createServer(options, app).listen(443, () => {
    console.log('HTTPS Server running on port 443');
});
  1. 서버 실행
node server.js
profile
Developer

0개의 댓글