2018.09.27 21:00

스쿨호스팅 VPS에 comodo SSL 보안 인증서 설치하기

시작은 페이스북 소셜로그인(OAuth)이었다.
작년에 API를 이용해서 소셜로그인을 연동했었는데 이번에 페이스북 다른 계정에 개발자 등록을 하려고 보니 정책이 바뀌어서 이제는 https가 아니면 로그인 지원을 해주지 않는다고 한다. 회원가입을 받는 사이트에서 SSL/TLS 적용을 하지 않은 것이 늘 찜찜했는데 이번에 보안서버로 바꿔 보기로 했다. 검색엔진이 보안서버의 페이지에 점수를 더 높게 준다는 이야기도 있어서 더이상 미룰 이유가 없었다.


기왕이면 무료 SSL를 설치하고 싶어 알아보니 openssl(mod_ssl)과 Let's encrypt 이야기가 많다. openssl은 리눅스에 기본으로 설치 된 경우가 많고 Let's encrypt는 Python2.7 이상으로 업그레이드 해야하고 git이나 기타 필요한 부속 프로그램들 설치와 업그레이드가 필요하다. 블로그에 워낙 상세하게 설명 되어있지만 서버 초보자들에겐 어려울 수 밖에 없다.


며칠을 고생했지만 결국 둘 다 실패했다. 유료 서비스를 받으며 너무 간단하게 그 실패 원인을 알게 됐지만 어차피 유료 서비스 신청을 하지 않았다면 나는 아직도 헤매고 있을 것이 분명했다. 실패 원인과 해결책은 마지막에 설명이 될 것이다.


모르면, 안 되면 돈 주고 하자!

필자는 PHPs.kr의 VPS(가상호스트)를 이용하고 있다. 월5천원 정도의 저렴한 가격이기도 한데다 내 마음대로 계정을 만들어 여러 홈페이지를 구동 할 수 있고 웹 개발자에겐 테스트 용도로도 아주 좋다. VPS를 사용하기 위해서는 아무래도 기초적인 서버 지식은 있어야 한다.


<2018. 09. 27 현재 가격>

SSL 보안인증서의 가격은 업체와 상품 종류에 따라 종류가 다양한다. 암호화 수준이나 사용 기간, 사용할 도메인 수(Sub domain) 정도에 따라 가격이 정해지는 게 보통이다. 단일 도메인에 기초적인 암호화 수준을 원한다면 가장 저렴한 것을 선택하는 것도 좋다. 


여담이지만 처음엔 무료 인증서도 있는데 왜 돈을 받는가 싶었는데 공부를 하다보니 이건 정확히 인증서의 가격이라기 보다 공인 된 보안 업체에서-CA- 그 인증서가 신뢰할만하다고 보증해주는 비용이라고 보는 게 더 맞는 거 같다. 변호사 공증비용 같은 거라고 보면 될 거 같다. Let's encrypt같은 기관에서 무료로 인증서를 보증해 주는 건 보안서버의 확산을 위해 공익차원에서 해주는 것이라고 보면 된다. 점유율은 아직 높지 않지만 https가 앞으로 더 보편화 되면 개인과 중소업체 사용자들이 더 늘어 날 것이라고 생각한다.


[선청하기] 화면이다. VPS나 웹호스팅을 사용 중이라면 설치비가 면제다. 이정도 가격이면 개인 홈페이지에도 부담 없이 설치 할 수 있는 정도가 아닌가 싶다. 1만원대로 이보다 더 저렴한 업체도 있지만 고객센터의 의 만족도를 알 수 없기에 초보라면 사람들이 많이 이용하는 곳에 좋을 거 같다.

CSR정보는 자체적으로 생성 할 수도 있고 타 업체의 것을 사용해도 되지만 빈칸으로 두면 PHPs에서 알아서 생성하고 메일로 인증서를 보내준다.

인증메일은 도메인의 실소유주가 맞는지 확인하는 절차에서 필요하다. 아래 나열 된 이메일을 사용해도 되지만 일반적으로 whois로 확인 했을 때 등록 된 이메일이 가장 좋다.

whois로 도메인 정보를 보면 중간 쯤에 메일 주소가 있다. 내가 도메인 등록 할 때 사용한 메일이다. 이 메일로 인증 받는 게 가장 확실하다.

신청서를 제출하고 잠시 기다려야 한다. 인증서 발급까지 1 ~ 3일 정도 소용 된다고 하는데 필자는 30분 정도 걸린 거 같다. 인증서가 메일로 발송 되면 SMS로 알림이 온다.

