[CentOS 7] Apache 웹서버의 VirtualHost에 SSL 인증서 설정하기

2020. 8. 31. 02:51Web Server/CentOS 7

반응형

이전 포스팅
[CentOS 7] Apache 2.4 웹서버에 VirtualHost(가상호스트) 설정하기


  1. 개요
  2. openssl 설치
    1. openssl? mod_ssl?
    2. openssl 라이브러리 및 mod_ssl 모듈 다운로드
  3. private key 및 csr 파일 생성하기
    1. private key 생성하기
    2. SSL/TLS 발급 요청서(csr) 생성하기
  4. SSL/TLS 인증서 발급하기
  5. VirtualHost 설정
  6. demo 웹 서비스 인증서 확인하기 및 방화벽 개방
  7. 추가 설명

1. 개요

17

http 로 웹서비스를 할 경우, 위와 같은 주의 문구를 흔히 봤을 겁니다.
http는 데이터 전송시 별도의 암호화를 거치지 않기 때문에 데이터 변조나 누출의 우려가 있습니다.

웹사이트의 신뢰할 수 있는 사이트로 만들기 위해 기존 웹서비스에 SSL/TLS 인증서를 설정해봅시다.

웹 서비스를 하기 위한 방법은 다양하게 있습니다.
예를들면 Tomcat과 같은 WAS에 웹서비스 장착하여 서비스를 할 수도 있고,
또는 Apache 같은 웹서버에 웹서비스를 장착하거나, 정적 리소스들을 연결하여 서비스할 수도 있습니다.

따라서 웹서비스 형태에 따라 ssl을 적용하는 방법도 차이점이 있는데, 이번 포스팅에서는 Apache 2.4에 가상호스트 설정을 한 웹서비스에 SSL 설정을 하는 방법을 알아볼 것입니다.


2. openssl 설치

2.1. openssl? mod_ssl?

openssl은 컴퓨터 네트워크 상의 보안 통신을 위한 암호화 라이브러리로, 암호화 보안 프로토콜인 TLS(Transport Layer Security)나 SSL(Secure Socket Layer) 프토토콜을 구현을 제공하고 있습니다.

SSL은 2015년부터 지원이 중단된 프토토콜로 보안상의 이유로 현재 권장하고 있는 암호화 보안 프로토콜은 TLS이고, 웹브라우저 상에서도 점차 하위버전의 프로토콜의 지원은 중지하고 있는 추세입니다.

TLS는 SSL과 묶어서 SSL이라는 이름으로 불리고 있습니다.

mod_ssl은 openssl을 이용하여 SSL이나 TLS 프로토콜 암호화를 해주는 Apache 모듈입니다.

2.2. openssl 라이브러리 및 mod_ssl 모듈 다운로드

먼저 openssl 이 설치되어있는지 확인해봅시다.

openssl version

openssl 버전을 출력하는 명령어입니다.
만일, 버전이 출력되지 않는다면 openssl 라이브러리를 다운받습니다.

sudo yum install openssl

CentOS 7에서 yum을 통해 openssl을 설치할 경우 OpenSSL 1.0.2k-fips 버전이 설치됩니다.
TLS v1.3 은 OpenSSL 1.1.1 이상 버전부터 지원하기 때문에, 이번 포스팅에서는 TLS v1.3 설정은 빼고 진행합니다.


httpd -l를 이용하여 Apache 웹서버에서 컴파일한 정적모듈 목록을 조회합니다.

httpd -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c

이 명령어는 정적모듈만 출력하며, LoadModule 지시어를 통해 동적으로 로드된 모듈은 포함되고 있지 않습니다.

Apache 웹서버의 동적모듈 중 ssl 관련 모듈이 있는지 조회해봅니다.

ll /usr/lib64/httpd/modules | grep ssl

두가지 조회방식에서 mod_ssl 모듈이 조회가 되지 않았다면, mod_ssl을 설치하면 됩니다.

sudo yum install mod_ssl

설치 한 후 동적모듈에서 ssl을 조회해보니 모듈이 조회되는 것을 확인할 수 있습니다.

ll /usr/lib64/httpd/modules | grep "ssl"
-rwxr-xr-x 1 root root 219456  42 22:14 mod_ssl.so

3. private key 및 csr 파일 생성하기

