7 minute read

라즈베리파이 SSL 구축

SSL 개요

: 라즈베리파이에 구축한 Apache & Tomcat서버에 SSL을 적용한다.

SSL(HTTP over Secure Socket Layer) 요약
이제는 당연시 되어버린 https.
기존 http는 암호화되지 않은 방식으로 데이터를 주고 받기 때문에 제 3자에 의한 악의적인 해킹에 취약했다. https는 제 3자인 CA(인증기관)가 보증하는 문서를 통해 보안 통신을 제공한다. 이 문서를 SSL 인증서라 한다. 정리하면 https는 SSL 프로토콜 위에서 돌아가는 프로토콜이며 SSL은 데이터를 안전하게 전송하기 위한 인터넷 통신 규약 프로토콜이다. SSL은 2.0과 3.0 버전을 거쳐 현재는 SSL 3.0을 기반으로한 TLS가 도입되어 사용 중이다.

SSL 2.0 / SSL 3.0 은 2015년을 마지막으로 중지되었으며, TLS는 현재 TLS 1.2 / TLS 1.3 의 버전이 존재한다. (2020년 5월 업데이트로 TLS 1.0 및 TLS 1.1 프로토콜 지원 중지되었다.) TLS 1.2 이상을 지원하지 않는 웹 서버를 운영 중이라면, 업그레이드를 해야한다.

SSL과 TLS는 같은 말이며, SSL이라는 이름이 오래 사용된 탓인지 TLS에 비해 SSL이라는 이름으로 많이 사용되고 있다.

SSL 유료, 무료 인증서

: 학습이므로 무료 SSL 인증서 종류를 알아본다.

무료인증서 종류

: 무료인증서 종류를 알아본다.

  1. 발급한 시설 인증서 유형
    : 브라우져에 신뢰할 수 있는 기관으로 등록되어 있지 않는 곳에서 발급받았기 때문에 사용할 때 경고 메세지 등을 보고 예외처리를 해준더가 해야한다.
    • ex) openSSL
  2. 인증기관이 무료로 제공하는 인증서 유형
    : 보통은 큰 업체들이 인증서 사용을 권장하기 위해 후원하는 식이다.
    • ex)starssl, Let’s Encrypt
  1. Let’s Encrypt : https://letsencrypt.org/
  2. Comodo Free SSL : https://www.gogetssl.com/domain-validation/comodo-free-ssl/
  3. CloudFlare One-Click SSL : https://www.cloudflare.com/ssl/
  4. AWS Certificate Manager : https://aws.amazon.com/ko/certificate-manager/
  5. (귄장되지 않음) StartCom StartSSL : https://www.startssl.com/
  6. (권장되지 않음) self-signed 인증서
    OpenSSL을 이용해 자체적으로 루트 CA를 생성해서 self-signed 인증서를 발급받는 것.

유료인증서 종류

: 말그대로 유료 구매하면 끝이다. (SS 인증서를 발급을 돕는 호스팅업체는 너무 많으므로 생략한다.)

차이점

: CA 중에서는 VeriSign이나 Codomo와 같이 유료 SSL인증서를 발급하는 곳이 있고 Let’s Encrypt와 같이 무료 인증서를 발급해주는 곳이 있다. 유료와 무료 SSL 인증서 간에 기술적 차이점은 없다. 하지만 SSL인증서를 적용한 사이트에 인증과 관련한 문제가 생겼다면 유료 인증서를 발급한 곳에서는 해당 웹사이트를 방문한 사람에게 SSL인증서를 구매한 회사를 대신해 일정 부분 금액을 배상한다. 비싼 인증서는 보상의 범위와 규모가 커지고 싼 인증서는 보상의 범위와 규모가 상대적으로 작다. 무료 인증서는 CA에서 이러한 배상을 해주지 않는다.

최종선택

: 적용할 SSL 유형을 선택한다. 나는 무료인증서를 적용하기로 했다.

  • 후보1. OpenSSL
    보통 테스트용도로는 OpenSSL 을 이용하는것으로 보인다. 이는 위에서 설명한 Self signed certificate 방식의 SSL 인증서를 발급이다.

    Self signed Certificate(SSC) 란?
    모든 인증서는 발급기관(CA)가 있어야 하나, 최상위에 있는 인증기관(root ca)은 서명해줄 상위 인증기관이 없으므로 root ca의 개인키로 스스로의 인증서에 서명하여 최상위 인증기관 인증서를 만든다. 이렇게 스스로 서명한 root ca 인증서를 Self Signed Certificate 라고 한다.
    IE, FireFox, Chrome 등의 Web Browser 제작사는 VeriSign 이나 comodo 같은 유명 ROOT CA 들의 인증서를 신뢰하는 CA이다.

    이런 CA는 미리 등록해 놓으므로 저런 기관에서 발급된 SSL 인증서를 사용해야 browser 에서는 해당 SSL 인증서를 신뢰할수 있는데, OpenSSL 로 만든 ROOT CA와 SSL 인증서는 Browser가 모르는 기관이 발급한 인증서이므로 보안 경고를 발생시킬 것이나 테스트 사용에는 지장이 없다. 딱 이정도 수준이다.

  • 후보2. Let’s Encrypt
    무료이지만 테스트스럽지 않은 이 인증서로 결정했다. 단 3개월마다 갱신이 필요하다는 단점이 있다.
    • Let’s Encrypt의 경우는 조건없이 무료이다.
    • 하지만 EV 인증서는 발급받을 수 없다.
    • 지속적으로 https 인증서를 유지하려면 3개월마다 갱신해야한다.
    • 보통 crontab으로 자동 갱신한다.

    참고)Let’s Encrypt (현재 Certbot 명칭)
    Let's Encrypt 는 최근에 certbot 으로 패키지 이름이 변경되었다. Ubuntu 내부적으로 Let's Encrypt -> certbot 으로 설정되어 있으니, 둘 중 아무 단어나 사용해도 무방하다. (동작이 완전히 동일함)

