2018.09.28 18:22

무료 보안서버 인증서를 제공하는 Let's encrypt 설치하기

설치환경 : CentOS6.x , Apache2.x



요즘 보안 이슈가 계속 들려온다. 크롬 브라우저의 경우에는 https로 접속하지 않는 사이트에는 "주의 요함"이라는 문구를 주소 옆에 보여주면서 사용자들에게 안전하지 않은 사이트에 대한 경각심을 주기도 한다. http로 접속하는 사이트라고 해서 모두 보안에 취약한 건 아니지만 앞으로 추세가 보안서버를 적용하는 것이니 미리 해두면 좋을 거 같다.


우분투에 설치하는 블로그 포스팅은 워낙 많으니 웹호스팅을 받거나 실무자들 주로 사용하는 CentOS만을 기준으로 설명하기로 한다.


SSL 인증서를 생성하기 위해서는 몇 가지 서버 프로그램이 필요하다.

CentOS의 경우 rpm이나 yum을 이용해서 쉽게 프로그램을 설치 할 수 있다.


◇1 프로그램을 설치할 디렉토리로 이동한다.

]# cd /usr/local


◇2 패키지 관리를 위한 EPEL(Extra Packages for Enterprise Linux)을 설치한다.

]# yum repolist

위의 명령으로 EPEL 설치가 되었는지 확인하고 설치가 돼 있으면 이 단계는 넘어가자.


◇3 CentOS6.x 사용자는 Python2.6.x가 설치 돼 있다. 2.7.x 버전을 설치한다.

    Python2.7.x를 설치 했다고 2.6.x 버전이 지워지는 건 아니다. 두 개 버전이 함께 서버에 설치 된다. 윈도우 사용에 익숙하지 않은 부분이다.


]# python -V

위의 명령으로 Python 버전을 확인해 보고 만약 2.7.x 버전이 설치 돼 있다면 이 단계는 생략하고 ◇4번으로 넘어가자.


]# rpm ivh https://rhel6.iuscommunity.org/ius-release.rpm


]# yum install git python27 python27-devel python27-pip python27-setuptools python27-virtualenv python27-libs

위의 명령으로 Python2.7.x 버전을 설치한다. :: python3.6까지 있다는데 왜 2.7을 설치해야하는지는 명확하게 모르겠다. letsencrypt 인증 프로그램이 python2.7로 만들어 해당 버전에 문제 없이 작동한다는 포스팅을 본 적이 있다. 테스트를 해보지 않았으니 상위버전을 설치해서 진행해 보고 결과를 다시 포스팅 해주어 좋을 거 같다.


Python 설치하는 시간이 조금 걸린다. 파일을 복사해 올 수 있는 Git도 함께 설치 되었다.


◇4 다음은 인증서를 생성할 수 있는 프로그램 설치를 해야한다.

]# wget https://dl.eff.org/certbot-auto



Certbot-auto 프로그램을 설치하는 방법은 다양하다. 만약 위의 명령으로 설치가 되지 않는다면 다른 블로그 등을 참조해서 설치해 보자. 설치하려는 파일이 위치한 경로가 맞지 않아 오류가 생기기도 한다.

Git, wget, yum은 내부적으로 방식은 다르지만 해당 경로에 있는 파일을 복사해 오기도 하고 그것이 설치가능한 패키지 파일이면 자동으로 내 서버에 설치하는 일을 한다. 인터넷 익스플로러의 파일 내려받기와 비슷하다.


]# ll

파일 목록을 보면 certbot-auto 파일이 생겼다. 이 프로그램이 인증서를 생성하고 발행 할 수 있는 프로그램이다. 간혹 파일명이 letsencrypt로 되어 있거나 certbot, letsencrypt-auto 등으로 돼 있는 것도 있는데 파일명은 중요하지 않다.



다음 단계로 넘어가기 전에 준비가 잘 되었는지 다시 점검해보자!

◇5 파이선 버전 확인

]# python -V

만약 2.6.x으로 나온다면 위의 명령으로 python2.7.x가 제대로 설치되지 않았거나 python 심볼릭 링크가 여전이 2.6.x 버전으로 연결 되어 있다는 것이다.


]# find / -name Python2.7*

Pythone2.7.x 버전이 어디에 설치 됐는지 찾아보자. 리눅스 명령에서는 항상 대소문자를 주의해야 한다.