나의 서비스 관리 > SSL 관리 페이지를 보면 인증서 발행 과정을 확인 할 수 있다.






이 도메인이 너의 도메인이 맞느냐?



PHPs에서 인증서 신청서를 제출하고 잠시 후에 메일이 온다. 이메일을 이용해 도메인 소유자가 맞는지 확인하는 절차이다.

녹색으로 된 here를 클릭하면 새 창이 열린다. 아래 Ztdlg....Moet로 된 조합키를 복사해서 붙여넣기 하면 된다.

이메일로 받은 인증키를 입력하고 [Next>]를 클릭하면 도메인 확인 절차가 끝난다.


이제 인증서가 도착 할 때까지 잠시만 기다려야 한다.



인증서 메일이 도착했다는 SMS를 받았지만 인증서가 없을 때 스팸편지함을 뒤져보자!


<스팸편지함으로 도착한 인증서>

스팸 필터 강도를 높게하면 영어가 많은 이메일은 스팸함으로 들어가기 일수다. 잘 확인해 보자.



인증서는 압축메일로 첨부되며 압축파일에는 네 종류의 인증서 파일이 있다.

<압축파일 내용>




------------------- 절취선 -----------------

지금까지는 스쿨호스팅에서 인증서 신청하고 발급받는 과정이었다. SSL 인증 방식이 3종류가 된다고 하는데 위의 방법은 DV: Domain-Validated(도메인 인증) 방식으로 간단하고 가격이 저렴해 많은 사람들이 이용한다고 한다. 자세한 내용은 https://blog.naver.com/securedream_ssl/221024649792 참조


아래 부터는 서버 설정 부분이다. 사실상 openssl(mod_ssl)나 Let's encrypt로 인증서 발급까지 받는데 성공했다면 아래 설정 부분이 제일 중요하다고 할 수 있다. 개념만 이해하면 쉽지만 본인처럼 평소 자주해보던 게 아니면 알면서도 헷갈려 고생하게 된다.


인증서 파일은 서버로 업로드 해야한다.

필자는 FTP를 이용해서 홈페이지 파일이 있는 폴더에 "ssl"을 하나 만들어 그곳에 모아 두었다. 나중에 apache 설정파일(.conf)에서 인증서를 참조할 때 경로만 잘 입력하면 되기 때문에 인증서의 위치는 어떤 곳이든 좋긴하다. 그러나 index.php(.html) 파일이 있는 곳은 피해야 한다.


만약 index.php 파일이 /home/mysite/www/ 이 폴더에 있다면 /home/mysite/ssl/ 이렇게 httpd가 접근하지 않는 폴더에 옮겨 두는 것이 좋다.


이제 아파치 환경설정만 해주면 된다.



]# ps -ef | grep httpd

]# netstat -nap | grep httpd

아파치 데몬과 80번 포트가 열려 있는지 확인 해 본다.



파일이 어디에 있는지 모르겠다면 find 하자!


간혹 서버마다 파일 위치가 달라서 애먹을 때가 있다. 블로그 포스팅들이 참 친절하게 설명하고 있지만 왜 내 서버에는 그 파일이 없는가 한참 헤맬 때가 있다.

]# find / -name mod_ssl.so

서버 Root 디렉토리부터 mod_ssl.so라는 이름을 갖은 파일을 찾겠다는 명령이다. ssl 모듈 파일이 위치한 경로를 알아야 하고 아래 설명처럼 이것을 아파치 환경설정 파일에서 불러와야 한다.


]# vi /etc/httpd/conf/httpd.conf

아파치 기본 설정파일은 httpd.conf다. 이 파일이 어디에 있는지 모른다면 find 명령으로 찾자.

include conf.d/*.conf에 주석(#)이 있다면 제거하자. conf.d/ 폴더에 있는 확장자가 .conf로 된 설정 파일을 모두 포함하겠다는 의미다.

VirtualHost을 설정하는 파일에서 Redirect하는 설정을 포함해야 한다. http://로 접속해도 https://로 전환 시켜야 하기 때문이다. "Redirect / https://나의 도메인"을 추가하자.



80번 포트를 이용하는 http 프로토콜 설정은 끝났고 이젠 443번 포토를 이용하는 https 프로토콜 설정을 해야 한다.


필자는 보안서버의 가상호스트 설정 파일을 httpd-ssl.conf로 만들었지만 다른 포스팅에서는 ssl.conf로 한 것도 있다. 이름은 상관이 없다. include 명령을 통해 conf.d/*.conf 파일은 모두 httpd.conf에 포함 된다.


]# vi /etc/httpd/conf.d/httpd-ssl.conf

#---------------------------------------------------------------------------------------------------------------

LoadModule ssl_module /usr/lib**/httpd/modules/mod_ssl.so

