Operation/Network

Docker Apache에 HTTPS(SSL) 적용하기 [+HTTP, HTTPS 간 쿠키 전송안될 때]

JaeHoney 2022. 3. 2. 22:21

상황

로컬(Docker)에 올린 기존 시스템에서 다른 API(다른 도메인)로 Request 시 withCredential을 true로 설정해줘야 함

 

이후, 요청은 성공을 했지만 Cookie(세션 정보)가 전달이 안되는 현상이 발생했음.

 

로컬에 올린 시스템은 HTTP고 요청을 받는 API는 HTTPS이기 때문에 발생

-> 규정 변경으로 HTTP, HTTPS 간 통신은 쿠키를 전송할 수 없음 (원래는 HTTPS -> HTTP만 안됬음)

 

따라서, 로컬의 Apache에 인증서를 설치해줘야 했음.

소개

이번 포스팅에서 사용하는 방법은 자가 서명된 인증서를 발급해서 사용하기 때문에 도메인으로 등록하지 않아도 상관없고, 로컬(개발) 환경이어도 상관없습니다.


<참고> 컨테이너를 생성할 때도 포트를 HTTP, HTTPS 두 개 열어주는 것이 유용합니다.

-> 저는 컨테이너 내부의 80포트를 4080으로, 컨테이너 내부의 443포트를 4081로 열었습니다.

docker run --name booking_local -d -p 4080:80 -p 4081:443 -v /users/booking:/www booking:legacy

 

해결 방법


0(준비). Docker desktop을 이용해서 컨테이너에 CLI로 접속


1. openSSL을 이용해서 인증서를 만듬.

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/booking.key -out /etc/ssl/certs/booking.crt


2. 설정 값 입력
→ State, Locality name 등은 대충 입력해도 되는데, Common Name은 도메인 이름 또는 ip를 입력해주셔야 합니다.

(저는 hosts파일을 통해 로컬(127.0.0.1)을 booking.lavel.com이라는 도메인 네임으로 사용하고 있습니다.)

Country Name (2 letter code) [XX]:KR
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example 
Organization Name (eg, company) [Default Company Ltd]:Example
Organizational Unit Name (eg, section) []:Example
Common Name (eg, your name or your server's hostname) []:booking.lavel.com
Email Address []:webmaster@example.com


3. apache config 설정

vi /etc/apache2/sites-enabled/booking.conf

 

기존의 conf파일은 아래와 같습니다.

<VirtualHost *:80>
    DocumentRoot /www
    AllowEncodedSlashes On
    
    RewriteEngine on
    
    RewriteCond %{REQUEST_URI} ^(/health)$
    RewriteRule ^/(.*)$ /index.php/$1 [L]
    
    RewriteCond %{REQUEST_URI} ^(/booking/static/)(.*)$
    RewriteRule ^/booking/(.*)$ /$1 [L]
    
    RewriteCond %{REQUEST_URI} ^(/booking/assets/)(.*)$
    RewriteRule ^/booking/(.*)$ /$1 [L]
    
    RewriteCond %{REQUEST_URI} ^/([^/]*)(/booking/){1}.*$
    RewriteRule ^/([^/]*)/(.*)$ /index.php/$2 [L]
    
    SetEnv CI_ENV dev
</VirtualHost>

 

(같은 파일) 원래 있던 80번 포트 내용 그대로 443번 포트도 똑같이 열어주고, 아까 만들었던 SSL인증서를 적용합니다..!

+ ssl을 생성할 때 입력했던 domain을 ServerName으로 설정해야 합니다.

<VirtualHost *:443>
    DocumentRoot /www
    AllowEncodedSlashes On
    
    RewriteEngine on
    
    RewriteCond %{REQUEST_URI} ^(/health)$
    RewriteRule ^/(.*)$ /index.php/$1 [L]
    
    RewriteCond %{REQUEST_URI} ^(/booking/static/)(.*)$
    RewriteRule ^/booking/(.*)$ /$1 [L]
    
    RewriteCond %{REQUEST_URI} ^(/booking/assets/)(.*)$
    RewriteRule ^/booking/(.*)$ /$1 [L]
    
    RewriteCond %{REQUEST_URI} ^/([^/]*)(/booking/){1}.*$
    RewriteRule ^/([^/]*)/(.*)$ /index.php/$2 [L]
    
    SetEnv CI_ENV dev
    
    ServerName booking.lavel.com
    
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/booking.crt
    SSLCertificateKeyFile /etc/ssl/private/booking.key
</VirtualHost>


4. 아파치 재시작

apachectl graceful

 

이제 https(저의 경우: https://booking.lavel.com:4081/)로 접속하면 HTTPS 인증서가 적용되어 있고, HTTPS를 사용하는 다른 API에게 쿠키를 전송할 수 있습니다 !

 

감사합니다.