java keytool 사용 / 스프링부트 SSL 설정

2018. 3. 1. 11:52공부/SPRING

java keytool 사용 / 스프링부트 SSL 설정




https://www.drissamri.be/blog/java/enable-https-in-spring-boot/


위 링크에 가시면 짧고 굵은 내용이 있습니다.

아래는 안 보셔도 됩니다.




#1 java keytool 옵션


C:\Program Files\Java\jdk1.8.0_152\bin>keytool

키 및 인증서 관리 툴


명령:


 -certreq            인증서 요청을 생성합니다.

 -changealias        항목의 별칭을 변경합니다.

 -delete             항목을 삭제합니다.

 -exportcert         인증서를 익스포트합니다.

 -genkeypair         키 쌍을 생성합니다.

 -genseckey          보안 키를 생성합니다.

 -gencert            인증서 요청에서 인증서를 생성합니다.

 -importcert         인증서 또는 인증서 체인을 임포트합니다.

 -importpass         비밀번호를 임포트합니다.

 -importkeystore     다른 키 저장소에서 하나 또는 모든 항목을 임포트합니다.

 -keypasswd          항목의 키 비밀번호를 변경합니다.

 -list               키 저장소의 항목을 나열합니다.

 -printcert          인증서의 콘텐츠를 인쇄합니다.

 -printcertreq       인증서 요청의 콘텐츠를 인쇄합니다.

 -printcrl           CRL 파일의 콘텐츠를 인쇄합니다.

 -storepasswd        키 저장소의 저장소 비밀번호를 변경합니다.





#2 keytool -genkeypair


C:\Program Files\Java\jdk1.8.0_152\bin>keytool -genkeypair -help

keytool -genkeypair [OPTION]...


키 쌍을 생성합니다.


옵션:


 -alias <alias>                  처리할 항목의 별칭 이름

 -keyalg <keyalg>                키 알고리즘 이름

 -keysize <keysize>              키 비트 크기

 -sigalg <sigalg>                서명 알고리즘 이름

 -destalias <destalias>          대상 별칭

 -dname <dname>                  식별 이름

 -startdate <startdate>          인증서 유효 기간 시작 날짜/시간

 -ext <value>                    X.509 확장

 -validity <valDays>             유효 기간 일 수

 -keypass <arg>                  키 비밀번호

 -keystore <keystore>            키 저장소 이름

 -storepass <arg>                키 저장소 비밀번호

 -storetype <storetype>          키 저장소 유형

 -providername <providername>    제공자 이름

 -providerclass <providerclass>  제공자 클래스 이름

 -providerarg <arg>              제공자 인수

 -providerpath <pathlist>        제공자 클래스 경로

 -v                              상세 정보 출력

 -protected                      보호되는 메커니즘을 통한 비밀번호





#3 개발환경에서 사용할 키 생성 ( 이렇게 하면 삽질입니다 / #3 ~#8 은 삽질의 흔적 )


C:\Program Files\Java\jdk1.8.0_152\bin>keytool -genkeypair -alias tomcat

키 저장소 비밀번호 입력:

이름과 성을 입력하십시오.

  [Unknown]:

조직 단위 이름을 입력하십시오.

  [Unknown]:

조직 이름을 입력하십시오.

  [Unknown]:

구/군/시 이름을 입력하십시오?

  [Unknown]:

시/도 이름을 입력하십시오.

  [Unknown]:

이 조직의 두 자리 국가 코드를 입력하십시오.

  [Unknown]:

CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown이(가) 맞습니까?

  [아니오]:  예


<tomcat>에 대한 키 비밀번호를 입력하십시오.

        (키 저장소 비밀번호와 동일한 경우 Enter 키를 누름):


Warning:

JKS 키 저장소는 고유 형식을 사용합니다. "keytool -importkeystore -srckeystore C:\Users\iwan2\.keystore -destkeystore C:\Users\iwan2\.keystore -deststoretype pkcs12"를 사용하는 산업 표준 형식인 PKCS12로 이전하는 것이 좋습니다.





#4 저장된 키 확인


C:\Program Files\Java\jdk1.8.0_152\bin>keytool -list

키 저장소 비밀번호 입력:

키 저장소 유형: JKS

키 저장소 제공자: SUN


키 저장소에 1개의 항목이 포함되어 있습니다.


tomcat, 2018. 3. 1, PrivateKeyEntry,

인증서 지문(SHA1): 41:24:1D:31:D1:AE:73:B9:40:5D:F8:01:F4:11:3B:16:36:EE:0A:B1


