본문 바로가기

project/홍보 사이트

HTTPS 적용하기

1. https 란 무엇인가?

http 프로토콜에 TLS/SSL을 적용하여 보안을 강화한 프로토콜이다.

https://rachel-kwak.github.io/2021/03/08/HTTPS.html

 

HTTPS란? (동작방식, 장단점)

몇 년 전만 해도 전자 상거래 페이지가 있는 웹사이트에서만 HTTPS를 사용하고 있었다. 그러나 2014년, 구글에서 HTTPS를 사용하는 웹사이트에 대해서 검색 순위 결과에 약간의 가산점을 주겠다고

rachel-kwak.github.io

2. SSL계층?

OSI 7계층에서 5번 계층으로 서버와 클라이언트간의 보안을 담당하는 계층이다. 공개키 암호시스템을 이용해서 전송 구간에서 데이터의 노출을 방어하는 역할을 수행한다.

 

https://12bme.tistory.com/80

 

[정보보안] SSL(Secure Socket Layer) 이란

현재 근무 중인 업체에서 SSL 인증서 적용 작업이 필요하다고 합니다. SSL 인증서관련 필요한 것이 무엇인지에 대한 요청이 있었습니다. 간단하게 SSL에 대해 정리해보겠습니다. 1. SSL 개념 잡기 SSL

12bme.tistory.com

3. 인증서 발급하기

let's encrypt 이란 무엇이고 어떻게 사용하는가?

let's encrypt 는 무료로 CA 인증서를 발급하고 관리해주는 서비스 제공자이다. 단 3개월에 한 번씩 갱신을 해야 한다는 단점이 있지만 무료다.

인증서를 발급하는 방법은 두가지 방법이 있다.

certbot을 이용해서 사용할 도메인의 소유자임을 증명하는 방식(standalone) 그리고 기존에 사용하고 있는 웹서버를 이용한 방식이 있다.

  • standalone
    • 도메인과 연결된 서버에서 80 포트를 점유한 프로그램을 잠시 끄고 certbot이 80을 사용할 수 있도록 해야 가능
    • 내가 사용한 방식은 이 방식이었다. 설정이 간편하고 서버를 잠시꺼도 괜찮았기 때문이다.
다음 명령어로 발급한다.
sudo certbot certonly --standalone
  • webroot 방식
    • 구동하는 웹서버에 따라서 설정을 한 후에 인증서를 그 웹서버를 통해서 발급받는 방법이다.

letsencript 인증서 발급 방법은 다음 블로그를 참고했다. 더 자세한 거은 다음 링크 참고

https://www.vompressor.com/tls1

 

발급된 인증서는 무엇인가?

인증서를 발급하면 이러한 메시지가 뜬다.

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/www.beautifulwriting.site/fullchain.pem
Key is saved at: /etc/letsencrypt/live/www.beautifulwriting.site/privkey.pem

인증서를 발급한 곳으로 이동하여 인증서를 확인하면 4가지 인증서 파일이 생성이 된 것을 확인할 수 있다.

  • privkey.pem : 인증서의 개인 키
  • fullchain.pem : cert.pem + chain.pem
  • cert.pem : 서버 인증서 자체
  • chain.pem : 루트 인증서 + 체인 인증서

 

공개키와 개인키 인증서 두가지 키만 필요한 것 같은데 이상한 파일이 2개나 더 있다. 추가적인 인증서는 다음과 같이 역할을 하는 인증서로 사용된다.

  • 루트 인증서?
    • 공개키 기반 구조에서 최상위 인증 기관인 루트 인증기관에서 발급하는 인증서
  • 체인인증서? 
    • 루트 인증서와 발급 받은 서버 인증서 사이에 존재하는 인증서
    • 즉 루트 인증서와 서버 인증서 사이를 중개하는 역할을 가지는 인증서

 

내가 사용할 인증서 파일은 fullchain.pem과 privkey.pem 이 두 가지를 사용할 것이다.

 

발급한 산출물 내용 설명

https://eff-certbot.readthedocs.io/en/stable/using.html#where-are-my-certificates

 

User Guide — Certbot 2.2.0 documentation

To view a list of the certificates Certbot knows about, run the certificates subcommand: Certificate Name shows the name of the certificate. Pass this name using the --cert-name flag to specify a particular certificate for the run, certonly, certificates,

eff-certbot.readthedocs.io

4. spring boot 인증서 적용

spring boot는 pem 파일을 지원하지 않느다. 그래서 openssl을 통해서 p12 형식으로 변환이 필요하다.

openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name tomcat -CAfile chain.pem -caname root

해당 명령을 실행하면 입력하는 비밀번호를 포함해서 application.properties에 다음 설정을 추가하면 된다.

server.ssl.key-store:/etc/letsencrypt/live/www.example.com/keystore.p12
server.ssl.key-store-password:
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat

다음 블로그에서 발췌한 내용이므로 다음을 참고하면 좋다. spring boot 도커 컨테이너 환경에서 인증서 적용하는 글이다.


https://knasmueller.net/lets-encrypt-ssl-certificates-for-dockerized-spring-boot-in-2020

 

Let's Encrypt SSL Certificates for Dockerized Spring Boot in 2020 - Bernhard Knasmüller on Software Development

Learn how to setup a free Let's Encrypt SSL certificate for your Spring Boot application running inside a Docker container.

knasmueller.net

5. nginx 인증서 적용

nginx는 nginx.conf 파일에 인증서와 관련된 설정을 추가하고 재실행하면 인증서를 적용할 수 있다.

 