Apache 웹서버의 가상 호스트에 SSL/TLS 인증서를 설정하기 위해서는 개인키와 2가지(또는 3가지) 인증서에 대한 설정이 필요합니다.

<VirtualHost *:443>
  ...
  SSLCertificateKeyFile 개인키
  SSLCertificateFile 서버인증서
  SSLCACertificateFile rootCA인증서
</VirtualHost>

체인인증서는 rootCA인증서와 별도로 설정할수도 있습니다. (Apache 2.4.8 미만 버전)
그러나 위와 같이 인증서를 2개만 설정할 경우에는 rootCA인증서와 체인인증서의 통합본을 SSLCACertificateFile에 설정해야 합니다.


인증서들은 openssl 라이브러리를 이용하여 직접 생성할수도 있기는 하지만, 직접 생성한 인증서는 공인된 인증서가 아니기 때문에 신뢰할 수 없는 사이트로 표시되며, 보안 역시 보장할 수 없다는 점이 있습니다.

이번 포스팅에서는 검증된 CA(Certificate Authority, 인증기관)에서 발급받은 인증키를 이용하여 웹서비스의 HTTPS 설정을 할것입니다.

개인키는 인증서 발급기관에 따라 직접 생성해주거나, 또는 직접 openssl로 생성한 후 CA에서 인증서를 발급받을 시 제출하는 방법이 있습니다.

저는 직접 개인키를 생성하고 그 개인키를 이용하여 인증서를 발급해보도록 하겠습니다.

3.1. private key 생성하기

openssl genrsa [-aes256] -out 비밀키 bit크기

RSA 알고리즘을 이용하여 private key를 생성합니다.
SSL/TLS 인증서를 설치할 서버의 SSLCertificateKeyFile에 private key를 설정하고, SSL/TLS 인증서를 발급해주는 사이트에 이 비밀키와 짝을 이루는 공개키를 제출합니다.

RSA 알고리즘을 이용하여 생성한 private key 만으로도 충분히 보안상 문제가 없지만, 만일 private key를 사용할 때에도 추가 비밀번호를 입력받고 싶다면 pass phrase를 설정해주면 됩니다.

이 때 입력되는 pass phrase는 대칭키 암호화 알고리즘을 이용해서 암호화 합니다. (ex. -aes256, -des3)

openssl genrsa \
-out /etc/pki/tls/private/demo.key 2048

2048bit의 private key를 pass phrase 설정은 하지 않고 생성했습니다.

※ 참고로 pki는 public key infrastructure의 약자로, 공개키 기반 구조를 의미합니다.
비밀키는 다른말로 공개키 암호화 기술이라고도 불리우는데, 이는 공개키와 비밀키가 서로 pair를 이뤄 인증을 허가하기 때문입니다.

3.2. SSL/TLS 발급 요청서(csr) 생성하기

생성한 private key를 이용하여 csr 파일을 생성합니다.
csr은 Certificate Signing request의 약자로, 서버인증서의 발급신청을 위해 인증기관에게 보낼 요청 파일입니다.

이 csr 파일은 인증서에 설정할 서버의 정보와 private key와 짝을 이룰 public key 내용을 포함하고 있다고 보면됩니다.

openssl req -new \
-key /etc/pki/tls/private/demo.key \
-out /etc/pki/tls/certs/demo/demo.csr
  • Country Name (2 letter code)
    • 2자로 약속된 국가 코드를 작성합니다.
    • 대한민국은 KR 입니다.
  • State or Province Name (full name)
    • 주나 시이름을 작성합니다.
    • ex) Seoul
  • Locality Name (eg, city)
    • 구나 군이름을 작성합니다.
    • ex) Seoul
  • Organization Name (eg, company)
    • 기관명을 작성합니다.
  • Organizational Unit Name (eg, section)
    • 조직명을 작성합니다.
    • ex) Dev
  • Email Address
    • 이메일을 작성합니다.

challenge password 나 optional company name 같은 부가 옵션은 별도로 지정하지 않아도 됩니다.


4. SSL/TLS 인증서 발급하기

CA에 들어가 인증서를 발급받아 봅시다.
저의 경우 SecureSign에서 RapidSSL Free Trial을 신청했습니다.

12


13

이 사이트에서는 csr과 private key를 자동 생성해주는 기능도 제공하고 있습니다.

