728x90
💡 시작 전에 일단 SSL이 무엇이고 어떤 과정으로 http의 보안 문제가 해결되는지 알아보자.
이 글을 이해하기 위해서는 대칭키, 비대칭키의 개념과 http, https에 대한 기본적인 지식을 가지고 있어야 한다.
SSL/TLS에 대하여
SSL은 Secure Sockets Layer로 웹 서버를 인증할 때 사용하는 표준 보안 기술이다. 서버와 클라이언트(브라우저) 간의 통신에서 http는 패킷을 암호화하지 않기 때문에 전송되는 패킷 정보가 외부에 그대로 노출이 된다. 이는 보안에 심각한 허점을 만들어낸다. 따라서 ssl을 이용해 패킷을 암호화하여 도중에 패킷을 갈취당해도 정보의 내용을 보호할 수 있게 하는 것이다.
TLS는 SSL의 업데이트 버전이며 SSL v4.0이 아니라 TLS v1.0으로 바뀐 것이다. 사실상 같은 의미이며 통상적으로 SSL이라 부른다. 현재 최신 SSL 프로토콜은 TLS인 것이다.
들어가기
- 서버는 인증기관(CA)에게 SSL 인증서 발급을 요청한다.
- 인증 기관에서는 발급한 SSL 인증서를 서버에게 준다.
- 서버는 도메인에 HTTPS를 적용한다.
- 클라이언트가 서버에 연결을 요청한다.
- 서버는 인증기관으로부터 발급받은 SSL 인증서를 클라이언트에게 전달한다.
- 클라이언트는 자신이 가지고 있는 인증기관 목록에서 서버로부터 받은 SSL 인증서를 대조하여 신뢰된 기관으로부터의 인증서인지 체크한다. 간혹 우리가 웹서핑을 할 때 신뢰되지 않은 사이트라고 경고 문구가 뜨는 경우가 있는데 이는 SSL 인증서를 만든 인증기관이 신뢰받는 곳이 아니기 때문이다.
- 클라이언트는 서버로부터 받은 SSL 인증서를 이용하여 서버와 대칭키를 교환한다.
- 서버와 클라이언트는 패킷을 암호화하여 보내는 방식으로 안전하게 통신한다.
이 과정이 어떻게 이루어지는지 전체적인 맥락을 자세히 살펴보자.
서버 측에서 SSL 인증서를 발급받는 과정
- 서버는 인증서를 얻기 위해 인증서 서명 요청(CSR, Cerificate Signing Request)을 생성한다. CSR이란 SSL 인증서 발급을 위한 신청서라고 보면 된다. 이 과정에서 서버에 개인키와 공개키가 생성된다.
- 서버는 인증기관에게 CSR 데이터 파일을 보낸다. CSR 데이터 파일은 서버의 개인키로 전자서명되어 있으며 서버의 공개키가 포함된다.
- 인증 기관은 CSR 데이터 파일에 있는 서버의 공개키로 서명을 검증하고 이를 토대로 SSL 인증서를 만든다. SSL 인증서에는 서버의 공개키와 서버 정보가 포함되어 있으며 인증기관의 개인키로 전자서명되어 있다.
- 인증기관은 SSL 인증서를 서버에 보낸다.
서버와 클라이언트 간의 통신
- 클라이언트가 서버에 연결을 요청한다.
- 3-way handshake 과정을 거치고 나서 클라이언트가 서버에게 SSL handshake를 요청한다.
- 서버는 SSL 인증서를 클라이언트에게 보낸다.
- 클라이언트는 인증기관 목록에 서버로부터받은 SSL 인증서를 만든 기관의 목록을 확인한다. 이후 인증 기관의 공개키를 이용해 SSL 인증서를 복호화한다.
- 클라이언트는 비밀키(대칭키)를 생성하여 인증서에 있던 서버의 공개키로 비밀키를 암호화하여 서버에 전송한다.
- 서버는 자신의 개인키로 클라이언트가 보낸 클라이언트의 비밀키를 복호화하여 클라이언트의 비밀키를 얻게 된다.
- 이후 서버와 클라이언트는 클라이언트가 만든 비밀키로 데이터를 암호화하여 통신한다.
NginX에서 SSL 적용하기
SSL 인증서의 구조
- SSL 인증서 안에는 서버에 대한 정보와 서버의 공캐키 그리고 그 공개키의 암호화 방법이 저장되어 있다.
- ssl 인증서 파일에는 .pem, .key, .crt 등과 같이 인증서 파일 포맷의 종류가 여러 개 있다.
.pem
- Base64 인코딩 된 ASCII 텍스트이며 CSR 등에 사용되는 포맷이다.
.crt
- 인증서 파일이며 리눅스 기반 시스템에서 통용되는 확장자이다.
.key
- 주로 openssl 및 java에서 개인키 파일임을 구분하기 위해 사용되는 확장자이다.
SSL 적용방법
- SSL 인증서를 발급받는다.
- SSL을 적용하기 위해서는 nginx.conf or default.conf 파일을 수정해 주면 된다.
- 수정 시에는 파일 포맷 명에 관계없이 본인이 가지고 있는 인증서 및 키를 등록하면 된다.
config 파일 수정
http {
server {
ssl_certificate /ssl/nginx_example.crt;
ssl_certificate_key /ssl/nginx_example.key;
listen 포트번호 ssl; #ssl 꼭 붙여야 합니다.
server_name 서버이름
location / {
root /빌드파일/경로를/입력하세요.;
index index.html index.htm;
}
}
- Config 파일 수정 후에는 저장한다.
config 파일 테스트
nginx -t
- 터미널에 입력하면 config 파일을 테스트하여 문법 오류 확인할 수 있다.
웹서버 재실행
service nginx restart
sudo service nginx restarts
udo systemctl restart nginx
- 서버를 재실행하여 접속하면 끝이다.
참고
https://www.sslcert.co.kr/guides/kb/54
https://www.digicert.com/kr/what-is-an-ssl-certificate
https://www.comodossl.co.kr/certificate/ssl-installation-guides/Apache-csr-crt.aspx
https://www.lesstif.com/ws/ssl-43843966.html
728x90
'넓고 얕은 웹 지식' 카테고리의 다른 글
직접 만들어 보면서 이해하는 웹소켓 (1) - 왜 웹소켓(WebSocket)인가? (0) | 2024.05.10 |
---|---|
로컬에서 도커로 nginx 설치 & 스프링 부트의 프록시 서버 테스트 해보기 (1) | 2023.11.14 |
Apache와 NginX 비교 및 차이점 (0) | 2023.05.15 |
Apache Tomcat에 대해 쉽고 빠르게 정리하기(with. httpd) (0) | 2023.05.15 |
NGINX 설치 및 간단히 알아보기 (0) | 2023.05.12 |