현재 만들고 있는 서비스에 email과 비밀번호를 입력받는 기능이 존재합니다.
친구들에게 서비스를 한 번 사용해보라고 부탁하고 싶은데 HTTP는 아무래도 찝찝해서요. 괜히 친구들의 비밀번호를 유출시킬까 이번 기회에 HTTPS를 적용해보기로 합니다. HTTPS의 동작원리에 대해서는 이 글을 참고해주세요.
다음과 같은 순서로 진행할 예정입니다.
- 인증서 만들기
- Spring으로 만든 프로젝트에 인증서 등록하기
- 실제 서버에서 잘 동작하는지 확인하기
저는 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 서버를 사용하는 게 가장 빠를 것 같아 해당 방법을 선택했습니다.
sudo apt-get update
sudo apt-get install apache2
sudo service apache2 start
해당 도메인에 들어가 기본 화면이 나오는 걸 확인합니다.
아파치가 잘 연결되었으면 /var/www/html
경로에 들어가 /.well-known/pki-validation
디렉토리를 만든 뒤 Auth File을 붙여넣습니다.
해당 경로로 잘 접속되는 걸 확인한 다음 Next Step
을 누릅니다.
이후 파일을 다운로드받아 압축을 해제하면 아래 세 개의 파일이 있는 걸 확인할 수 있습니다.
인증서를 등록하기 위해서는 웹서버에 파일을 등록해야 합니다. 하지만 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]
서버에 keystore12를 보내기 위해 scp 명령어 추가하기
scp -P 2222 keystore.p12 root@106.10.56.73:/root/backend/gateway-service/src/main/resources