14

그러나 우리는 직접 private key와 csr파일을 생성했었죠.
조금 전에 생성했던 csr 파일을 내용을 직접 입력해줍니다.

15

신청이 완료되었습니다.
신청을 마친 후 DCV(Domain Control Validation) 인증까지 완료하면 인증서를 발급받을 수 있습니다.

DCV는 도메인 권한을 인증받는 것으로 인증서에 설정한 Host의 이메일이나 DNS의 CNAME 등의 인증 방법을 통해 인증받을 수 있습니다.

인증서에 따라 제공하는 DCV 종류가 다를 수 있으며, 제가 신청한 RapidSSL Free Trial 인증서의 경우 이메일 방식만 제공합니다.

18

링크를 클릭하여 SSL/TLS 인증 요청을 승인하면 인증서 발급을 위한 모든 절차가 끝납니다.

19

DCV 인증까지 모두 완료하면 인증서가 발급됩니다.
다운로드 버튼을 통해 서버인증서, 체인인증서, 루트CA인증서를 다운받고, 다운받은 인증서들을 서버에 저장합니다.

인증서는 모두 /etc/pki/tls/certs/demo 디렉터리 아래에
server.crt, chain.crt, rootCA.crt 라는 이름으로 저장했습니다.

루트CA인증서의 경우 체인인증서와 통합하여 설정할 예정이므로 미리 통합인증서를 만들어둡니다.
cat rootCA.crt chain.crt > caChain.crt

이 때 생성되는 인증서들은 X.509 인증서입니다.


5. VirtualHost 설정

기존의 demo 웹사이트는 HTTP 프로토콜에 80포트로 서비스하고 있었습니다.

demo.jiniworld.me 호스트로 접속했을 시, 내부적으로 8989포트에 에 올라가 있는 demo 앱을 프록시로 연결해주었습니다.

<VirtualHost *:80>
 ServerName demo.jiniworld.me
 ErrorLog "/var/log/httpd/demo/error_log"
 CustomLog "/var/log/httpd/demo/access_log" common
 RewriteEngine on

 ProxyPreserveHost on
 ProxyPass / http://127.0.0.1:8989/ nocanon
 ProxyPassReverse / http://127.0.0.1:8989/
 ProxyRequests off
 AllowEncodedSlashes NoDecode

 <Proxy http://127.0.0.1:8989/*>
    Order deny,allow
    Allow from all
 </Proxy>
</VirtualHost>

Apache 웹서버를 이용하여 가상호스트 설정하는 방법에 대해 알고 싶다면 [CentOS 7] Apache 2.4를 이용한 VirtualHost(가상호스트) 설정을 참고해주세요.

위의 설정정보 대신 HTTPS 프로토콜에 웹서비스를 하기 위한 설정으로 변경할 것입니다.

<VirtualHost *:443>
  ServerName demo.jiniworld.me
  CustomLog "/var/log/httpd/demo/access_log" common
  ErrorLog "/var/log/httpd/demo/error_log"

  SSLEngine on
  SSLProxyEngine on
  SSLProtocol all -SSLv3

  SSLCertificateKeyFile /etc/pki/tls/private/demo.key
  SSLCertificateFile /etc/pki/tls/certs/demo/server.crt
  SSLCACertificateFile /etc/pki/tls/certs/demo/caChain.crt

  RequestHeader set X-Forwarded-Proto "https"
  RequestHeader set X-Forwarded-Port "443"

  ProxyPreserveHost on
  ProxyPass / http://127.0.0.1:8989/ nocanon
  ProxyPassReverse / http://127.0.0.1:8989/
  ProxyRequests off
  AllowEncodedSlashes NoDecode

  <Proxy http://127.0.0.1:8989/*>
     Order deny,allow
     Allow from all
  </Proxy>
</VirtualHost>

