티스토리 뷰

728x90
반응형


 포스팅은 Apache에서 SSL을 적용하는 가이드입니다.


기존 설치되어있는 Apache에서 SSL 인증서를 만들고, 적용하여 HTTP>HTTPS로의 Rewrite를 테스트해보도록 하겠습니다. 

Apache 웹서버에 SSL를 적용하기 위해 아래 두 항목이 웹서버에 설치되어 있어야 합니다.

- Openssl 암호화 라이브러리 
- Mod_ssl 모듈 

위 두 항목이 웹서버에 설치되어 있다면 개인키를 생성하고 생성된 개인키를 바탕으로 CSR 파일을 생성합니다. 
생성된 CSR 파일을 공식 인증기관에 접수하여 정식 인증서를 발급받습니다.
발급된 인증서를 웹서버에 설치하게 되면 SSL 설정을 완료하게 됩니다.
위 일련의 진행사항은 아래와 같은 절차를 따르게 됩니다. 
1. openssl 라이브러리 설치상태 확인 
2. mod_ssl 모듈 설치상태 확인 
3. 개인키 생성 
4. CSR 생성 
5. 공식 인증기관에 접수 
6. 정식 인증서 발급 
7. SSL 설정
그럼 진행하도록 하겠습니다. 

1. openssl 설치

-bash-4.2$ sudo yum install openssl

[sudo] password for apacheUser:

Loaded plugins: fastestmirror, langpacks

Loading mirror speeds from cached hostfile

 * base: centos.mirror.cdnetworks.com

 * extras: centos.mirror.cdnetworks.com

 * updates: centos.mirror.cdnetworks.com

Package 1:openssl-1.0.2k-12.el7.x86_64 already installed and latest version



2. mod_ssl 을 설치합니다. 

-bash-4.2$ sudo yum install mod_ssl

[sudo] password for apacheUser:

Loaded plugins: fastestmirror, langpacks

Loading mirror speeds from cached hostfile

 * base: centos.mirror.cdnetworks.com

 * extras: centos.mirror.cdnetworks.com

 * updates: centos.mirror.cdnetworks.com

..

..

Total download size: 111 k

Installed size: 224 k

Is this ok [y/d/N]: y

Downloading packages:

mod_ssl-2.4.6-80.el7.centos.1.x86_64.rpm                                                                                                                         | 111 kB  00:00:00

Running transaction check

Running transaction test

Transaction test succeeded

Running transaction

  Installing : 1:mod_ssl-2.4.6-80.el7.centos.1.x86_64                                                                                                                               1/1

  Verifying  : 1:mod_ssl-2.4.6-80.el7.centos.1.x86_64                                                                                                                               1/1


Installed:

  mod_ssl.x86_64 1:2.4.6-80.el7.centos.1


Complete!

 


/etc/httpd/modules 아래에 mod_ssl.so 이 생성됩니다. 

이를 APACHE_HOME/modules/아래에 copy합니다. 


2.openssl 명령어를 이용해서, 개인키 생성 > CSR 생성 > 자체적으로 서명한 crt파일 생성을 완료합니다. 


개인키 생성>

-bash-4.2$ sudo openssl genrsa -des3 -out test.key 2048

[sudo] password for apacheUser:

Generating RSA private key, 2048 bit long modulus

..................................+++

.............................................................................................+++

e is 65537 (0x10001)

Enter pass phrase for test.key:

Verifying - Enter pass phrase for test.key:



CSR 생성>

-bash-4.2$ sudo openssl req -new -key test.key -out test.csr

Enter pass phrase for test.key:

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [XX]:kr

State or Province Name (full name) []:kyungkido

Locality Name (eg, city) [Default City]:bundanggu

Organization Name (eg, company) [Default Company Ltd]:sw

Organizational Unit Name (eg, section) []:kkm

