[spring] SSL 인증서 적용

공수정·2022년 5월 26일
0

spring

목록 보기
27/32

SSL 발급

  1. openSSL 다운로드
  2. openSSL.exe 실행
  3. 다음 명령어 순서대로 입력
openssl genrsa -des3 -out private.pem 2048
openssl req -new -key private.pem -out private.csr
openssl genrsa -aes256 -out rootCA.pem 2048
openssl req -x509 -new -nodes -key rootCA.pem -days 3650 -out rootCA.csr
openssl x509 -req -in private.csr -CA rootCA.csr -CAkey rootCA.pem -CAcreateserial -out private.crt -days 3650
openssl pkcs12 -export -in private.crt -inkey private.pem -out keystore -name tomcat

ssl 적용 테스트 용이라 대충 만들었어요 :)

SSL 적용

application.properties

  • keyStore 파일을 이용
server.port=8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=secret
server.ssl.key-password=another-secret
  • pem으로 인코딩된 인증서 및 개인 키 파일을 사용
server.port=8443
server.ssl.certificate=classpath:my-cert.crt
server.ssl.certificate-private-key=classpath:my-cert.key
server.ssl.trust-certificate=classpath:ca-cert.crt
server.ssl.key-store-password=secret

이렇게 설정을 하면 더이상 8080 포트에서 HTTP 연결을 지원하지 않음
8080 포트로 HTTP를, 8443 포트로 HTTPS를 연결하고 싶다면 추가적으로 설정이 필요

Class Application

/**
 * Redirect all traffic from port 8080 to 8443
 * @return
 */
@Bean
public ServletWebServerFactory servletContainer(){
	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);
		}
	};
	tomcat.addAdditionalTomcatConnectors(redirectConnector());
	return tomcat;
}

private Connector redirectConnector() {
	Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
	connector.setScheme("http");
	connector.setPort(8080);
	connector.setSecure(false);
	connector.setRedirectPort(8443);
	return connector;
}

8080의 요청을 8443으로 redirect함으로써 8080 HTTP로도 접근이 가능하고, 8443 HTTPS으로도 접근이 가능

참고
Spring Boot SSL (HTTPS) examples
Spring Enabling HTTPS (공식매뉴얼)
Spring Configure SSL (공식매뉴얼)

profile
계속해서 공부하는 개발자입니다 :)

0개의 댓글