태그:                     

우분투에 아파치, PHP7, MySQL을 설치하고 SSL을 적용하다보니 할게 많기도 하고, 잘 모르니 하는 것도 어렵고…글로 남겨본다.

1. letsencrypt 인증서 받기

아래의 명령으로 우분투에 letsencrypt 패키지를 설치한다.

sudo apt-get install letsencrypt

이 패키지가 기본 설치프로그램인 경우도 있으므로 이미 설치되어 있을 수도 있다. 패키지 설치 후 아래의 명령으로 원하는 도메인명을 다 추가해서 인증서를 받는다.

sudo letsencrypt certonly --webroot --webroot-path=/var/www/homedir -d sitename.com -d www.sitename.com

프로세스가 진행되면 이메일 주소를 입력하라고 나오는데, 기한이 되면 연락받을 수 있는 메일주소를 입력한다. 그 후 물어보는게 두 가지 있는데, 첫번째에는 Y를 입력해야 인증서가 발급되고, 두번째는 선택사항이라 N을 입력해도 된다.

인증파일은 cert.pem, chain.pem, fullchain.pem, private.pem 파일이며, /etc/letsencrypt/live/서버명 폴더에 저장된다. 이 중 Apache2 서버에서는 cert.pem, chain.pem, privkey.pem 을 사용한다.

2. 아파치 설정하기

vi나 nano 등의 에디터를 이용해서 /etc/apache2/sites-available에 있는 아파치의 설정 파일 중 위에서 인증서를 받은 도메인명에 해당하는 설정에 아래와 같이 https 포트에 해당하는 가상머신을 추가한다.

sudo vi /etc/apache2/sites-available/sitename.com.conf
<virtualhost *:443="">
	#main domain
	ServerName sitename.com
	#additional domain
	ServerAlias www.sitename.com
	#document Root
	DocumentRoot /var/www/sitename/
	#additional setting
	<Directory /var/www/sitename>
		Options FollowSymLinks MultiViews
		AllowOverride All
		require all granted
	</Directory>
	AssignUserID siteuser siteuser
	ErrorLog ${APACHE_LOG_DIR}/sitename.com-error.log
	CustomLog ${APACHE_LOG_DIR}/sitename.com-access.log combined
	Header always set Strict-Transport-Security "max-age=31536000"
	SSLEngine on
	SSLProtocol -all +TLSv1.2 +TLSv1.3
	SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
	SSLHonorCipherOrder on
	SSLCertificateFile "/etc/letsencrypt/live/www.sitename.com/cert.pem"
	SSLCertificateKeyFile "/etc/letsencrypt/live/www.sitename.com/privkey.pem"
	SSLCertificateChainFile "/etc/letsencrypt/live/www.sitename.com/chain.pem"
<virtualhost>

위 설정에서 SSLProtocol -all +TLSv1.2 +TLSv1.3 부분이 TLS 중에서 TLS 1.2와 TLS 1.3만 두고 나머지는 다 서비스 프로토콜에서 제외하는 것이다.

위 설정을 다 적용하기 위해 아파치를 다시 시작한다.

sudo systemctl restart apache2

2024년 9월 6일 추가

아파치를 다시 시작했는데 아래와 같은 에러가 나는 경우 아파치 모듈을 로드하지 않아서 나는 에러이므로 필요한 모듈을 로드한다.

sudo a2enmod ssl

위 명령이 에러없이 정상 실행되면 아파치를 다시 시작한다.


위 설정이 다 적용되면 아래의 링크에서 사이트의 인전도를 검증해본다.

https://www.sslshopper.com/ssl-checker.html#hostname=www.sitename.com

위의 시험항목은 아래 그림처럼 모두 통과해야 된다.

https://www.ssllabs.com/ssltest/analyze.html?d=www.sitename.com

위의 시험항목은 아래 그림처럼 A가 나와야 안전하다 할 수 있다.

만약 아래와 같이 A가 안나오면 보안에 문제가 생길 수 있으므로 필요한 부분을 찾아서 등급을 올릴 필요가 있다.

3. 자동으로 Let’s encrypt 갱신하기

Let’s Encrypt는 무료 SSL 인증서이고, 한 번 발급받으면 90일간 사용할 수 있다. 90일이 지나면 인증서가 파기되기때문에 새로 발급받아야 되는데 기한이 되기 전에 갱신하면 SSL 인증서를 계속 사용할 수 있다. 갱신 명령은 아래와 같이 간단하며, 만기 30일 전부터 가능하다.

letsencrypt renew

잘 기억하고 만기가 되기 전에 갱신을 한다면 문제가 없지만 만약 잊고 기한을 넘기면…

새로 사이트를 등록하고 인증서를 발급받아야 된다. 그래서 리눅스의 스케줄러인 crontab을 이용하면 만기가 되기 전에 갱신을 자동으로 할 수 있다.

우선 아래의 명령으로 스케줄러를 편집할 수 있다.

crontab -e

편집기가 나오면 제일 끝에 아래의 라인을 추가한다.

10 5 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log
15 5 * * 1 /usr/sbin/service apache2 reload

위와같이 하면 매주 월요일 오전 5시 10분에 letsencrypt 갱신을 시도한다. 만약 만기 30일 이내면 갱신에 성공하고, 5시 15분에 아파치를 다시 시작한다. 만기 30일 이내가 아니라면 그냥 건너뛰며, 아파치는 지정한 시각에 재시작한다.

이제 자동으로 갱신이 되고 문제없이 쓸 수 있을 것이다. 만약 갱신이 안되고 만기 30일 이내가 되면 Let’s Encrypt에서 메일이 온다. 그러면 /var/log/le-renew.log 파일을 보면 시도한 내역과 결과가 저장되니까 잘 확인하고 그에 맞는 처리를 하면 된다.

Apache에 SSL 설정하기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다