• SSL : Let’s Encrypt 무료 인증서 적용 :: 마이구미
    HTTP 2018. 5. 19. 21:19

    이 글은 SSL 인증서를 무료로 적용할 수 있는 Let's Encrypt 을 다뤄본다.

    웹 사이트를 운영하기에 있어, 필수적인 기능이라고 볼 수 있다.

    실습환경은 Amazon Linux AMI 이다.


    현재 본인도 Github Pages 를 통해 포트폴리오 사이트에 SSL 적용하고 있다.

    Github Page 에서는 다른 서버와 통신을 위해 https 프로토콜을 사용했기 때문이다.

    포트폴리오 사이트 - https://hotehrud.github.io/portfolio-vue



    우선 용어의 개념을 간단히 살펴보자.


    HTTP, HTTPS 의 차이는 무엇인가?


    HTTP와 HTTPS 의 차이는 Secure 로써, 보안이라고 볼 수 있다.

    HTTPS 프로토콜은 전송되는 데이터를 암호화해서 보냄으로써, 데이터 노출의 안전이 보장된다.


    https          http


    위와 같이 주소창에서 쉽게 어떤 프로토콜을 사용하고 있는지 쉽게 알 수 있다.

    대부분의 개인정보가 담긴 페이지들은 대부분 https 를 통해 접근하고있다.


    SSL, HTTPS 는 같다고 보면 되는가?


    개인적으로 간단명료한 문장인 것 같아 생활코딩의 문장을 가져왔다.

    웹이 인터넷 위에서 돌아가는 서비스 중의 하나인 것처럼 HTTPS도 SSL 프로토콜 위에서 돌아가는 프로토콜이다. -생활코딩-




    Let's Encrypt 는 단순히 무료로 SSL 인증서를 발급해주는 단체라고 보면 된다.

    본격적으로 SSL 을 적용하는 방법을 알아보자.


    SSL 인증서 발급



    본인은 Git 을 통해 설치하는 방식을 다룬다. 

    공식 깃헙 저장소를 참고하길 바란다. (https://github.com/certbot/certbot)


    1. letsencrypt 관련 모듈을 /opt/letsencrypt 경로에 설치한다.


    // git clone 을 통해 모듈 내려받기

    git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt


    // 폴더 이동

    cd /opt/letsencrypt


    설치한 경로인 /opt/letsencrypt 디렉토리를 확인하면 다음과 같이 설치되었을 것이다.


    letsencrypt


    2. SSL 인증서를 생성한다.


    ./letsencrypt-auto certonly --standalone -d YOUR_DOMAIN


    ex) ./letsencrypt-auto certonly --standalone -d mygumi.me


    Y/N 묻고, 이메일 관련 질문과 생성절차가 진행된다.

    인증서가 발급되었다면. 다음과 같이 메시지가 나올 것이다.


    IMPORTANT NOTES:

    - Congratulations! Your certificate and chain have been saved at:

    /etc/letsencrypt/live/example.com/fullchain.pem

    Your key file has been saved at:

    /etc/letsencrypt/live/example.com/privkey.pem

    ..........................


    혹시 ImportError: No module named cryptography.hazmat.bindings.openssl.binding 관련 오류가 난다면, https://github.com/certbot/certbot/issues/2544 참고하길 바란다.


    발급한 인증서를 확인하기 위해서는 다음과 같은 명령어를 통해 할 수 있다.


    ls /etc/letsencrypt/live

    ./certbot-auto certificates


    SSL 인증서


    Expriy Date 를 보다시피 만료기간(90일)이 존재한다.

    만료되기 전에 매번 갱신을 해주어야한다.

    이번 글을 쓰게 된 계기도 인증서 만료를 모르고 있었다가 다시 갱신하는 과정에서 다루게 되었다.

    자동적으로 갱신하기 위해서는 다음과 같이 설정할 수 있다.


    crontab -e


    위 명령어를 통해 crontab 파일을 읽은 후, 다음 텍스트를 입력해주면 된다.


    0 0 1 * * /opt/letsencrypt/letsencrypt-auto renew


    이와 같이 설정하면, 매월 한번 인증서가 자동적으로 갱신되게 된다.


    단순히 수동적으로 한다면, 다음과 같다.


    /etc/init.d/httpd stop

    /opt/letsencrypt/letsencrypt-auto renew

    /etc/init.d/httpd start


    서버를 중지한 후, 인증서를 갱신하고, 다시 서버를 시작하면 된다.

    위와 같은 순서를 따르지 않는다면 다음과 같은 에러를 초래할 수 있다.

    => Problem binding to port 443: Could not bind to IPv4 or IPv6.. Skipping.


    SSL 설정(아파치)




    웹 사이트의 HTTPS 를 설정하기 위한 관련 SSL 설정을 해줘야한다.


    vim /etc/httpd/conf.d/ssl.conf


    ssl.conf 파일을 열어 SSLCertificateFileSSLCertificateFile 의 값을 생성한 인증서 경로로 변경해주면 된다.


    ssl.conf


    그 후, 웹 서버를 다시 시작해주면 된다.


    /etc/init.d/httpd restart


    SSL 인증서 발급과 설정이 완료되었다.

    본인의 사이트에 SSL 설정 여부는 아래 사이트를 통해 확인할 수 있다.

    https://www.sslshopper.com/ssl-checker.html


    HTTPS 확인


    위와 같이 웹 사이트에 HTTPS 프로토콜을 사용하고 있는 모습을 볼 수 있다..


    마지막으로 Node.js 와 같이 다른 포트(mygumi.me:3000)를 열어 사용할 경우는 다음과 같다.

    다음과 같은 코드를 통해 사용할 수 있다.

    (참고로 권한 문제로 인해 /live 폴더가 아닌 /archive 폴더의 key파일을 사용했다.)


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    let options = {
      key: fs.readFileSync('/etc/letsencrypt/archive/mygumi.me/privkey1.pem'),
      cert: fs.readFileSync('/etc/letsencrypt/archive/mygumi.me/cert1.pem'),
      requestCert: false,
      rejectUnauthorized: false
    }
     
    let server = https.createServer( options, app )
     
    server.listen(serverConfig.port, (err) => {
      if (err) {
        return console.log(err)
      }
     
      return console.log(`server is listening on ${serverConfig.port}`)
    })
    cs


    댓글 0

Designed by Tistory.