Web Programming

CentOS7, Apache를 활용한 HTTPS 환경 구성(자체 서명 SSL/TLS)

안녕하세요, 씨앤텍시스템즈 황순호 연구원입니다.

 

이번 포스트는 Apache 웹서버를 활용하여 HTTPS 웹 환경을 구성하는 방법에 대해 작성하도록 하겠습니다.

 

HTTPS는 웹 트래픽을 암호화하는 프로토콜로 클라이언트와 웹 서버 사이에 주고받는 정보를 보호합니다. 개발 환경에서 이러한 HTTPS 구성이 필요한 이유는 타 도메인에 대한 쿠키 전송이나 webRTC와 같은 기술을 적용할 때 HTTP 환경에서는 웹 브라우저 보안 정책 상 제한되는 기능이 많기 때문에 개발 및 테스트 어려움을 겪게 됩니다.

 

본래 HTTPS 구성을 위해서는 Digicert, GlobalSign, Comodo 등 다양한 인증기관(CA)에 신청하여 인증서를 받는 과정이 필요합니다. 또, 제약사항이 있으나 무료로 인증서를 발급하는 CA도 존재합니다. 개발을 테스트하기 위한 환경에서는 이러한 과정 없이 자체적으로 인증서에 서명하고 발급하여 사용할 수 있습니다.

 

이번 목표는 CentOS7이 설치된 서버와 같은 네트워크에 존재하는 Windows 클라이언트에서 https 프로토콜을 이용한 통신을 진행하는 것입니다.


1. openssl 설치

먼저 CentOS에서 openssl을 통하여 인증서를 생성하도록 합니다.

openssl이 설치되지 않은 경우 다음 명령어를 이용하여 설치합니다.

 

sudo yum install openssl

 

설치가 되었는지 확인합니다.

openssl version


 

2.  웹페이지 생성

 

Apache에서 클라이언트에 제공할 테스트용 웹페이지를 하나 생성합니다.

저의 경우는 /var/www/testweb 디렉토리에 웹페이지를 생성하였습니다.

 

mkdir /var/www/testweb
echo "<h1>https</h1>" >/var/www/testweb/index.html

 

 

3.  windows hosts 도메인 등록

발급받아 사용가능한 도메인이 있다면 3번 항목은 생략하도록 합니다.

 

CentOS가 동작하는 서버의 IP를 알기 위해 ip addr 명령어를 입력합니다. 현재 사용하는 centos7은 내부 네트워크 상에 192.168.1.69 IP 주소를 가지고 있습니다. 



접속에 사용할 임의의 도메인을 정하여 windows 클라이언트에 등록합니다. 

저는 test-ssl.com을 접속할 도메인명으로 정하였고  hosts 파일에 이를 등록하도록 합니다.

windows CMD를 관리자 권한으로 실행 후 다음 명령어를 입력합니다.

 

※ Windows10 기준 파일 경로이며 사용하는 Windows 버전에 따라 달라질 수 있습니다.

notepad C:\Windows\system32\drivers\etc\hosts



메모장이 실행되며 위 이미지와 같은 화면이 출력됩니다.

맨 밑에 한 줄을 입력하였고 이로써 test-ssl.com 도메인에 대한 IP주소는 192.168.1.69로 인식하게 되었습니다.

 

4.  openssl을 이용한 인증서 생성

수동으로 인증서를 만들 경우 주체 대체 이름이 설정되지 않아 이후 HTTPS 구성을 하여도 웹 브라우저에서 경고창을 출력합니다. 따라서 인증서 생성에 앞서 인증서 설정 파일을 미리 생성합니다. CentOS로 돌아와 vi 또는 사용하는 텍스트 에디터로 다음과 같이 내용 작성 후 저장합니다.

 

[req]
default_bits = 2048
prompt = no
default_md = sha256
x509_extensions = ext
distinguished_name = dn
[dn]
C = KR
ST = Seoul
L = Seoul
O = CNT
emailAddress = CNT@mail.com
CN = *.test-ssl.com //사용할 도메인 명으로 와일드 카드를 적용하였음
[ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = test-ssl.com //주체 대체 이름 1
DNS.2 = www.test-ssl.com //주체 대체 이름 2

 

저는 이 파일을 san.conf 이름으로 저장하였습니다.

 

이제 위 설정파일을 바탕으로 인증서를 생성합니다.

san.conf가 저장된 디렉토리에서 다음 명령어를 입력하여 키와 인증서를 동시에 생성합니다.

openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout server.key -days 3600 -out server.crt -config san.conf


5.  Apache 설정

해당키와 인증서 파일을 Apache에 등록하기 위해

임의의 디렉토리를 만들어 키와 인증서 파일을 저장합니다.

 

저는 apache가 설치된 디렉토리 내 키와 인증서 파일을 저장하였습니다.(/etc/httpd/conf.d/key)

새로운 apache 설정파일을 생성하고 다음 내용을 작성하여 저장합니다.

저는 testweb.conf 이름으로 저장하였습니다. (/etc/httpd/conf.d/testweb.conf)

 

<VirtualHost *:443>
    ServerName test-ssl.com
    DocumentRoot /var/www/testweb
    SSLEngine             on
    SSLCertificateFile    /etc/httpd/conf.d/KEY/server.crt
    SSLCertificateKeyFile /etc/httpd/conf.d/KEY/server.key
</VirtualHost>

<VirtualHost *:80>
    ServerName test-ssl.com
    Redirect / https://test-ssl.com
</VirtualHost>

 

https 프로토콜이 동작하는 포트인 443으로 요청이 오면 앞서 생성한 /var/www/testweb 디렉토리에 index.html을 제공하도록 설정되었습니다.

 

apache 웹서버를 재실행시킵니다.

sudo systemctl restart httpd

 

 

6.  Windows 인증서 설치

거의 다 왔는데요, 공인 인증서가 아닌 자체적으로 서명된 인증서이므로 클라이언트에서는 아직 유효한 인증서로 인식하지 않습니다. 따라서 접속할 클라이언트에 앞서 생성한 server.crt 파일을 설치합니다.


 

 

 

 


7.  HTTPS 동작 확인

인증서 설치까지 마쳤다면 이제 웹브라우저를 이용하여 test-ssl.com에 접속을 합니다.

 



별도의 경고 없이 접속이 되고 인증서에 대한 정보도 확인할 수 있습니다.

 

감사합니다.

 

728x90

'Web Programming' 카테고리의 다른 글

Spring Boot에서 MyBatis 적용  (1) 2023.12.15
NodeJS 와 Angular, React 앱 연동  (0) 2023.12.11
쿠키를 이용한 개인화와 인증  (0) 2022.09.20
Promise 비동기 처리의 이해  (0) 2022.09.08
Sass 와 SCSS의 차이  (0) 2022.08.22