◇6 설치 정보를 찾지 못했다면 수동으로 다시 설치해 보자. Python2.7.x가 제대로 설치 돼 있다면 이 단계는 넘어가고 ◇8번으로 가자.

]# wget --no-check-certificate N http://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz

Python-2.7.12 버전의 압축 파일을 다운로드한다. 현재 위치는 /usr/local이다.


]# tar xzf Python-2.7.12.tgz

현재 위치에 압축파일을 푼다.

압축은 풀면 Pythone-2.7.12 폴더가 생겼다. 압축파일 Pythone-2.7.12.tgz는 필요 없으니 삭제해도 된다.


]# cd Python-2.7.12


]# ./configure


]# make


]# make altinstall

설치 작업은 약 5분 정도 필요하다.


◇7 다시 버전 확인을 해보자.

]# /usr/bin/python -V

여전히 Python 2.6.6 버전으로 나온다면 python 심볼릭 링크를 바꿔줘야 한다.


◇8 python 명령의 심볼릭 링크를 새 버전으로 변경한다.

]# cd /usr/bin


]# ll


]# rm -rf /usr/bin/python


]# ln s /usr/local/Python-2.7.12/python /usr/bin/python

ln s [원본 파일 경로] [심볼릭 링크 이름]


]# python -V



◇9 버전확인이 되었다면 Python을 위한 패키지 몇 개를 더 설치해야 한다. (필자가 Python 전문가가 아니라서 왜 필요한지는 자세히 설명할 수 없어 일단 설치 방법만 설명하기로 한다)



위에 Python2.7.12 설치하고 심볼릭 링크를 바꾸면서 디렉토리 이동을 했기 때문에 다시 프로그램 설치하던 위치로 돌아온다.

]# cd /usr/local


Setuptool 설치에 필요한 파일 다운로드

]# wget http://peak.telecommunity.com/dist/ez_setup.py

파이선 실행

]# python ez_setup.py


PIP 다운로드

]# wget https://bootstrap.pypa.io/get-pip.py

파이선 실행

]# python get-pip.py


]# pip install virtualenv




지금까지 인증서를 생성하고 발행할 준비 작업이었다. 이제 본격적으로 인증서를 생성하고 웹서버에 적용해 보면 된다. 복잡한 거 같지만 리눅스에서 필요한 기본 프로그램이 Python을 설치한 것이 전부였다. 그나마도 CentOS7.x 이상 사용자는 상위 버전이 기본으로 설치 돼 있기 때문에 이 단계를 생략할 수 있다.


이제부터 인증서를 생성하고 발급 받아 아파치 서버에 적용하는 작업이 남았다. 이 후부터 과정을 미리 알고 싶다면 https://ziumb.tistory.com/100 잠깐 이 블로그를 읽어보자. 스쿨호스팅에서 유료 인증서를 구입하고 적용했던 사례를 포스팅했다. 인증서를 메일로 받은 뒤에 실제로 서버에 적용하는 과정이다. 미리 눈에 익혀두면 아래 설명 되는 과정이 조금 편할 거 같다.



이제 준비는 끝났다! 인증서를 생성하고 아파치에 적용하면 된다.




◇10 인증서를 생성하자!

]# ./certbot-auto certonly --webroot --webroot-path=/home/USERID/www -d ziumsoft.com -d www.ziumsoft.com

옵션 설명

-d 도메인 : 인증서를 적용할 도메인이다. 100개까지 입력가능하며 최근에는 와일드카드를 지원한다고 한다. 하지만 위의 명령에서 와일드카드를 사용하면 오류가 생긴다. (*)와일드카드 사용 방법은 다음 기회에...

--webroot : 웹 인증을 받겠다는 뜻이다.

--webroot-path  : 익덱스 파일(index.php, html 등)이 있는 절대경로를 입력한다. 인증받을 도메인과 연결되는 디렉토리이며 경로는 정확해야 한다.

정상적으로 인증서가 생성되면 축하한다는 안내와 인증서의 위치를 알려준다. 인증서는 /etc/letsencrypt/live/도메인/ 안에 있다.


이제 인증서를 적용하면 된다. 인증서 적용의 자세한 설명은 https://ziumb.tistory.com/100 이곳에서 인증서 파일을 서버로 업로드하는 단계 이후부터 똑같다고 보면 된다.





◇11 이제 인증서가 생성 됐으니 내 서버에 적용해야 한다.

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