Warning:

JKS 키 저장소는 고유 형식을 사용합니다. "keytool -importkeystore -srckeystore C:\Users\iwan2\.keystore -destkeystore C:\Users\iwan2\.keystore -deststoretype pkcs12"를 사용하는 산업 표준 형식인 PKCS12로 이전하는 것이 좋습니다.




#5 .keystore 파일 확인






#6 cer 파일 export ( 폴더지정을 안 했더니 액세스 거부 )


C:\Program Files\Java\jdk1.8.0_152\bin>keytool -export -alias tomcat -rfc -file tomcat.cer

키 저장소 비밀번호 입력:

keytool 오류: java.io.FileNotFoundException: tomcat.cer (액세스가 거부되었습니다)


C:\Program Files\Java\jdk1.8.0_152\bin>keytool -export -alias tomcat -rfc -file C:\Users\iwan2\tomcat.cer

키 저장소 비밀번호 입력:

인증서가 <C:\Users\iwan2\tomcat.cer> 파일에 저장되었습니다.


Warning:

JKS 키 저장소는 고유 형식을 사용합니다. "keytool -importkeystore -srckeystore C:\Users\iwan2\.keystore -destkeystore C:\Users\iwan2\.keystore -deststoretype pkcs12"를 사용하는 산업 표준 형식인 PKCS12로 이전하는 것이 좋습니다.





#7 tomcat.cer 확인






#8 trust-store 생성 ( 폴더지정을 안 하면 역시 오류남 )


C:\Program Files\Java\jdk1.8.0_152\bin>keytool -import -alias tomcat -file C:\Users\iwan2\tomcat.cer -keystore C:\Users\iwan2\tomcat.ts

키 저장소 비밀번호 입력:

새 비밀번호 다시 입력:

소유자: CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown

발행자: CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown

일련 번호: a5e2303

적합한 시작 날짜: Thu Mar 01 10:33:23 KST 2018 종료 날짜: Wed May 30 10:33:23 KST 2018

인증서 지문:

         MD5:  FB:7A:28:70:1C:FE:06:5E:E5:E5:C4:95:9B:FA:A5:D1

         SHA1: 41:24:1D:31:D1:AE:73:B9:40:5D:F8:01:F4:11:3B:16:36:EE:0A:B1

         SHA256: FA:AC:F8:A8:95:2E:C8:B7:9C:EC:91:FF:5E:D7:E1:9A:7A:01:1D:68:73:5A:B1:39:14:B7:23:C8:2F:FE:55:60

서명 알고리즘 이름: SHA256withDSA

주체 공용 키 알고리즘: 2048비트 DSA 키

버전: 3


확장:


#1: ObjectId: 2.5.29.14 Criticality=false

SubjectKeyIdentifier [

KeyIdentifier [

0000: 65 F1 F6 71 CE FA 1E 55   ED 55 DC D5 20 5F AE F3  e..q...U.U.. _..

0010: 7C 6B 81 58                                        .k.X

]

]


이 인증서를 신뢰합니까? [아니오]:  예

인증서가 키 저장소에 추가되었습니다.





#9 하지만 지원되지 않는 프로토콜..






#10 정상적인 방법 ( -keyalg RSA : 키 알고리즘을 RSA로 해야 함 )


C:\Program Files\Java\jdk1.8.0_152\bin>keytool -genkeypair -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore C:\Users\iwan2\keystore.p12 -validity 3650

키 저장소 비밀번호 입력:

새 비밀번호 다시 입력:

이름과 성을 입력하십시오.

  [Unknown]:

조직 단위 이름을 입력하십시오.

  [Unknown]:

조직 이름을 입력하십시오.

  [Unknown]:

구/군/시 이름을 입력하십시오?

  [Unknown]:

시/도 이름을 입력하십시오.

  [Unknown]:

이 조직의 두 자리 국가 코드를 입력하십시오.

  [Unknown]:

CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown이(가) 맞습니까?

  [아니오]:  예





#11 스프링부트 설정 - application.properties


server.port: 8443
server.ssl.key-store: keystore.p12
server.ssl.key-store-password: mypassword
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat





#12 스프링부트 설정 - @Configuration class ( http 요청을 https 로 redirect )


@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
@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(initiateHttpConnector());
return tomcat;
}
private Connector initiateHttpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}




톰캣 웹 서비스에 Letsencrypt SSL 적용하기.. (실패->성공) 출처: http://iwan2fly.tistory.com/203?category=0 [Dreaming]


에 이어집니다.