Mixed Content: The page at "https://~..." was loaded over HTTPS, but http ~ requested an insecure resource "http://~...". This request has been blocked; the content must be served over HTTPS.
프론트 같은 경우 배포 서비스인 Vercel 이나 Netlify 로 배포를 했을 때,
http로 배포된 서버로 요청을 보내면 다음과 같은 에러를 받을 수 있다.
https로 배포된 사이트에서 http를 통해 리소스를 요청할 경우 발생하는 에러로,
https로 배포된 웹 페이지를 제공할 때는 모든 리소스가 HTTPS로 제공되도록 해야한다.
따라서 Vercel이나 Netlify로 프론트를 배포했다면, 백도 SSL 인증서를 붙여 HTTPS로 배포해야한다는 것이다 !
뭐 사실 그게 아니여도 http로 배포하면

이런식으로 warning 이 뜨는 것을 확인할 수 있는데 그 말대로 HTTP 통신은 클라이언트와 서버 간 통신에 있어 별다른 보안 조치가 존재하지 않는다는 것을 의미하기 때문에
누군가 네트워크 신호를 가로챈다면 HTTP의 내용이 그대로 외부에 노출될 수 있기 때문에
HTTPS로 배포하는 것이 좋다 !
HTTPS란?
Hypertext Transfer Protocol Secure 의 약자로 HTTP의 보안 버전이라고 생각하면 된다.

이 사진에서 보이듯 HTTP와 HTTPS를 통해 각각 통신을 수행하면 동일한 결과값을 받을 수 있으나
그 중간에 데이터를 암호화하는 과정이 추가되어 있다는 차이가 있다는 것을 알 수 있다
이때 HTTPS로 배포할 때 필요한 것이 바로 SSL 인증서라는 것인데,
보통은 CA(Certificate Authority) 라고 불리는 인증 기관에서 발급을 해준다.
암튼 지금부터 배포를 시작해보자 !
제 환경은 다음과 같습니다
이고 CA 기관은 Let's Encrpty라는 무료 인증서를 발급해주는 곳에서 받아왔습니다.
물론 tomcat이 아니라 nginx를 사용해서 https 설정을 할 수도 있고, 도메인을 사서 aws route 53으로 설정할 수도 있는데, 저는 무과금 유저이기 때문에 certbot로 인증서 발급 후 톰캣에 바로 붙이는 방식을 택하게 되었습니다 하하.
일단 certbot를 통해 인증서를 받아올 수 있고 인증서 발급을 위한 인증 방법이
1. standalone
2. webroot
3. DNS
이 있는데 그 중 첫번째 방법으로 인증을 진행하겠습니다.
인증서 인증 방법은 해당 블로그를 참고했습니다 !
먼저 docker를 우분투에 설치해줍니다.
sudo docker pull certbot/certbot
docker가 잘 돌고 있는지 확인해주고
sudo systemctl status docker
아래 명령어로 certbot 실행을 해줍니다
docker run -it --rm \
-v /etc/letsencrypt:/etc/letsencrypt \
-v /var/lib/letsencrypt:/var/lib/letsencrypt \
--network=host \
certbot/certbot certonly
그럼 요코롬 이메일을 입력하라고 하는데 이때 SSL 인증서 만료될 때쯤 해당 메일로 보내주기 때문에
자주 사용하는 이메일을 입력해주는 것이 좋다 !
이메일 입력 후에 동의를 받는데 그냥 Y 입력해주고 나면 발급해준다 !

간혹가다 발급 실패하는 경우가 있는데 필자는 두가지 경우가 있었다
1.EC2 보안그룹 설정 : 해당 인증 방식은 포트번호 80번으로 진행되기 때문에 보안그룹 설정의 인바운드 그룹에 80번을 추가해줘야 한다
2.내도메인 한국의 kro.kr : 이걸로 너무 많은 도메인이 등록되어 있다고 못하게 한다...
다른 도메인을 선택해서 진행하시길 ....
암튼 이렇게 .pem 형식으로 ssl 인증서를 발급받을 수 있지만 java 환경에서는 주로 pkcs12 형식을 선호하기 때문에 변환해줘야 합니다.
/etc/letsencrypt 경로로 가면 live라는 폴더 안에 등록한 도메인 폴더가 있고 그 내부로 들어가면 .pem키가 존재하는데 이때 권한이 없어 permission denied이 발생하기도 하기 때문에
sudo chmod 777 live
로 권한을 주어 들어간다!
등록한 도메인 폴더 안에 들어가면

이런 키들이 존재하는데 이 키들로 pkcs12를 만들어줄 것이다 openssl로 만들어주는데 최신 우분투 버전에는 내장되어 있기 때문에 sudo apt install openssl로 설치해주고 진행하면 됩니다.
이때
sudo openssl pkcs12 -export -inkey privkey.pem -in fullchain.pem -out keystore.p12
로 만들어주고 추가로 비밀번호 등록을 해주어야 하는데 그냥 해주면 된다 !
그렇게 만들어주고 resources에 넣어주고
application.yml에 이렇게 추가해주면 끝난다
server:
ssl:
key-store: "classpath:keystore.p12"
key-store-type: PKCS12
key-store-password: {위에서 작성한 비밀번호}
port: 443
...인줄 알았으나 다시 build 파일을 만들고 실행하니
java.net.socketexception: permission denied
라는 문제가 발생하였다...
이건 Linux에서 일반 사용자에게 WellKnown port 사용권한을 주지 않아 발생하는 문제로 443 포트 번호를 사용하려니 발생하는 문제인데 그냥 java 실행 명령어에 sudo를 추가해주면 해결된다 껄껄
nohup sudo java -jar ~~~~.jar
이런식으로 !
++-------------------
가끔 이런식으로 만든 keystore를 찾지 못한다는 에러가 발생하는데

그건 keystore.12에 대한 읽기 권한이 없어서 발생하는 에러다
chmod +r /home/ubuntu/{프로젝트명}/src/main/resources/keystore.p12
이렇게 읽기 권한을 주면 해결된다 !