HTTPS의 기본 포트인 443으로 변경하고, 위에서 highlight한 부분을 추가합니다.
그 중 SSL로 시작하는 지시어들은 모두 TLS/SSL 프로토콜 통신과 관련된 설정 정보로, mod_ssl 모듈을 이용합니다.

  • SSLEngine
    • SSL/TLS 프로토콜 엔진의 사용여부를 설정합니다.
  • SSLProxyEngine
    • 프록시를 이용한 SSL/TLS 프로토콜 엔진 사용여부를 설정합니다.
    • 프록시를 이용하고 싶다면 on 설정을 해야합니다.
  • SSLProtocol
    • 사용가능한 SSL/TLS 프로토콜 버전을 설정합니다.
    • SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3, all
    • all
      • OpenSSL 1.0.1 이상버전
        • +SSLv3 +TLSv1 +TLSv1.1 +TLSv1.2
      • OpenSSL 1.0.1 미만버전
        • +SSLv3 +TLSv1
    • +all -SSLv3 = TLSv1, TLSv1.1, TLSv1.2
    • TLSv1.3은 OpenSSL 1.1.1 이상 버전부터 지원합니다.
  • SSLCertificateKeyFile
    • private key(비밀키)
  • SSLCertificateFile
    • 서버인증서
  • SSLCACertificateFile
    • 루트 CA 인증서
    • 체인인증서와 루트CA인증서를 하나로 통합해서 설정해도 됩니다.(통합했을 경우에는 체인인증서는 설정하지 않습니다.)
  • SSLCertificateChainFile
    • 체인인증서

인증기관으로부터 발급받은 인증서들을 /etc/pki/tls/certs/demo 폴더 아래에 위치시켰습니다.

가상호스트 설정을 변경했다면, 웹서버를 재시작해봅니다.

sudo systemctl restart httpd

netstat 명령어를 이용하여 httpd 서비스로 개방된 포트정보를 확인합니다.

sudo netstat -nap | grep LISTEN | grep httpd
tcp6       0      0 :::443                  :::*                    LISTEN      21133/httpd         
tcp6       0      0 :::80                   :::*                    LISTEN      21133/httpd  

6. demo 웹 서비스 인증서 확인하기 및 방화벽 개방

10

이제 demo 웹사이트에 https 프로토콜이 적용된 것을 확인할 수 있습니다.

11

인증서 정보도 확인할 수 있습니다.

만일, 가상호스트 설정을 완료하고 웹서버 재시작도 원활히 되었음에도 사이트가 열리지 않고 아래와 같은 창이 뜬다면, 서버의 방화벽에 https 서비스가 개방되어있는지 확인해봐야 합니다.

20
sudo firewall-cmd --list-services
dhcpv6-client http mysql ssh

만약, 위와 같이 https 가 설정되어있지 않을 경우, https 서비스를 추가한 후 reload 합니다.

sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-services
dhcpv6-client http https mysql ssh

https가 추가된 것을 확인했다면 다시 웹사이트에 접속해봅니다.


7. 추가 설명

mod_ssl 모듈을 설치한 후, Apache 웹서버에 별도의 설정을 하지 않았음에도 모듈을 사용할 수 있는 이유는 모듈 설치시 생성되는 SSL/TLS 관련 구성파일들이 기본으로 생성되어 httpd.conf 파일에 포함되기 때문입니다.

httpd.conf 파일을 열어보면 내부에 아래의 정보를 찾아 볼 수 있습니다.

Include conf.modules.d/*.conf
IncludeOptional conf.d/*.conf

/etc/httpd/conf/httpd.conf

conf.modules.d 에는 동적으로 설치한 모듈을 로드하는 구성파일들이 위치한 디렉토리이고, conf.d는 ssl을 포함한 기타 구성정보가 포함된 디렉토리 입니다.

conf.modules.d 디렉토리 내에는 00-ssl.conf 라는 구성파일이 새로 추가되어 있는데, 내부에 작성된 코드는 매우 단순합니다.
아래와 같이 mod_ssl 모듈을 로드하는 코드를 포함하고 있습니다.

LoadModule ssl_module modules/mod_ssl.so

또한 conf.d 디렉토리 내에 있는 ssl.conf 파일에는 443 포트의 활성화를 포함한 ssl에 관련된 기타 설정정보들이 들어있습니다.

Listen 443 https
...
<VirtualHost _default_:443>
...
</VirtualHost>

++

  • Apache 2.4 에 ssl 설정하기
  • VirtualHost에 https 설정하기
  • Apache 2.4 + HTTPS + SSL/TLS
  • CentOS 7 Apache 2.4의 VirtualHost에 SSL 인증서 설정하기
728x90
반응형