Backend

[SpringBoot] SSL 인증서 발급하고 적용하기

76 2024. 2. 22. 19:44
728x90

1. SSL For Free에 접속한다.

https://www.sslforfree.com/

 

SSL For Free - Free SSL Certificates in Minutes

Wildcard SSL Certificates Wildcard certificates allow you to secure any sub-domains under a domain. If you want to secure any sub-domains of example.org that you have now or in the future you can make a wildcard certificate. To generate wildcard certificat

www.sslforfree.com

 

인증을 적용하고 싶은 도메인 주소를 입력한다.

우리는 퍼블릭 IPv4 DNS 주소로 진행해 볼것이다. - GET 메소드 이외에 모든 요청에서 문제없이 동작하기 위해선 탄력적 IP를 발급받아 연결하고, 탄력적 IP주소.nip.io 로 아래 과정을 진행해야한다.(게시글 수정 예정)

 

회원가입을 진행한다.

 

따로 건들 필요 없이 Next Step을 누른다.

90-Days를 선택하고 Next Step을 누른다.

 

Next Step ->

 

원하는 요금제를 선택하고 다음을 누른다.

 

2. 도메인 보유 증명

신청한 도메인의 보유자임을 증명하는 단계이다. 3가지 방법을 제시하는데 그 중 가장 마지막 방법을 선택한다.

Download Auth File을 클릭해서 파일을 다운로드 받은다음

2번에서 안내한것 처럼 프로젝트파일의 resources의 static에 .well-known/pki-validataion 디렉토리를 만들고 다운 받은 파일을 넣어준다.

 

이후 http://localhost:8080/.well-known/pki-validation/C890FF681DF87E6B522F93A1477A4385.txt 를 인터넷 창에 입력하였을때 아래와 같이 txt파일의 내용이 출력되면 정상적으로 적용한 것이다.

로컬 환경에서 성공하였으므로 이제 새로 빌드 후 배포해서 위의 3번 스텝에서 요청하는 정확한 경로로 요청이 되는걸 확인 해야 한다.

새롭게 빌드 한뒤 ec2 엔드포인트로 요청을 보냈을때도 동일한 응답이 오는지 확인한다.(수행 과정중에 인스턴스를 초기화하여 코드가 다른 것이다. 원래는 위의 사진과 동일해야 한다.)

 

과정을 수행하기 전에, 80번 포트로의 연결을 8080포트로 연결하기 위해(SSL 인증서는 HTTP로 진행되는데, 인증서가 존재하는 서버는 8080포트를 사용하기 때문)포트 포워딩을 진행해야 한다.

 

1. EC2 터미널에 접속하여 다음 명령어를 실행한다.

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

 

2. 시스템에서 IP 포워딩을 활성화한다. 

cat /proc/sys/net/ipv4/ip_forward

 

위 명령어의 실행 결과가 1이 아니라면 다음 명령어를 입력하여 IP 포워딩을 활성화한다.

sudo sysctl -w net.ipv4.ip_forward=1

 

 

위 과정을 수행한 뒤, 3번에서 제시한 링크로 요청을 보내어 인증서가 출력되는지 확인한다.

http://ec2-3-39-226-146.ap-northeast-2.compute.amazonaws.com/.well-known/pki-validation/91A751775DEF8539F929F63BE14BCCB9.txt

 

인증서 코드가 정상적으로 출력된다면 성공이다.

Next Step 클릭 해 Verify Domain 을 진행한다.

 

인증에 성공하면 Tomcat을 선택하고 인증서를 다운 받는다.

 

다운받은 인증서의 압축을 해제하면 3가지 파일을 확인 할 수 있다.

 

3. 인증서 적용

다운 받은 인증서를 스프링부트에서 사용할 수 있도록 pkcs12파일을 생성해야 한다.

인증서가 존재하는 디렉토리로 이동하여 터미널에서 아래 명령어를 입력한다.

openssl pkcs12 -export -out keystore.p12 -inkey private.key -in certificate.crt -certfile ca_bundle.crt

 

비밀번호는 나중에 사용해야하니 까먹지 않도록 한다.

 

명령어를 입력하면 아래와 같이 keystore.p12 파일이 생성된다.

 

스프링 부트의 resources에 keystore 디렉토리를 만들고 그곳에 .p12파일을 저장한다.

 

keystore.p12 파일이 저장된 디렉토리에서 아래 명령어를 입력하여 상세 정보를 확인한다.

keytool -list -v -keystore ./keystore.p12 -storepass 비밀번호

 

 

application.properties에 아래 코드를 추가한다. 

keyAlias는 별칭 이름에 해당한다. 앞서 확인한 별칭인 1을 입력하였다.

# SSL
server.ssl.key-store=classpath:keystore/keystore.p12
server.ssl.key-store-password=비밀번호
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=1

 

이후 로컬환경에서 https로 접속을 시도하면 당연하게도 오류가 발생한다.

인증서에 등록한 주소(https://ec2-...)와 일치하지 않기 때문이다.

 

고급을 눌러 세부정보를 확인해보면 정확한 사유를 알 수 있다.

 

jar 파일을 빌드후 ec2서버에서 http로 접속을 시도하면 bad request가 발생하게 되고, https로 다시 요청하게 되면 당장은 접속이 되지 않는다.

이전에 80포트를 8080으로 연결한것 처럼 443(https)도 8080포트로 연결해줘야 하기 때문이다.

터미널에 아래 명령어를 입력한다.

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080

 

이후 https 방식으로 요청하면 정상적으로 화이트 라벨이 출력되는 것을 확인 할 수 있다.

추가로 왼쪽의 정보를 누르면 자물쇠와 함께 안전한 사이트라고 표시되는 것을 확인 할 수 있다.

 

인증에 성공하였다면 사이트에서도 직접 체크하여 인증이 성공하였음을 등록한다.

 

이전에는 http방식으로 접근이 가능했지만 이후에는 https방식으로만 접근이 가능하다. 이러한 문제를 해결하기 위해 스프링 프레임워크에 의존성을 추가한다.

implementation 'org.springframework.boot:spring-boot-starter-security' // http -> https

 

이후 시큐리티 설정 구성 클래스를 추가해준다.

@Configuration 어노테이션을 통해 스프링 프레임워크 해당 구성 파일을 등록하고 http로의 요청을 https로 리다이렉트 해준다. 이를 통해 http로 접근을 시도하면 https 접근으로 자동 변경된다.

@Configuration
public class SecurityConfig {

  @Bean
  SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    return http
      .requiresChannel(channel -> 
          channel.anyRequest().requiresSecure())
      .authorizeRequests(authorize ->
          authorize.anyRequest().permitAll())
      .build();
    }

}

 

위 코드를 저장하고 다시 빌드한 다음 http로 접근을 시도하면 자동으로 https로 변경되는 것을 확인 할 수 있다.

이로 인해 기존에 http로 접근해왔던 사람들도 정상적으로 서비스를 이용할 수 있게 된다.