Spring Boot App에 SSL/HTTPS를 적용하는 방법에 대해 알아보도록 한다.
SSL/HTTPS에 대한 이론적인 내용은 여기에서 확인할 수 있다.
Spring Boot App에 SSL/HTTPS를 적용하기 위해서는 아래와 같은 절차를 거쳐야 한다.
실제로 배포하는 app은 정식 인증을 받은 SSL 인증서를 사용하지만 여기서는 Self Signed SSL 인증서를 사용한다.
self-signed SSL 인증서의 대표적인 종류 2가지
* JKS (JAVA KeyStore)의 줄임말로 PKCS12와 비슷하지만 JAVA환경에서만 사용이 가능하다.
* PKCS12 (Public Key Cryptograhic Standards)의 줄임말로 패스워드로 보호된 형식으로써, 여러 인증서 및 키를 포함할 수 있다. Java뿐만 아니라 여러 플랫폼에서 사용 가능하다.
PKCS12를 생성하는 명령어는 java의 keytool을 이용하는 것이므로, OS의 제약을 받지 않는다.
윈도우와 Linux모두 아래 명렁어를 사용해 키스토어를 생성할 수 있다.
PKC12생성하기
keytool -genkeypair -alias bootsecurity -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore bootsecurity.p12 -validity 3650
위의 명령어를 입력한 후 비밀번호를 입력하면 되고 이후에 묻는 정보는 각자 정보에 맞게 대답하고 마지막 확인하는 질문에 yes를 입력하면 keystore 생성이 완료된다.
생성된 SSL인증서를 spring boot 프로젝트의 resources 하위에 두면된다.
이제 위에서 생성한 SSL 인증서 정보를 application.yml에 입력한다.
application.yml
server:
port: 443
ssl:
enabled: true
key-store: src/main/resources/bootsecurity.p12
key-store-password:
key-store-type: PKCS12
key-alias: bootsecurity
SecurityApplication
@SpringBootApplication
public class SecurityApplication {
public static void main(String[] args) {
SpringApplication.run(SecurityApplication.class, args);
}
@Bean
public ServletWebServerFactory servletContainer() {
// Enable SSL Trafic
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
// Add HTTP to HTTPS redirect
tomcat.addAdditionalTomcatConnectors(httpToHttpsRedirectConnector());
return tomcat;
}
/*
We need to redirect from HTTP to HTTPS. Without SSL, this application used
port 8082. With SSL it will use port 8443. So, any request for 8082 needs to be
redirected to HTTPS on 8443.
*/
private Connector httpToHttpsRedirectConnector() {
Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(443);
return connector;
}
}
• ServletWebServerFactory @Bean을 선언해 SSL Traffic을 open 한다.
• httpToHttpsRedirectConnector을 생성해 8080(HTTP)의 request를 443(HTTPS)로 redirect 한다.
정식 인증을 받은 SSL 인증서를 사용하지 않고 Self Signed SSL 인증서를 사용했기 때문에 연결이 차단된다. 나중에 정식 인증을 받은 SSL 인증서를 사용하면 이 문제가 해결된다.
지금은 설정 -> 개인정보 및 보안 -> 인증서관리에 들어가서 자신이 등록한 self SSL 인증서를 항상 신뢰함으로 체크해주면 된다.
인증서를 등록해주면 localhost(안전하지 않음)으로 이동 버튼이 나온다. 이걸 눌러서 접속해주면 된다.
https로 정상적으로 접속한 화면이다.
https://minholee93.tistory.com/entry/Spring-Security-Enable-SSLHTTPS-Spring-Boot-5?category=924032
https://galid1.tistory.com/604
PKC12 생성하기는 어떻게 하는지 몰라 해맸었지만 이후에 도움이 많이 되었습니다 감사합니다