https://velog.io/@twkim8548/Nginx%EC%97%90%EC%84%9C-SSL-%EC%A0%81%EC%9A%A9%ED%95%B4%EC%84%9C-Https-%EB%A1%9C-%EC%A0%91%EC%86%8D-%EB%90%98%EA%B2%8C-%ED%95%B4%EB%B3%BC%EA%B9%8C

 

Nginx에서 SSL 적용해서 https 로 접속 되게 해볼까?

SSL이 뭐지? Nginx에서 https로 접속되게 하려면 어떻게 해야 하지?

velog.io

http://nginx.org/en/docs/http/configuring_https_servers.html

 

Configuring HTTPS servers

Configuring HTTPS servers To configure an HTTPS server, the ssl parameter must be enabled on listening sockets in the server block, and the locations of the server certificate and private key files should be specified: server { listen 443 ssl; server_name

nginx.org

6. kong 인증서 적용

적용 삽질기

힘들게 spring boot와 nginx에서 인증서 적용하는 법을 알았으나 생각해 보니 내가 구축한 환경에서 굳이 이렇게 복잡하게 애플리케이션마다 인증서를 넣어주어야 하는가에 대한 생각이 들었다.

모든 사용자 요청(http request)은 api gateway 인 kong을 거쳐서 kong에서 url을 보고 다시 재분배하는 과정을 거친다. 그리고 재분배하는 네트워크는 ec2의 로컬 네트워크 안에서 모든 것이 이루어지기 때문에 ec2의 권한을 탈취당한 것이 아니라면 보안에 대해서 걱정할 것이 없다!! 즉, https를 쓰면서 암호화 작업을 할 이유가 없는 것이다.

그래서 kong 공식 사이트에서 kong의 기능을 살펴보았다. 게이트웨이 기능 이외에도 다양한 기능을 제공하고 있었고 https 인증서 역시 kong 애플리케이션에서 등록이 가능하다는 것을 알게 되었다.

하지만 kong에 인증서를 등록하는 방법을 찾는데 너무 힘들었다. 특히 SNI를 지칭하는 변수 snis가 다른 의미로 사용되고 있어서 구글링이 더욱 힘들었다. snis란 치니까 야동 정보가 나온다 ㄷㄷ 이 과정에서 https의 동작 방식과 SNI이 무엇인지 알 수 있었고 kong의 환경변수가 무엇 있는지 확실히 알 수 있었다.

 

https://aboutsc.tistory.com/226

 

SNI 란?

* SNI (Server Name Indication) SNI란 한국어로 서버명 지정 이라는 뜻인데, TLS 프로토콜 확장형이다. 랜선을 통하여 tcp 통신을 수행할 시에 핸드세이크 과정을 거치게 되는데, 이때 핸드세이크 과정의

aboutsc.tistory.com

어떻게 적용하나?

도커에서 kong 컨테이너를 실행하는 데 명령을 살펴보자. 다음은 내가 사용한 도커 명령어이다. 도커 컴포즈로 세팅하는 방법도 있지만 그것은 나중에 적용하도록 하고 일단 명령어를 보자.

docker run -d --name kong \
  --network=kong-net \
  -v /home/ubuntu/https:/etc/kong/ssl \
  -v "$(pwd):/kong/declarative/" \
  -e "KONG_DATABASE=off" \
  -e "KONG_DECLARATIVE_CONFIG=/kong/declarative/kong.yml" \
  -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
  -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
  -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
  -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
  -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
  -e "KONG_SSL_CERT=/etc/kong/ssl/fullchain.pem" \
  -e "KONG_SSL_CERT_KEY=/etc/kong/ssl/privkey.pem" \
  -p 80:8000 \
  -p 443:8443 \
  -p 127.0.0.1:8001:8001 \
  -p 127.0.0.1:8444:8444 \
  kong:latest

-e 옵션은 환경변수를 지정하는 옵션이다. KONG_ 접두어를 붙이고 공식 문서에서 제공한 변수명과 동일하게 변수를 선언하면 kong에서는 해당 변수를 통해서 kong 환경을 설정한다.

SSL 인증서를 적용하기 위해서 필요한 환경 변수는 KONG_SSL_CERT , KONG_SSL_CERT_KEY이다.

  • KONG_SSL_CERT : 인증서 공개키
  • KONG_SSL_CERT_KEY : 인증서 개인키

변수의 의미에 맞게 인증서를 입력하면 kong 서버에 https로 접근할 때 인증서를 사용한 접근이 가능하다.

 

환경변수 리스트 참고 사이트 https://github.com/Kong/kong/blob/master/kong.conf.defaulthttps://github.com/Kong/kong/blob/master/kong.conf.default

 

GitHub - Kong/kong: 🦍 The Cloud-Native API Gateway

🦍 The Cloud-Native API Gateway . Contribute to Kong/kong development by creating an account on GitHub.

github.com

https 적용 확인하기

이제 적용이 되었는지 확인해 보자.

  • 브라우저에서 확인

http 접속
https 접속

드디어 지긋지긋한 주의 요함 메시지가 사라졌다!!

  • 와이어샤크로 패킷 확인

브라우저 상에서 https 가 적용되었다고 하지만 실제 패킷이 어떻게 전송이 되는지 확인하고 싶어서 와이어샤크를 통해서 패킷을 확인해 보았다.

  • http 패킷

  • https 적용 패킷

실제로 확인한 결과 https 애플리케이션 헤더 정보를 와이어샤크에서 확인할 수 없었지만 http에서는 어떤 패킷인지 어플리케이션 헤더를 통해서 확인할 수 있었다.

 

7. 후기

이론상으로는 간단하지만 실제로 적용하려니 적용하는 시스템의 계층도 많고 처음 하는 것이라서 많이 돌아서 적용을 했던 것 같다. ㄱ