SSL 구축

: SSL(Let’s Encrypt)을 구현한다. 수동 컴파일로 설치한 apache 서버에 SSL 인증서 적용한다.

준비물

  • 도메인
  • mod_ssl 모듈 (Apache 설치 시점에 생성된다.)

Apache의 경우 기본적으로 /extra 경로에 mod_ssl 모듈을 가지고있어야 한다.

mod_ssl 모듈 확인

: 우선 mod_ssl.so 모듈이 존재하는지 확인해야한다. 해당 모듈은 Apache 수동컴파일 시점에 생성된다.

cd /fswas/apache/httpd/httpd-2.4.541/modules

ls | grep ssl
mod_ssl.so     # 정상적으로 생성되어있다.

snap 을 이용한 certbot 설치

: 우분투 최신버전(20v) 에서는 cerbot 설치가 단독으로 안된다고 한다. 그래서 snaped 를 이용하여 설치한다.

  1. snap 설치
    : snap 설치한다.

     # 업데이트
     sudo apt update && sudo apt upgrade -y
          
     # snap 설치
     sudo snap install core
     sudo snap refresh core
    
    
  2. certbot 설치
    : certbot (구 Let’s Encrypt)을 설치한다.

    # cerbot 기존 잘못된 버전이 있을 수 있으니 선행으로 제거해본다.
    sudo apt-get remove certbot (우분투)
          
    # certbot 설치
    sudo snap install --classic certbot 
    sudo snap set certbot trust-plugin-with-root=ok
    
    
  3. cerbot 심볼릭링크 연결
    : 어느 경로에서든 cerbot 사용가능하도록 링크 연결

    sudo ln -s /snap/bin/certbot /usr/bin/certbot
    
    
    

인증서 생성

: 이제 인증서를 생성한다.

참고) 아파치 수동 컴파일 환경에서 실패한 내용
아파치를 소스컴파일로 특정경로에 수동설치한 나의 케이스는 일반적으로 사용되는 인증서 발급방법들이 모두 실패했다.. 내용은 아래와 같이 기록해두었다.
# 간단한명령어
# ==> 인증서를 받고 apache 웹서버 설정을 바꿔주는 명령어.
sudo certbot --apache

# 간단한명령어가 안될시
# ==> 인증서만 받고 apache 설정을 수정하고 싶지 않은 경우 certonly를 추가.
sudo certbot certonly --apache

# 위 내용도 안될시
# ==> certbot이 apachectl의 경로를 못찾았으므로 직접 경로지정
sudo certbot certonly --apache-ctl /fswas/apache/bin/apachectl

실패한 이유
나의 경우에는 3번째 방법으로 일부 진행이 되기는했지만 실패했다.. 삽질끝에 결론적으로는 도메인 소유권인증이 잘되지 않았다.

