4. openssl을 이용해 self-signed SSL 인증서 만들기

이형래·2021년 3월 23일
5

server

목록 보기
4/4

1. 에스에스엘...? (ssl...?)

subject 3번 조건 중,

당신의 서버는 SSL 프로토콜을 사용해야 한다.

라는 조건이 있다.

ssl을 보기도 전에 프로토콜 이라는 단어에서 벌써 거부감이 생긴다. 우웩

그럼 천천히 ssl을 공략해보자!

1.1 "http" vs "https"

성의없게 위키피디아를 그냥 긁어보자!

HTTP(HyperText Transfer Protocol, 문화어: 초본문전송규약, 하이퍼본문전송규약)는 W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. 주로 TCP를 사용하고 HTTP/3 부터는 UDP를 사용하며, 80번 포트를 사용한다. 1996년 버전 1.0, 그리고 1999년 1.1이 각각 발표되었다.

HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜이다. 예를 들면, 클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지(HTML)나 그림 정보를 요청하면, 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다. 이 정보가 모니터와 같은 출력 장치를 통해 사용자에게 나타나는 것이다.

이번엔 성의를 좀 추가해서 우리가 알고 넘어갈 내용만 적어보면,

HTTP(HyperText Transfer Protocol)는 W3 상에서 정보를 주고받을 수 있는 프로토콜이다.

80번 포트를 사용한다.

HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답 프로토콜이다.

이정도만 알고 넘어가도 될 것 같다.

그럼 HTTPS는 뭘까?

HTTPS에서 SOver Secure Socket Layer라고 한다.(What...?)
secure - 보안
보안이 강화 된 HTTP인가보다!

http는 암호화되지 않은 방법으로 데이터를 전송하기 때문에
서버와 클라이언트 사이에서 정보를 감청하는 것이 매우 쉽다.
때문에, 이를 보완한 개념이 https이다.

1.2 SSL 디지털 인증서

SSL 인증서는 서버와 클라이언트간의 통신을 제3자가 보증해주는 전자화 된 문서이다.

  1. 클라이언트 - 서버에 접속.
  2. 서버 - 클라이언트에게 인증서 정보를 전달.
  3. 클라이언트 - 인증서 정보 검증 후 다음 절차 진행.

2. self-signed SSL 인증서 만들기

우리는 오픈소스 openssl을 이용해 무료로 인증서를 생성한다.

2.1 openssl 설치

apt-get -y install openssl

2.2 인증서 및 key 생성

openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=Lee/CN=localhost" -keyout localhost.dev.key -out localhost.dev.crt 
  • req : 인증서 요청
  • -newkey rsa:4096 : rsa key 발행 사이즈
  • -days 365 : 인증서 유효기간
  • "C" : Country
  • "ST" : Street
  • "L" : City/Locality 시/도
  • "O" : Organization 기관
  • "OU" : Organization Unit 부서
  • "CN" : Common Name
  • -keyout <키 파일 이름> : 키 파일 이름 설정
  • -out <인증서 이름> : 인증서 이름을 설정

2.3 권한 제한

mv localhost.dev.crt etc/ssl/certs/
mv localhost.dev.key etc/ssl/private/
chmod 600 etc/ssl/certs/localhost.dev.crt etc/ssl/private/localhost.dev.key

인증서(crt파일)와 key 위치 지정 및 권한 제한.

2.4 nginx default 파일 설정을 변경하여 nginx에서 ssl을 사용하기

nginx default 파일을 수정할기 전에 편의를 위해 vim을 설치한다.

apt-get -y install vim

그리고 vim etc/nginx/sites-available/default파일을 열자.
아래와 같이 80번 포트만 수신 대기 중인 상태에서
443번 포트 수신 대기하는 블록을 추가해 준다.
80번 포트는 http
443번 포트는 https가 사용하는 포트 번호이다.

server {
		listen 80 default_server;
		listen [::]:80 default_server;

		# 80번 포트로 수신되면 443번 포트로 리다이렉션 시켜준다.
		return 301 https://$host$request_uri;
}

server	{
		listen 443;

		#ssl 설정
		ssl on;
		ssl_certificate /etc/ssl/certs/localhost.dev.crt;
		ssl_certificate_key /etc/ssl/private/localhost.dev.key;

		root /var/www/html;

		index index.html index.htm index.php index.nginx-debian.html;

		location / {
		try_files $uri $uri/ =404;
		}
}

수정된 사항을 nginx에 적용한다.

service nginx reload

크롬에서 localhost:80 으로 접속하면 경고문구가 뜨고 https://로 리다이렉션 되어 표시된다.

(mac 에서 안전하지 않은 사이트로 인지해 화면을 확인할 수 없는 경우 그냥 화면에 thisisunsafe를 입력한다.입력하는곳 없음 그냥 키보드 두들기기!)




이렇게 ssl이 무엇인지, http와 https의 차이에 대해 학습하고
직접 ssl인증서를 생성하여 https 사용하여 서버에 접속하는것까지 성공했다!

profile
프론트엔드 개발자 입니다. 최근에는 Flutter를 이용한 크로스 플랫폼 앱 개발에 관심이 많습니다.

1개의 댓글

comment-user-thumbnail
2021년 3월 24일

타...조..?

답글 달기