Common Name (eg, your name or your server's hostname) []:kkm

Email Address []:kkm


Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:


자체적으로 서명한 crt파일 생성>

-bash-4.2$ sudo openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt

Signature ok

subject=/C=kr/ST=kyungkido/L=bundanggu/O=sw/OU=kkm/CN=kkm/emailAddress=kkm

Getting Private key

Enter pass phrase for test.key:



How To Generate SSL Key, CSR and Self Signed Certificate For Apache 

https://www.thegeekstuff.com/2009/07/linux-apache-mod-ssl-generate-key-csr-crt-file/


3. httpd.conf 수정


LoadModule ssl_module modules/mod_ssl.so

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

→ mod_ssl과 mod_socache_shmcb 모듈을 활성화합니다.


Include conf/extra/httpd-ssl.conf

→ httpd-ssl.conf를 사용할 수 있도록 활성화 시킵니다.


LoadModule rewrite_module modules/mod_rewrite.so

rewrite 기능을 사용할 수 있도록 활성화 시킵니다.


4. httpd-ssl.conf 설정


<VirtualHost _default_:443>


#   General setup for the virtual host

DocumentRoot "/home/apache/apache/htdocs"

ServerName www.kkm.com:443

ServerAdmin you@example.com

ErrorLog "/home/apache/apache/logs/error_log"

TransferLog "/home/apache/apache/logs/access_log"

JkMount /* load_balancer

     

SSLEngine on

SSLCertificateFile [인증서 파일 경로]

SSLCertificateKeyFile [키파일 경로]

SSLCACertificateFile [중계인증서 파일경로] 


5. httpd-vhost.conf 설정 : HTTP > HTTPS 로의 Rewrite를 위한 설정을 합니다. 

<VirtualHost *:80>

    DocumentRoot "/home/apache/apache/htdocs"

    ServerName www.kkm.com

    ServerAlias www.kkm.com

    ErrorLog "/home/apache/apache/logs/ddd/error_log"

    CustomLog "/home/apache/apache/logs/ddd/access_log" common

    JkMount /* load_balancer

    RewriteEngine On

    RewriteCond %{HTTPS} off

    RewriteRule .* https://www.kkm.com/session.jsp

</VirtualHost>

*참고하기*

RewriteCond %{HTTPS} on/off 설정을 이용하여 프로토콜 별로 처리할 수 있습니다.

Rewrite를 추가하는 부분에서 SSL 인증서를 사용하고 있다면

[P] 옵션을 사용하기 때문에  (P=Proxy)

SSLProxyEngine On 

설정을 추가해줘야 합니다.

 

Proxy를 사용하지 않아도 될 경우에는 [P,R,L] -> [R=301,L] 사용

 

- HTTP를 HTTPS로 리다이렉트

   <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [P,R,L]
   </IfModule>

 

- HTTPS를 HTTP로 리다이렉트

   SSLProxyEngine On    => SSL 인증서를 이용하고 있다면 넣어줘야 한다.
   <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTPS} on
        RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [P,R,L]
   </IfModule>
 
- HTTP/HTTPS를 고려하여, 받은 URL 그대로 리다이렉트.
 
   SSLProxyEngine On    => SSL 인증서를 이용하고 있다면 넣어줘야 한다.   
<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTPS} on
        RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [P,R,L]
        RewriteCond %{HTTPS} off
        RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [P,R,L]

   </IfModule> 

 

*참고하기*

한 컴퓨터/장비에서 여러개의 웹서비스들을 구동할 수 있도록 할 수 있는 방법을 

아파치 가상 호스트(VirtualHost)라고 하며,그 적용방법은 크게 아래의 4가지로 나눌 수 있습니다.

 

1. IP기반 가상호스트(IP-based virtual host) : 가상호스트별로 각각 IP주소 1개씩 부여
2. 포트기반 가상호스트(port-based virtual host) : 동일한 호스트에 포트만 다르게 지정
3. 이름기반 가상호스트(name-based virtual host) : 같은 IP에서 도메인명이 다른 가상호스트들 운용
4. 기본 가상호스트(default virtual host) : 특정 호스트에 해당 사항 없을때 기본적으로 응답하게 될 호스트

일반적인 설정은 보통 httpd-vhosts.conf에 가상 호스트를 설정하고, httpd.conf 파일 마지막에 Include conf/extra/httpd-vhosts.conf를 추가하는 방식으로 이루어집니다.

IP 기반 가상 호스트(IP-based virtual host)
- IDC 또는 전용망 네트워크환경에서 한 1개의 서버장비에 여러개의 IP를 할당받고 IP별로 가상호스트를 사용하는 방법입니다.
- IP추가를 위해 각각의 네트워크 설정 등이 필요합니다.

 
Listen 211.49.89.1:80
 isten 211.49.89.2:80

 <VirtualHost 211.49.89.1:80>
   DocumentRoot /var/www/site1
   ServerName site1.example.com
 </VirtualHost>

 <VirtualHost 211.49.89.2:80>
   DocumentRoot /var/www/site2
   ServerName site2.example.com
 </VirtualHost>
 

포트 기반 가상 호스트(port-based virtual host)
- 포트를 기반으로 가상 호스트를 설정합니다. Listen 포트에 사용할 포트를 여러개 설정한 후 VirtualHost를 해당 포트로 설정하면 됩니다.
- 포트번호를 사용자가 미리알고 사용하여야하는 용도의 서비스에 적합하며, 1개의 장비/회선/IP에 각기 다른 여러개의 포트로 구분하여 사용하는 서비스에 적합합니다.
 
 
Listen 80
 Listen 90

 <VirtualHost 211.49.89.1:80>
   DocumentRoot /var/www/port_80
  ServerName site1.example.com
 </VirtualHost>

 <VirtualHost 211.49.89.1:90>
   DocumentRoot /var/www/port_90
  ServerName site2.example.com
 </VirtualHost>
 

이름 기반 가상 호스트(name-based virtual host)
- 한 장비/IP에 여러개의 도메인 이름을 부여하고 도메인 이름별로 가상 호스트를 사용하는 방법입니다.
- 일반적인 웹호스팅 서비스에 많이 사용되는 방식으로 이름 기반 가상 호스트는 클라이언트 요청시 전송하는 헤더중 Host 헤더정보를 사용하여 가상 호스트 설정에 따라 웹 서비스를 하게 됩니다.
 
  
NameVirtualHost *:80

 <VirtualHost *:80>
  DocumentRoot /var/www/site1
  ServerName id1.codns.com
</VirtualHost>

 <VirtualHost *:80>
  DocumentRoot /var/www/site2
  ServerName id2.codns.com
</VirtualHost>
 
 
기본 가상호스트(default virtual host)
- 기본 가상호스트란 어떤 가상호스트에도 해당하지않은 IP 주소와 포트에 대한 모든 요청을 처리하여 호스트를 띄워주는 것입니다.즉, 지정된 가상호스트가 없을 때 기본적으로 응답에 응할 호스트를 지정해 둔 것이 기본 가상호스트입니다.
- default(기본) 가상호스트의 포트로 와일드카드를 사용하여 어떤 요청도 주서버로 못가도록 만듭니다.
- AliasMatch나 RewriteRule을 사용하여 어떤 요청을 특정 페이지(혹은 스크립트)로 재작성할(rewrite) 수 있습니다.

 
NameVirtualHost *:80

 <VirtualHost _default_:*>
  DocumentRoot /var/www/site
  DocumentRoot /www/default
 </VirtualHost>
 
 
예제에 표기된 항목설명
1. NameVirtualHost 항목 : 만일 서버가 유동아이피를 사용하신다면 "NameVirtualHost *"과 같이 *를 아이피대신 사용하세요. 원래는 "NameVirtualHost 아이피"와 같이 현재 서버의 아이피를 넣어줘야 하지만 유동아이피를 사용하므로 아이피가 바뀔때 마다 이 부분을 수정해 줄 수는 없는 일입니다. "*" 기호는 "모든"이라는 의미를 가지고 있으므로 아이피대신 이 기호를 사용하시면 됩니다.
2. VirtualHost 항목 : 이 부분도 위와 같은 이유로 "*"를 사용하시면 됩니다.
3. ServerName 항목 : 사용할 도메인 주소를 적어 줍니다.
4. ServerAlias 항목 : 이것은 어떤 도메인으로 접속했을 때 홈페이지를 보이도록 할 것인지를 정하는 부분입니다. 즉, 첫번째 가상 호스트에서는 "*.aaa.com"을 지정했으므로 "aaa.com"을 포함한 "xxx.aaa.com" , "yyy.aaa.com" 등 앞에 어떠한 레코드(서브 도메인)를 붙여서 접속하더라도 모두 홈페이지를 보여줍니다.  이와는 다르게 두번째 가상 호스트에서는 "*"기호를 사용하지 않았으므로 이 항목에서 지정한 "bbb.com" , "xxx.bbb.com" , "www.bbb.com"로 접속 했을 때만 홈페이지를 보여줍니다.
5. DocumentRoot 항목 : 각각의 가상 호스트가 갖게될 홈디렉토리의 경로를 적어 줍니다. 윈도우용 아파치의 경우는 "C:\Apache2.2\htdocs\site"형식으로 경로를 작성하며, 리눅스의 경우에는 "/var/www/site"형식으로 작성하시면 됩니다. 

6.모든 설정 완료 후, apache를 기동합니다. 


7.결과 

http://www.kkm.com/session.jsp 호출 시,

https://www.kkm.com/session.jsp 로 호출되는것을 확인할 수 있습니다. 


 




고맙습니다.






728x90
반응형