그래서 아래의 방법으로 성공했다.
도메인소유권 인증을 하드코딩으로 인증서발급받기 를 소개한다.


  1. 첫번째 터미널 (Ubuntu 서버 접속후) 키값 얻기
    : 키값얻기

     # 입력
     sudo certbot certonly --manual --email layup3@naver.com -d www.blang.co.kr
    
     Saving debug log to /var/log/letsencrypt/letsencrypt.log
     Certificate not yet due for renewal
    
     You have an existing certificate that has exactly the same domains or certificate name you requested and isn`t close to expiry.
     (ref: /etc/letsencrypt/renewal/www.blang.co.kr.conf)
    
     What would you like to do?
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     1: Keep the existing certificate for now
     2: Renew & replace the certificate (may be subject to CA rate limits)
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
    
    
     ####  그리고 1,2 선택 프롬프트가 나온다. ####
     ####  이 상태에서 2번을 입력한다.  ####
    
    
     Renewing an existing certificate for www.blang.co.kr
    
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     Create a file containing just this data:
    
     #### 이 부분을 기억한다. 파일내용이 될것이다. ####
     svgGOolJwR-c0AE3y1LK9baawOUs2WCyFNshKAtyaOs.Maq3VP2H7kR4BKvqSK6M5UxpggCUz79D02DKpcVXqK4
    
     And make it available on your web server at this URL:
    
     #### 이 부분을 기억한다. 파일명이 될것이다. ####
     http://www.blang.co.kr/.well-known/acme-challenge/svgGOolJwR-c0AE3y1LK9baawOUs2WCyFNshKAtyaOs
     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     Press Enter to Continue
    
          
     # 그리고 절대 엔터를 누르지 않는다.
     # 1. 엔터를 누르면 저 경로로 요청을 보내고 
     # 2. 키와 값이 일치하면 소유인증을 완료 한뒤 
     # 3. cerbot(Let’s Encrypt) 인증서를 최종 발급한다.
         
     # 그런데 지금은 저 경로에 생성값을 만들어주지 않았으므로 당연히 404에러가 나올것이다.
     # 그리고 값이 또 리셋되므로 이 터미널창을 그대로 두고 터미널을 하나 더 띄우고 서버접속을 해준다. (도메인 소유권확인을 위한 작업)
    
    
  2. 두번째 터미널 (Ubuntu 서버 접속후) 톰캣 루트에 폴더/파일 을 만들어준다.
    : 키값을 하드코딩으로 특정경로에 생성한다.

     # su 명령어로 root 로그인상태로 진행
          
     # 웹루트 경로로 이동
     cd /fswas/apache/httpd/httpd-2.4.541/htdocs
          
     # 아래처럼 특정 숨김폴더들을 생성
     mkdir -p .well-known/acme-challenge
    
     # 첫번째터미널로 돌아가서 위에 `1번` 항목의 주석 내용 중
     # 파일명이 될것이다. 라는 긴 문자열 코드를 복사한다. 
     # 그리고 다시 두번째터미널로 돌아와서 생성한 숨김폴더에 복사한이름으로 파일을 생성한다.
     cd .well-known/acme-challenge
     touch 5yJoRVf8nizOS6BxgvqQxXJhFiZ_J_SUOJ1CUP832bY
          
     # 다시 첫번째터미널로 돌아가서 위에 `1번` 항목의 주석 내용 중
     # 파일내용이 될것이다. 라는 긴 문자열 코드를 복사한다.  
     # 그리고 다시 두번째터미널로 돌아와서 아까 생성한 파일안에 내용으로 붙여넣기한다.
     vi svgGOolJwR-c0AE3y1LK9baawOUs2WCyFNshKAtyaOs
    
     # 파일안에 붙여놓고 저장
     svgGOolJwR-c0AE3y1LK9baawOUs2WCyFNshKAtyaOs.Maq3VP2H7kR4BKvqSK6M5UxpggCUz79D02DKpcVXqK4
    
     # 인증을 위한 파일설정은 끝났다.
    
    
  3. 웹서버 로드밸런싱 (JkUnMount) 매핑 설정
    : 인증을 위해 웹서버안에 방금만든 파일에 요청 접근이 가능해야한다. 하지만 현재 모든 요청이 WAS 측으로 넘어가도록 로드밸런싱 되어있다. 특정 요청은 넘어가지 않도록 JkMount 매핑을 설정해주도록 해야한다.

     vi 웹서버루트/conf/httpd.conf
          
     # ASIS
     # jkMount /* lilo_lb
    
     # TOBE
     JkMount /* blang_balancer
    
     #### 방금만든 SSL 인증키값파일 경로
     #### SSL 생성한 키값 경로는 SKIP 
     JkUnMount /.well-known/acme-challenge/* blang_balancer
    
    
  4. 첫번째터미널로 돌아와서 도메인 소유인증 최종확인
    : 최종으로 도메인소유를 인증하고 인증서를 발급받는다.

    # 성공했다!!
    # 인증서 만료일이 2023-03-05 라고 출력된다.
          
    Successfully received certificate.
    Certificate is saved at: /etc/letsencrypt/live/www.blang.co.kr/fullchain.pem
    Key is saved at:         /etc/letsencrypt/live/www.blang.co.kr/privkey.pem
    This certificate expires on 2023-03-05.
    These files will be updated when the certificate renews.
    
    NEXT STEPS:
    - This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate's expiry date.
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
     * Donating to EFF:                    https://eff.org/donate-le
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    
  5. 인증서 확인
    : 정말 인증서가 생성되었는지 확인한다.

    # 아래 경로에 가보면
    cd /etc/letsencrypt/live
       
    # 내 도메인명으로 된 폴더가 생성되어있다.
    l -al
    www.blang.co.kr
          
    # 들어가보면 각 인증서가 정상발급되었음을 볼 수 있다.
    cd /etc/letsencrypt/live
    l -al
    README
    cert.pem        # 인증서 파일
    chain.pem       # 중계인증서 파일
    fullchain.pem
    privkey.pem     # 키 파일
    
    

인증서 발급완료

: 인증서 발급이 끝났다. 너무 길어져서 적용방법은 다음 포스트에서 소개해야겠다..

SSL발급 후 생각
cerbot(Let’s Encrypt) 을 이용한 SSL 인증서발급은 생각보다 복잡해서 시간이 많이 소요되었다. 특히 나의 경우는 특정 경로에 아파치를 설치해두어서 일반적으로 사람들이 소개하는 방법이 실패하여 더더욱 시간이 걸렸다.

Leave a comment