Spring Boot 프로젝트에 https 연결하기

김태훈·2023년 7월 27일
0

개요

현재 만들고 있는 서비스에 email과 비밀번호를 입력받는 기능이 존재합니다.
친구들에게 서비스를 한 번 사용해보라고 부탁하고 싶은데 HTTP는 아무래도 찝찝해서요. 괜히 친구들의 비밀번호를 유출시킬까 이번 기회에 HTTPS를 적용해보기로 합니다. HTTPS의 동작원리에 대해서는 이 글을 참고해주세요.

목차

다음과 같은 순서로 진행할 예정입니다.

  1. 인증서 만들기
  2. Spring으로 만든 프로젝트에 인증서 등록하기
  3. 실제 서버에서 잘 동작하는지 확인하기

인증서 만들기

저는 SSL For Free 에서 인증서를 만들겠습니다. 해당 사이트는 무료로 인증서를 만들 수 있고, 90일마다 연장해서 총 270일까지 무료로 사용할 수 있습니다.

먼저 Create For SSL Certificate 버튼을 누릅니다.

회원가입을 진행해줍니다. 회원가입을 하면 아래와 같은 화면을 볼 수 있습니다.

New Certificates 버튼을 누릅니다

Enter Domains에 도메인을 입력해줍니다. 도메인이 아니라 IP를 입력해도 상관없습니다.
입력한 다음 Next Step을 누릅니다.

90일을 선택해줍니다. 이후 중요한 게 없으니 계속 Next Step을 눌러 진행하겠습니다.

다음과 같은 화면을 볼 수 있는데요. 해당 화면에서는 이 도메인이 내가 가지고 있는 도메인이라는 걸 증명하는 과정입니다.
원래는 세 가지 방법이 있는데 저는 IP로 등록해서 두 가지밖에 없네요. 가장 쉬운건 HTTP File Upload 방법이니 해당 방법으로 하겠습니다.

"내가 소유한 도메인이 맞다면 해당 도메인에 화면을 보여줄 수 있으니까 특정 화면을 띄워보아라." 라는 식으로 검증하는 방식입니다.
Auth File을 다운로드하고 /.well-known/pki-validation/[Auth File 이름] 경로에 Auth File을 출력하면 됩니다.
여러 방식이 있겠지만 저는 Apache 서버를 사용하는 게 가장 빠를 것 같아 해당 방법을 선택했습니다.

Apache 서버를 사용해 화면을 출력하는 방법

sudo apt-get update
sudo apt-get install apache2
sudo service apache2 start

해당 도메인에 들어가 기본 화면이 나오는 걸 확인합니다.

아파치가 잘 연결되었으면 /var/www/html 경로에 들어가 /.well-known/pki-validation 디렉토리를 만든 뒤 Auth File을 붙여넣습니다.
해당 경로로 잘 접속되는 걸 확인한 다음 Next Step을 누릅니다.

이후 파일을 다운로드받아 압축을 해제하면 아래 세 개의 파일이 있는 걸 확인할 수 있습니다.

Spring으로 만든 프로젝트에 인증서 등록하기

인증서를 등록하기 위해서는 웹서버에 파일을 등록해야 합니다. 하지만 jar는 웹서버를 내장하고 있어 직접 접근이 불가능합니다.

여러 방법이 있겠지만 저는 application.yml 파일을 사용해 내장톰캣을 조작하겠습니다.

application.yml에 아래 정보를 추가합니다.

server:
  port: 443
  ssl:
    enabled: true
    key-store-type: PKCS12
    key-store: classpath:keystore.p12
    key-store-password: [비밀번호]

key-store를 생성합니다. private.key와 certificate.crt가 있는 디렉토리에 들어가 아래 명령어를 실행합니다.

openssl pkcs12 -export -out keystore.p12 -inkey private.key -in certificate.crt -password pass:[등록할 패스워드]

위 명령어를 실행하면 keystore.p12가 생성되는데 해당 파일을 스프링 resources/ 하단에 추가합니다.

로컬 PC에서 해당 jar 파일을 실행하면 https로 웹페이지가 동작하는 걸 확인할 수 있습니다.

신뢰할 수 없는 사이트가 떠야 정상입니다! 우리가 만든 인증서는 localhost에 대한 인증서가 아니기 때문에 https 연결이 되더라도 신뢰할 수 없다는 문구가 같이 뜨게 됩니다.

실제 서버에서 잘 동작하는지 확인하기

그런데 원격 서버(우분투)에서 해당 jar 파일을 실행하면 아래와 같은 오류가 발생합니다.

org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server

// 생략

Caused by: java.net.SocketException: Permission denied

리눅스는 Root 사용자만이 잘 알려진 포트(@@ 번호 이하)를 사용할 수 있기 때문입니다.
이거 역시 여러 해결방법이 있는데, sudo 명령어를 사용해서 jar 파일을 실행하는게 가장 간단합니다.

sudo nohup java -jar [실행파일.jar]

참고

https://shanepark.tistory.com/442

profile
작은 지식 모아모아

1개의 댓글

comment-user-thumbnail
2023년 11월 27일

서버에 keystore12를 보내기 위해 scp 명령어 추가하기

scp -P 2222 keystore.p12 root@106.10.56.73:/root/backend/gateway-service/src/main/resources

  • 서버 포트 열어야 한다고 알려주기
답글 달기