Spring Boot 2.0에서 자체 서명 증명서를 사용한HTTPS 사용
이 튜토리얼에 따라 테스트 목적으로만 자기 서명 증명서를 사용하여 Spring Boot 2.0에서 HTTPS를 활성화합니다.요약하면 이 튜토리얼에는 다음 단계가 포함됩니다.
는 1. 키스토어를 합니다.keytool.
keytool -genkey -alias tomcat
-storetype PKCS12 -keyalg RSA -keysize 2048
-keystore keystore.p12 -validity 3650
에서 몇 가지 합니다. 스프링 부트(HTTPS)application.propertiesfilename을 클릭합니다.
server.port: 8443
server.ssl.key-store: keystore.p12
server.ssl.key-store-password: mypassword
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat
3. HTTP를 HTTPS로 리다이렉트 합니다(옵션).난 이 부분을 무시했다.
그러나 응용 프로그램을 시작할 때 다음과 같은 오류가 발생했습니다.
org.apache.catalina.LifecycleException: Failed to start component [Connector[HTTP/1.1-8443]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:225) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:255) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:197) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:300) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552) [spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:388) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:327) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1246) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1234) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at epic.gwdg.restgraph.RestgraphApplication.main(RestgraphApplication.java:10) [classes/:na]
Caused by: org.apache.catalina.LifecycleException: Protocol handler start failed
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1021) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
... 13 common frames omitted
Caused by: java.lang.IllegalArgumentException: Private key must be accompanied by certificate chain
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:116) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:87) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:225) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1150) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:591) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1018) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
... 14 common frames omitted
Caused by: java.lang.IllegalArgumentException: Private key must be accompanied by certificate chain
at java.base/java.security.KeyStore.setKeyEntry(KeyStore.java:1170) ~[na:na]
at org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:257) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
... 19 common frames omitted
2018-03-16 16:42:30.917 INFO 970 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2018-03-16 16:42:30.931 INFO 970 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-03-16 16:42:30.933 ERROR 970 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
The Tomcat connector configured to listen on port 8443 failed to start. The port may already be in use or the connector may be misconfigured.
Action:
Verify the connector's configuration, identify and stop any process that's listening on port 8443, or configure this application to listen on another port.
2018-03-16 16:42:30.934 INFO 970 --- [ main] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@58ce9668: startup date [Fri Mar 16 16:42:26 CET 2018]; root of context hierarchy
2018-03-16 16:42:30.936 INFO 970 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown
Process finished with exit code 1
기본적으로 메시지는 다음과 같습니다.
개인 키에는 인증서 체인이 함께 있어야 합니다.
이것은 자체 서명된 인증서이므로 신뢰할 수 있는 체인은 물론 없습니다.어떻게 하면 고칠 수 있죠?
이 ★★★★★★★★★★★★★★★★★★★★★★★.application.properties 삭제:
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-password=123456
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=tomcat
당신의 도움에 감사 드립니다.
문제는 생성된 키스토어에는 키쌍이 없기 때문에 개인키가 없다는 것입니다.이는 옵션 -genkeypair를 사용하여 키쌍을 변경해야 하기 때문입니다.
-genkey는 개인 키를 생성하는 반면 -genkeypair는 키 쌍(공개 키와 개인 키)을 생성합니다.
그래서 저는 이게 효과가 있을 거라고 생각합니다.
keytool -genkeypair -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
스프링 부트 구성에서 ":"를 "="로 변경하고 키 저장소에 경로를 추가합니다. keystore.p12는 리소스 폴더에 있을 것으로 생각되므로 다음과 같이 하십시오.
server.ssl.key-store = classpath:keystore.p12
server.ssl.key-store-password = mypassword
server.ssl.key-store-type = PKCS12
server.ssl.key-alias = tomcat
지독히 괴로워Private key must be accompanied by certificate chain내장된 Tomcat 서버가 있는 Spring Boot 어플리케이션에서도 오류가 발생합니다.날 미치게 만들었지
알고 보니 단순한 오타가 제 문제였습니다.
@Override
public void customize(ConfigurableServletWebServerFactory server) {
Ssl ssl = new Ssl();
ssl.setEnabled(true);
ssl.setKeyStore(keystoreFile);
ssl.setKeyPassword(keystorePass); // << Should be `setKeyStorePassword` !!!!
ssl.setKeyStoreType(keystoreType);
ssl.setKeyAlias(keystoreAlias);
server.setSsl(ssl);
server.setPort(sslPort);
}
따라서 오류 메시지는 이 경우 전혀 도움이 되지 않습니다.이게 다른 사람에게 도움이 됐으면 좋겠어요.올바른 패스워드(키와 키스토어)를 올바른 위치에 입력했는지 확인합니다.속성 기반 설정에서도 동일한 문제가 발생할 수 있습니다. 이는 작업 내용에 따라 다릅니다.
application.properties 파일에서 작은 실수를 했습니다.바꿔주세요
server.ssl.key-password=your_password
로.
server.ssl.key-store-password=your_password
그럼 잘 될 거예요.도움이 됐으면 좋겠다!감사해요!
1. "-genkeypair"를 사용합니다.
keytool -genkeypair -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
- "server.ssl.key-password"를 "server.ssl.key-store-password"로 변경합니다.
비슷한 문제가 있었습니다.저도 트러스트 스토어에서 trustAnchors를 찾을 수 없었습니다.
하나의 해결책은 다른 답변에서 설명한 바와 같이 Java 내장 키툴을 사용하는 것입니다.그러나 KeyStore Explorer GUI를 사용하는 가장 간단한 방법이 있으므로 두 툴을 모두 사용하여 전체 단계를 설명합니다.
1. 먼저 답변에서 설명한 바와 같이 SSL을 netable로 해야 합니다.application.properties파일:
# <======= SSL Security ===========>
# Keystore config
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=change_it!
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-alias=alias
server.ssl.enabled=true
# Trust Store Certificates
server.ssl.trust-store=classpath:trust_store.p12
server.ssl.trust-store-type=PKCS12
server.ssl.trust-store-password=07123e1f482356c415f684407
# <=====================>
Keystore는 서버가 클라이언트와 안전하게 통신하기 위해 사용하는 공용 - 개인 키 쌍의 컨테이너입니다.물론 클라이언트는 서버와 통신할 수 있도록 공개 키를 가지고 있어야 합니다.
신뢰 스토어는 단순히 인증서 컨테이너입니다.(공개 키).이 경우 서버에 의해 사용되는 증명서는 1개뿐입니다.
2.1 Java를 사용한 키스토어 생성keytool:
keytool -genkeypair -alias alias -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650
2.2 증명서를 내보내고 이를 사용하여 트러스트 스토어 키스토어를 만듭니다.
keytool -export -keystore keystore.p12 -alias alias -file certificate.cer
2.3 이 절차에서는 Import된 신뢰할 수 있는 증명서를 사용하여 새로운 키스토어가 자동으로 생성됩니다.(새로운 키 스트로어의 패스워드가 요구되며 "Trust this certificate?"라는 메시지가 뜨면 당연히 "yes"라고 입력해야 합니다.)
keytool -importcert -file certificate.cer -keystore trust_store.p12 -alias alias
마지막으로 Spring Boot App의 Resources 폴더에 두 키스토어를 저장합니다(대체 접근법 참조).
KeyStore Explorer를 통한 대체 접근법
2.1 스크린샷과 같이 KeyStore Explorer를 사용하여 키스토어를 만듭니다.
다음으로 Spring Boot App의 Resources 폴더에 키스토어를 저장합니다.
2.2 이제 트러스트 스토어를 작성해야 합니다.트러스트 스토어는 서버와 통신할 필요가 있는 클라이언트에 제공할 수 있습니다.먼저 스크린샷과 같이 KeyStore Explorer에서 생성된 증명서 체인을 추출한 후 KeyStore 내에 증명서를 Import하는 새로운 KeyStore를 만듭니다.
신뢰 스토어를 작성하려면 이전 절차와 같이 PKCS12 형식의 "Create a new KeyStore"를 클릭하고 빨간색 아이콘 "Import trusted certificate"를 클릭한 후 이전 절차에서 저장한 증명서를 선택하고 마지막으로 첫 번째 키스토어 작성과 마찬가지로 리소스 폴더에 키스토어를 저장합니다.
이것으로, 서버가 SSL 시큐러티와 통신할 수 있게 됩니다.작성한 신뢰 스토어를 로드하도록 클라이언트를 설정해야 합니다.
스프링 부트 2.2.1풀어주다
keytool -genkeypair -keystore myKeystore2.p12 -storetype PKCS12 -storepass 123456 -alias ks-localhost -keyalg RSA -keysize 2048 -validity 99999 -dname "CN=My SSL Certificate, OU=My Team, O=My Company, L=My City, ST=My State, C=SA" -ext san=dns:localhost,ip:127.0.0.1
application.yml
server:
tomcat:
accesslog:
enabled: true
ssl:
key-store-type: PKCS12
key-store: classpath:myKeystore.p12
key-alias: ks-localhost
enabled: true
protocol: TLS
key-store-password: 123456
저도 같은 문제가 있었어요.두 번째 답변부터 수정했습니다.하지만 문제는 사라지지 않았다.모든 작업을 마치고 프로파일 섹션에 pom.xml에 대한 keystore.p12 증명서를 포함시켰습니다.
<profiles>
<!-- DEVELOPMENT PROFILE -->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>application.properties</include>
<include>keystore.p12</include>
<include>data/**</include>
</includes>
</resource>
</resources>
</build>
</profile>
</profiles>
언급URL : https://stackoverflow.com/questions/49324700/enable-https-with-self-signed-certificate-in-spring-boot-2-0
'programing' 카테고리의 다른 글
| 스크롤 시 CSS 변경 각도 스타일 (0) | 2023.03.21 |
|---|---|
| 'crypto-crypto'는 알려진 요소가 아닙니다. (0) | 2023.03.21 |
| WordPress add_rewrite_rule은 로컬로 동작하지만 서버에서는 동작하지 않습니다. (0) | 2023.03.21 |
| 각도, 한계값 대상 및 $index별 추적 (0) | 2023.03.21 |
| React.render() 내의 여러 요소를 반환합니다. (0) | 2023.03.21 |


