터미널 창을 하나 띄워서 아래의 코드를 입력하여 실행한다.
줄 바꿈 하지말고 한 줄에 다 써서 실행할 것.
keytool -genkey -alias '원하는 이름' -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=지정한 비밀번호
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=지정한 alias 이름
2번 과정까지 정상적으로 마쳤다면 HTTPS가 되었을 것이다.
Application을 실행하여 https로 localhost에 접속해보자.
https://localhost:8080 로 접속해보면 아마도 아래와 같이 뜰 것이다.
왜?
1번 과정에서 생성했던 keystore에는 HTTPS에 대한 인증서가 들어있다.
그리고 HTTPS로 웹 서버에 요청을 보낼 경우 웹 브라우저는 이러한 인증서를 검증한다.
하지만 이 인증서는 웹 페이지의 안전성을 확인하는 공인된 단체가 발급해 준 것이 아닌,
공부 차원에서 개인인 본인이 임의로 만든 인증서이기에
브라우저는 당연히 안전하다고 확인된 인증서 리스트에 '개인'인 내가 만든 인증서는
없으니까 경고 메시지를 띄운다.
그냥 무시하고 '고급' 버튼 눌러서 localhost로 이동해보면 정상적으로 페이지가 나타난다.
curl -I -k --http2 https://localhost:8080/hello
정상이면 200 메시지를 받을 것이다.
기본적으로 HTTP 혹은 HTTPS에 접속하게 해주는 'HTTP Connector'는 하나만 제공된다.
때문에, HTTPS를 활성화하면 HTTP로는 접속할 수 없게 된다.
하지만,
설정을 통해서 이 둘 모두 접속 가능하게 할 수 있다.
실행부(Application.java)에 아래 코드를 추가한다.
@SpringBootApplication
@RestController
public class Application {
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createStandardConnector());
return tomcat;
}
private Connector createStandardConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setPort(8080);
return connector;
}
@GetMapping("/hello")
public String hello(){
return "hey spring";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
앞에서 생성한 'HTTP Connector'에 setPort()로 8080 포트를 지정해 줬다.
HTTP Connector 포트와 HTTPS Connector 포트가 겹치면 안되기 때문에
HTTPS 활성화 - 2번 과정에서 작성했던 application.properties에서
HTTPS 포트 번호 설정을 추가 해준다.
server.port=8443
앞서 curl로 HTTPS 페이지 응답이 정상적으로 되는지 확인했던 메시지를 다시 주의깊게 살펴보면
curl 요청 당시 HTTP/2로 요청을 했지만 응답 결과는 HTTP/1.1 임을 알 수 있다.
본래 요청한 HTTP/2로 요청 및 응답 되도록 설정 해보자.
매우 간단 . . .
application.properties 에 아래 코드를 추가한다.
server.http2.enabled=true
끝이다. . .