443번 포트를 이용하는 가상호스트 설정을 위한 환경파일이다. 파일 이름은 ssl.conf로 해도 되고 httpd-ssl.conf로 해도 상관 없다. 어차피 httpd.conf에서 모든 설정 파일을 포함하게 된다.

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

SSLEngine on

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


SSLCertificateFile /etc/letsencrypt/live/ziumsoft.com/cert.pem

SSLCertificateKeyFile /etc/letsencrypt/live/ziumsoft.com/privkey.pem

SSLCertificateChainFile /etc/letsencrypt/live/ziumsoft.com/chain.pem

#---------------------------------------------------------------------------------------------------------
인증서의 절대경로는 오탈자 없도록 주의해야 한다.

여기까지 했다면 이제 설정파일에 오류가 없는지 검사합니다.
]# /usr/sbin/apachectl configtest

Syntax OK가 나오면 일단 설정 파일에서 문장 오류는 없다는 의미다. 위에 다른 포스팅에 설명했지만 아파치 실행 파일은 apachectl이거나 apache2, apache로 되어 있으며 이름은 상관 없다. 서버마다 파일을 위치는 다를 수 있으니 find로 찾으면 된다.


◇12 아파치 설정에 문제가 없다면 httpd 데몬을 다시 실행한다.

]# service httpd restart





다음은 443 포트를 열어주는 작업을 해야한다.

]# service iptables stop

일단 방화벽을 끈다. CentOS6.x 버전은 iptables이고 CentOS7.x 버전은 firewalld 데몬을 끄면 된다.


]# 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




크롬으로 접속해보면 열쇠모양 아이콘이 생긴다. 이 포스팅에는 생략 됐지만 80번 포트로 연결되도록 가상호스트 설정한 환경파일을 열어서 https로 리다이렉션 시켜야 한다.




인증서 자동 갱신이 되도록 해야 한다!

Let's encrypt는 무료이긴 하지만 인증서 유효 기간이 3개월로 짧다. 따라서 인증서가 만료되기 전에 자동으로 갱신하도록 하는 게 좋다.


일단 --dry-run 옵션으로 갱신 테스트를 해본다.

]# ./certbot-auto renew --dry-run

인증서 갱신 작업에는 이상이 없다.  그리고 아직 인증서를 갱신할 기간이 아니라는 안내가 나온다.


테스트 옵션을(--dry-run)을 빼고 실제로 인증서 갱신을 진행해 본다.

]# ./certbot-auto renew

/var/log/letsencrypt/letsencrypt.log 이 파일에 로그 기록이 됐으며 인증서 갱신 작업을 하지 못했다고 한다. 그리고 아래에 인증서를 갱신할 때가 아니라는 안내가 나온다.


Let's encrypt의 인증서 갱신은 갱신 종료 1개월 안에 할 수 있다. 2018-12-27일이 인증서 만료일이니 2018-11-28일부터 인증서 갱신이 가능하다.




□ 인증서 자동갱신

인증서 자동 갱신은 crontab 명령을 이용한다. 특정 기간에 명령이나 파일을 실행한다. 자세한 내용은 https://blog.naver.com/mymizze/221359204798 이곳에 설명 돼 있다.

]# crontab -e

crontab -e를 실행하면 vi 편집기처럼 crontab 편집기가 열린다. 주석은 #이며 차례대로 실행할 명령이나 파일 경로를 작성한다.


0 1 1 12,3,6,9 * /usr/local/certbot-auto renew >>/var/log/letsencrypt/letsencrypt.log

12월,3월,6월,9월 1일 1시 0분에 인증서 갱신을 실행하겠다는 뜻이다.


15 1 1 12,3,6,9 *  service httpd restart

인증서는 1시 0분에 갱신하고 httpd 데몬은 15분에 재실행 하도록 했다. 15분 차이를 둔 이유는 인증서가 갱신되는 시간이 필요하기 때문이다.

이렇게 하면 새 인증서가 서버에 반영된다.



다른 포스팅에 보면 매주 실행하게 설정한 사람도 있는데 어차피 인증서 만료 기간이 1달이 넘게 남았다면 실행 오류가 생기고 내용은 위의 log 파일에 저장 된다. 너무 자주 실행하면 log 파일이 너무 커져 서버 용량을 차지하게 되고 서버를 너무 자주 재 실행하는 것도 그리 바람직하지 않다.

        

Trackback 0 Comment 0