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]
에 이어집니다.