[Ubuntu 20.04] 수동 컴파일로 설치한 apache 서버에 SSL 인증서 적용하기

박서현·2021년 5월 29일
1

서버를 처음 공부하는 과정에서, 자동설치가 아닌 컴파일러 수동 설치한 아파치 서버에 https를 적용해야 할 일이 생겼다. 구글링을 열심히했는데도 헤메다가 성공하는데 일주일이나 걸려서 정리해서 남겨놓고자 한다.

도메인 발급받기

서버에 https를 적용하기 위해서는 도메인이 필요하다. 도메인을 무료로 얻을 수 있는 사이트들이 많으니 그곳에서 무료 도메인을 발급받아도 되고, '카페24'같은 사이트에서 도메인을 구매할 수도 있다.
나는 '카페24'에서 550원을 주고 도메인을 하나 구매했다.

https://hosting.cafe24.com/

위 사이트에 들어가서 원하는 도메인명을 입력하면 구매 가능한 도메인 명들이 나온다.

가격이 44,000원으로 꽤 많이 비싼 것을 볼 수 있다. 나는 marketcolly.shop 을 구매했는데, 이벤트 중이어서 1년에 550원의 가격으로 구매할 수 있었다.

도메인을 구매한 후, '나의서비스관리'에 들어간다.

옆에 메뉴에서 '도메인관리' -> 'DNS 관리'를 클릭한다.
자신이 구매한 도메인을 선택하고 'DNS 관리' 버튼 클릭.

'호스트IP 관리'를 선택하고, 'A레코드 추가'버튼을 클릭해서 위 사진처럼 구매한 도메인명과 www.이 붙은 도메인명에 IP를 설정해준다.

어떤 IP를 입력해야하지?
지금부터는 포트포워딩이 필요하다.
자신이 만든 서버는 대부분 자신의 노트북에 있을텐데, (나의 경우는 노트북에 VirtualBox를 설치하고, 그 안에 우분투 리눅스를 설치했다.) 아마 자신이 만든 홈페이지를 자신의 컴퓨터가 아닌, 다른 컴퓨터로 들어가려고 하면 들어갈 수 없을 것이다. 이 때 포트포워딩 이란 것을 설정하면, 자신의 공인IP를 입력했을 때 자신의 홈페이지로 들어오도록 할 수 있다.

자신의 노트북에서 크롬을 열어 주소창에 http://192.168.0.1 를 입력하고 들어가면,

위 화면이 나온다.(연결된 와이파이 공유기가 iptime인 경우에만 해당. 다른 와이파이 공유기는 검색해서 관리페이지 들어가는 법을 알아보시길...) 특별히 설정하지 않았다면 초기 로그인 이름은 admin이고, 로그인 암호 역시 admin이다. 로그인하고 들어간다.

'관리도구' 클릭

들어가면 현재 자신의 노트북이 연결된 iptime 와이파이의 외부 IP 주소가 보인다.
이 창을 닫지 말고 새 창을 열고 네이버에 들어가서 '내 ip 주소 확인'을 검색한 후, 자신의 공인IP 주소를 확인하자.

네이버에서 보이는 자신의 IP주소가 아까 확인한 와이파이의 외부 IP주소와 같으면 성공이다!
(간혹 와이파이 외부IP주소와 네이버에서 확인한 자신의 공인IP주소가 일치하지 않는 경우가 있다. 이런 경우에는 인증서 발급이 안된다ㅠㅠ 근처 카페에 가서 와이파이 연결 후 되는지 확인해보자...)

왼쪽 메뉴에서 '고급설정' -> 'NAT/라우터 관리' -> '포트포워드 설정'을 클릭하고, 위에 보이는 사진처럼, 설정한 후 '적용'버튼 클릭.

포트포워딩이 적용된 것을 확인할 수 있다.
이렇게 설정해 놓으면, 외부 컴퓨터에서 주소창에 와이파이 외부IP를 입력했을 때, 자동으로 내 컴퓨터로 이어져 들어올 수 있다.

다음으로 넘어가기 전,
포트포워드 설정된 내부IP를 복사해두자!!!

이제 내 VirtualBox 속 서버와 내 컴퓨터 사이의 포트포워딩을 설정해보자.

VirtualBox를 열고, 설정 클릭

'네트워크' -> NAT 설정 확인 -> '고급' -> '포트포워딩' 클릭