# ssl을 구동하기 위해서는 모안 보듈이 필요하다. find로 찾아낸 mod_ssl.so의 위치를 정확하게 작성해야 한다.


# the HTTPS port in addition.

Listen 443


#SSLPassPhraseDialog builtin

#개인키 암호를 입력 받도록 하는 설정을 주석처리 한다.


NameVirtualHost *:443


<VirtualHost *:443>

    DocumentRoot "/home/yourid/www"

    ServerName wonjustory.com:443


    ServerAdmin zib***@daum.net


    SSLEngine on

    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL


    SSLCertificateFile /home/yourid/ssl/www.wonjustory.com.crt

    SSLCertificateKeyFile /home/yourid/ssl/www.wonjustory.com.key

    SSLCertificateChainFile /home/yourid/ssl/wwwwonjustorycom_ChainBundle.crt

    SSLCACertificateFile /home/yourid/ssl/ADDTRUST_EXTERNAL_CA_ROOT.crt



    <FilesMatch "\.(cgi|shtml|phtml|php)$">

        SSLOptions +StdEnvVars

    </FilesMatch>

    <Directory "/var/www/cgi-bin">

        SSLOptions +StdEnvVars

    </Directory>


    BrowserMatch ".*MSIE.*" \

        nokeepalive ssl-unclean-shutdown \

        downgrade-1.0 force-response-1.0

</VirtualHost>

#-----------------------------------------------------------------------------------------------------------------

yourid : 서버상에서 실제로 홈페이지 파일이 있는 경로. (리눅스의 사용자 아이디)


인증서 경로를 입력 할 때 SSLCertificateChainFile /home/yourid/ssl/wwwwonjustorycom_ChainBundle.crt 이 부분을 주의하자. 도메인으로 된 파일명에 점(.)이 없고 언더바(_)가 있다. 오타 나기가 쉽다.


아파치에서는 확장자(.crt, .key, .pem 등)은 파일 형식이 맞다면 상관 없다고 한다. 테스트 해보진 않았다면 cat으로 보면 모두 Text 파일로 되어 있다.


여기까지 서버 설정해야 될 부분은 끝났다.

이제 443번 포트를 열고 방화벽 부분을 처리해야 한다.


]# service iptables stop

일단 방화벽을 끈다. CentOS6.x 버전은 iptables이고 CentOS7.x 버전은 firewalld 데몬을 끄면 된다. 필자가 Let's encrypt 설치를 계속 실패했던 부분이 여기 이기도 하다. 방화벽에 막혀 443번 포트가 제대로 열리지 않았었다.


]# cat /etc/sysconfig/iptables

#-----------------------------------------------------------------------------------------------------------

# Firewall configuration written by system-config-firewall

# Manual customization of this file is not recommended.

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

# 443번 포트는 80번 포트를 열고 이어서 바로 뒤에 열리게 한다. ★


-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j REJECT --reject-with icmp-host-prohibited


COMMIT

#-----------------------------------------------------------------------------------------------------------


]# service iptables start

이제 방화벽을 다시 시작한다.


]# /usr/sbin/apachectl configtest

Syntax OK가 나오면 아파치 설정 파일에 문법상 문제가 없다는 뜻이다. apachectl 파일의 위치는 서버마다 다를 수 있으니 모를 때는 find로 찾으면 되고 없을 때는 apache, 혹은 apache2일 수도 있다.


]# service httpd restart

아파치 데몬을 다시 실행한다.


]# netstat -nap | grep httpd

포트가 제대로 열려 있는지 네트워크 상태를 확인한다.

443번 포트가 열려 있다면 이제 서비스 할 준비가 되어 있다.


크롬 브라우저에서 홈페이지 접속해 보면 열쇠 모양이 보이고 "주의 요망"이란 글자가 보이지 않는다.



Tip.

]# curl -l -v "https://wonjustory.com"

만약 외부에서 접속은 잘 안 되는데 로컬에서는 제대로 작동하고 있는지 확인하고자 할 때는 서버에서 위의 명령으로 웹페이지를 읽어 올 수 있다. index.*** (php, html 등) 파일이 읽혀지면 로컬에서는 서버가 정상 작동하고 있는 것이다. 이때 방화벽 등을 살펴보는 게 좋다.


        

Trackback 0 Comment 0