오른쪽 상단에 규칙 추가 버튼을 눌러서 위 사진처럼 포트포워딩 규칙을 2개 설정해준다. 호스트 IP에는 아까 복사한 IP 주소를 입력하고, 게스트 IP에는 VirtualBox 내의 내 서버 ip를 입력하면 되는데, 특별히 설정을 건드리지 않았으면 10.0.2.15로 되어있다.

혹시 게스트 IP를 확인하고 싶은 사람은 리눅스 터미널에 들어가서 hostname -I 를 입력하면 확인할 수 있다.

여기까지 왔으면, 필요한 포트포워딩 설정은 끝났다.
다시 카페24로 돌아가보자.

'DNS 관리' -> '호스트 IP 관리' 에서 위 사진처럼 2개의 도메인(구매한 기본 도메인명과, 앞에 www.을 붙인 도메인명)을 설정해주는데, 이 때 IP는 2개 모두 아까 네이버에서 확인한 공인IP로 입력해준다.

이제 도메인 설정은 끝났다. 이제 크롬 주소창에 자신의 도메인명을 입력했을 때 자신의 홈페이지가 나오면 성공이다!

SSL 인증서 발급받기

나는 certbot을 이용하여 인증서를 발급받아 https를 적용했다.
아래 링크를 누르면 설치 방법과 사용법을 알 수 있다.
(설치 환경이 Apache와 Ubuntu가 아닌 경우에도 들어가서 자신의 환경에 맞는 설치 방법을 볼 수 있다.)

https://certbot.eff.org/lets-encrypt/ubuntufocal-apache

  1. 링크에 들어가면 default 탭과 wildcard 탭이 보이는데, 우리는 default 탭을 이용한다. (wildcard는 유료)

  2. 제일 먼저 자신의 Ubuntu에 snapd를 설치해준다. 'install snapd' 버튼을 누르면 설치된다.

  1. sudo snap install core; sudo snap refresh core // 터미널에 실행
  1. 이미 설치된 certbot이 있으면 삭제한다. 혹시 모르니 한번 실행해보자.
    sudo apt-get remove certbot

  1. sudo snap install --classic certbot
    certbot을 설치해준다.

  2. sudo ln -s /snap/bin/certbot /usr/bin/certbot 실행
    ( ln 은 한 파일을 다른 이름으로도 사용하고자 할 때 사용하는 명령어이다.
    ln [원본 파일명] [새로운파일명] 코드를 터미널에 실행하면, 심볼릭 링크를 만들 수 있다. 즉, 원본파일을 새로운파일명으로 불러올 수 있다.)

  1. 아파치를 자동설치한 사람은 sudo certbot --apache 를 실행하면 자동으로 쭉쭉 인증서 발급이 진행된다.
    수동 설치한 사람은 파일 경로가 다르므로 위 코드가 실행되지 않는다ㅠㅠ
    그럴 때는 아래 코드를 사용하자.
    sudo certbot certonly --apache
    여기서 중요한 점은, 위 코드를 실행했을 때 오류가 날 수 있다는 것이다. 그 이유는 certbot이 apachectl의 경로를 찾지 못해서 이므로, 코드 뒤에 -ctl /파일 경로/apachectl 을 추가해준다.
    나의 경우는 /usr/local/apache24/bin/apachectl 였다.
    sudo certbot certonly --apache-ctl /usr/local/apache24/bin/apachectl

  1. 1번(standalone)과 2번(webroot) 중에 선택하라고 나오는데, 2를 입력하고 엔터

  2. 최초 실행 시에는 이메일을 입력하라는 문구가 나온다. 자신의 이메일 주소를 입력하고 엔터. 그러면 영어 설명과 함께 agree하냐는 질문이 나오는데, y 입력 후 엔터. 그 다음으로는 뉴스,캠페인등 소식을 받겠냐는 질문이 나오는데 n 입력 후 엔터.

  1. 자신의 도메인명을 입력하라는 문구가 나온다. www.도메인명 입력 후 엔터

  2. 그 다음에는 자신의 root directory를 입력하라는 안내가 나온다. 자신의 서버 루트 디렉토리를 입력한 후 엔터.
    (나의 경우 /usr/local/apache24/htdocs )

  3. 그러면 인증서가 발급된다. 아래와 같은 텍스트가 나온다면 성공한 것이다!

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at: 
 어쩌구 저쩌구 인증서와 키가 저장된 경로 설명

인증서 적용하기

certbot으로 발급받은 인증서는 /etc/letsencrypt/live/자신의도메인명 디렉토리에 저장되어 있다.
이제 발급받은 인증서를 적용해보자.

먼저 httpd.conf 파일을 열어서 내용을 수정해준다.

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so

위 2개의 모듈의 주석처리를 해제. (앞에 있는 # 지우기)

Include conf/extra/httpd-vhosts.conf
Include conf/extra/httpd-ssl.conf

위 2개의 Include의 주석처리를 해제.

그 다음으로는 Include 해준 httpd-vhost.conf와 httpd-ssl.conf 파일을 수정해준다.
먼저 httpd-vhost.conf 파일을 열어서 내용을 수정해준다.

<VirtualHost *:80>
    ServerAdmin example@naver.com (자신의 이메일 입력)
    DocumentRoot "/usr/local/apache24/htdocs" (자신의 루트 디렉토리 입력)
    ServerName marketcolly.shop (자신의 도메인명 입력)
    ServerAlias www.marketcolly.shop (www.도메인명 입력)
    ErrorLog "logs/자신의도메인명-error_log"
    CustomLog "logs/자신의도메인명-access_log" common
</VirtualHost>

다음으로 httpd-ssl.conf 파일을 열어서 내용을 수정해주자.

<VirtualHost *:443>
	DocumentRoot "/usr/local/apache24/htdocs" (자신의 루트 디렉토리)
	ServerName www.marketcolly.shop:443 (www.자신의 도메인명:443)
	ServerAdmin example@naver.com (자신의 이메일)
	ErrorLog "/자신의 서버루트(나의 경우 /usr/local/apache24)/logs/error_log" 
	TransferLog "/자신의 서버루트/logs/access_log"
    	SSLEngine on
    	SSLCertificateFile "/etc/letsencrypt/live/www.marketcolly.shop/cert.pem" (발급받은 cert.pem의 경로)
    	SSLCertificateKeyFile "/etc/letsencrypt/live/www.marketcolly.shop/privkey.pem" (발급받은 privkey.pem의 경로)
    	SSLCertificateChainFile "/etc/letsencrypt/live/www.marketcolly.shop/chain.pem" (발급받은 chain.pem의 경로)
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
    		SSLOptions +StdEnvVars
	</FilesMatch>
	<Directory "/usr/local/apache24/cgi-bin">
    		SSLOptions +StdEnvVars
	</Directory>
    	BrowserMatch "MSIE [2-5]" \
         	nokeepalive ssl-unclean-shutdown \
         	downgrade-1.0 force-response-1.0
        CustomLog "/usr/local/apache24/logs/ssl_request_log" \
          	  "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

다음으로 hosts파일을 수정해준다.
대부분 경로는 /etc/hosts 이다.

127.0.0.1	www.marketcolly.shop marketcolly.shop << www.자신의 도메인명(띄어쓰기)자신의 도메인명
127.0.1.1	seohyeonpark-VirtualBox

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

localhost를 지우고 대신 자신의 www.도메인명과 도메인명을 입력해준다.

여기까지 수정 후 아파치 서버를 재실행해준다.
sudo systemctl restart apache2

그리고 나서 우분투 파이어폭스에서 'https://www.자신의도메인명' 을 입력하면 인증서가 적용된 자신의 홈페이지가 나오는 것을 확인할 수 있다.

그런데, https:// 를 붙이지 않고 그냥 www.도메인명을 입력하면 http로 홈페이지가 들어가진다. www.도메인명만 입력했을 때에도 자동으로 https로 들어가지도록 rewrite를 설정해보자.

다시 httpd.conf를 열어준다.

LoadModule rewrite_module modules/mod_rewrite.so

위 모듈의 주석을 해제해준다.

그 다음 httpd-vhost.conf 파일을 다시 열어 수정해준다.

<VirtualHost *:80>
    RewriteEngine On << 추가
    RewriteRule ^(.*)$ https://www.자신의 도메인명 [R=301,L] << 추가
    ServerAdmin example@naver.com
    DocumentRoot "/usr/local/apache24/htdocs"
    ServerName marketcolly.shop
    ServerAlias www.marketcolly.shop
    ErrorLog "logs/marketcolly.shop-error_log"
    CustomLog "logs/marketcolly.shop-access_log" common
</VirtualHost>

그 다음 아파치 서버를 재실행해준다.
sudo systemctl restart apache2

이제 다시 파이어폭스에 'www.도메인명'만 입력해보면 자동으로 https로 홈페이지가 연결되는 것을 볼 수 있을 것이다!

profile
차곡차곡 쌓아가기

0개의 댓글