복붙노트

[SPRING] Spring 부트와 Tomcat으로 .keystore 파일을 어떻게 지정합니까?

SPRING

Spring 부트와 Tomcat으로 .keystore 파일을 어떻게 지정합니까?

스프링 부트의 임베디드 Tomcat 인스턴스와 함께 작동하도록 스프링 보안을 설정하려고합니다. 이 작업을 수행하는 데 필요한 몇 가지 기본 샘플이 있지만 HTTP (HTTPS가 아닌)를 통해 기본 인증을 수행합니다.

Tomcat 구성 파일 (server.xml)에 액세스 할 수 있다면 작동시킬 수 있지만 Spring Boot는 내장 된 Tomcat 인스턴스 (그렇지 않으면 큰 편리함)를 사용하기 때문에 Tomcat 구성 파일에 액세스 할 수 없습니다. , 내 지식이 아닙니다.)

이것에 대한 application.properties 설정이있을 수 있지만 추적 할 수 없었습니다. application.properties의 server.contextPath 필드에 대한 참조를 보았습니다.이 필드는 대체 Tomcat 구성 파일과 관련이 있다고 생각합니다. 관련성이 있다고하더라도 어쨌든 어디에서 시작해야할지 모르겠다. 내가 본 Tomcat SSL 지침은 처음부터 기존 server.xml 파일을 편집하는 것으로 시작한다.

Spring Boot로 할 수 있습니까? (server.xml의 스 니펫을 지정하거나 다른 방법을 통해)? 그렇지 않다면, 이것을하는 가장 간단한 방법은 무엇입니까? Spring Boot의 Tomcat 구성 요소를 제외해야 할 수도 있음을 이해합니다. 그러나 가능한 경우이를 피하는 것이 좋습니다.

해결법

  1. ==============================

    1.Spring Boot 1.2부터는 application.properties 또는 application.yml을 사용하여 SSL을 구성 할 수 있습니다. 다음은 application.properties의 예입니다.

    Spring Boot 1.2부터는 application.properties 또는 application.yml을 사용하여 SSL을 구성 할 수 있습니다. 다음은 application.properties의 예입니다.

    server.port = 8443
    server.ssl.key-store = classpath:keystore.jks
    server.ssl.key-store-password = secret
    server.ssl.key-password = another-secret
    

    application.yml과 동일합니다.

    server:
      port: 8443
      ssl:
        key-store: classpath:keystore.jks
        key-store-password: secret
        key-password: another-secret
    

    다음은 현재 참조 문서에 대한 링크입니다.

  2. ==============================

    2.여러 프로젝트에서 소스 코드를 읽는 데 필요한 시간 이후로 '적절한'방법을 찾지 못했지만이 방법이 있습니다. 즉, 이것은 바보 같은 일이 될 수 있습니다 (그러나 작동합니다).

    여러 프로젝트에서 소스 코드를 읽는 데 필요한 시간 이후로 '적절한'방법을 찾지 못했지만이 방법이 있습니다. 즉, 이것은 바보 같은 일이 될 수 있습니다 (그러나 작동합니다).

    첫째, 임베디드 Tomcat의 server.xml에서 확장하거나 대체 할 수있는 방법이 없습니다. 프로그래밍 방식으로 수행해야합니다.

    둘째, 'require_https'설정은 인증서 정보를 그렇게 설정할 수 없으므로 도움이되지 않습니다. 그것은 http에서 https 로의 포워딩을 설정하지만 https가 작동하도록하는 방법을 제공하지 않으므로 포워딩은 도움이되지 않습니다. 그러나 https를 작동시키는 아래 항목과 함께 사용하십시오.

    시작하려면 Embedded Servlet Container Support 문서에 설명 된대로 EmbeddedServletContainerFactory를 제공해야합니다. 워드 프로세서는 Java 용이지만 Groovy는 거의 비슷하게 보입니다. 해당 예제에서 사용 된 @Value 주석을 인식하도록 만들지는 못했지만 필요하지는 않습니다. Groovy를 사용하려면이 파일을 새로운 .groovy 파일에 넣고 봄 부팅을 시작할 때 해당 파일을 명령 줄에 포함 시키십시오.

    이제 지침에서는 web.xml 동작을 변경할 수 있도록 해당 코드에서 만든 TomcatEmbeddedServletContainerFactory 클래스를 사용자 정의 할 수 있으며 이것이 사실이지만 서버 용도에 맞게 사용할 수 있다는 것을 알고 있어야합니다. .xml 동작. 실제로 클래스의 소스를 읽고 Embedded Tomcat 문서와 비교하면 이것이 유일한 곳이라는 것을 알 수 있습니다. 흥미로운 기능은 TomcatEmbeddedServletContainerFactory.addConnectorCustomizers ()입니다.이 기능은 Javadocs에서 많이 보이지는 않지만 실제로 사용자 정의 할 수있는 Embedded Tomcat 객체를 제공합니다. TomcatConnectorCustomizer의 구현을 전달하고 void customize (Connector con) 함수에서 원하는 커넥터를 설정하기 만하면됩니다. 이제 커넥터로 할 수있는 10 억 가지가 있습니다. 유용한 문서를 찾을 수는 없지만,이 개인용 Spring-embedded-Tomcat 프로젝트의 createConnector () 함수는 매우 실용적인 가이드입니다. 내 구현은 다음과 같이 보였다.

    package com.deepdownstudios.server
    
    import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer
    import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory
    import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
    import org.apache.catalina.connector.Connector;
    import org.apache.coyote.http11.Http11NioProtocol;
    import org.springframework.boot.*
    import org.springframework.stereotype.*
    
    @Configuration
    class MyConfiguration {
    
    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
    final int port = 8443;
    final String keystoreFile = "/path/to/keystore"
    final String keystorePass = "keystore-password"
    final String keystoreType = "pkcs12"
    final String keystoreProvider = "SunJSSE"
    final String keystoreAlias = "tomcat"
    
    TomcatEmbeddedServletContainerFactory factory = 
            new TomcatEmbeddedServletContainerFactory(this.port);
    factory.addConnectorCustomizers( new TomcatConnectorCustomizer() {
        void    customize(Connector con) {
            Http11NioProtocol proto = (Http11NioProtocol) con.getProtocolHandler();
                proto.setSSLEnabled(true);
            con.setScheme("https");
            con.setSecure(true);
            proto.setKeystoreFile(keystoreFile);
            proto.setKeystorePass(keystorePass);
            proto.setKeystoreType(keystoreType);
            proto.setProperty("keystoreProvider", keystoreProvider);
            proto.setKeyAlias(keystoreAlias);
        }
    });
    return factory;
    }
    }
    

    Autowiring은이 구현을 실행합니다. 일단 파열 된 keystore 파일을 수정했다면 (keytool을 -storetype pkcs12로 호출하고 pkcs12를 다른 곳에서보고 한 것처럼 저장하지 마십시오)이 방법이 효과적이었습니다. 또한, 테스트와 같은 구성 설정으로 매개 변수 (포트, 비밀번호 등)를 제공하는 것이 훨씬 더 좋을 것입니다. @Value 주석을 Groovy로 작업 할 수 있다면 가능할 것이라고 확신합니다.

  3. ==============================

    3.외부 키 저장소의 경우 "file :"접두사가 붙습니다.

    외부 키 저장소의 경우 "file :"접두사가 붙습니다.

    server.ssl.key-store=file:config/keystore 
    
  4. ==============================

    4.커넥터 사용자 정의 프로그램을 구현하지 않으려는 경우 미리 정의 된 커넥터 사용자 정의 프로그램을 제공하는 라이브러리 (https://github.com/ycavatars/spring-boot-https-kit)를 빌드하고 가져올 수 있습니다. README에 따르면 키 저장소를 만들고 connector.https. *를 구성하고 라이브러리를 가져오고 @ComponentScan ( "org.ycavatars.sboot.kit")을 추가하기 만하면됩니다. 그러면 HTTPS 연결이 생깁니다.

    커넥터 사용자 정의 프로그램을 구현하지 않으려는 경우 미리 정의 된 커넥터 사용자 정의 프로그램을 제공하는 라이브러리 (https://github.com/ycavatars/spring-boot-https-kit)를 빌드하고 가져올 수 있습니다. README에 따르면 키 저장소를 만들고 connector.https. *를 구성하고 라이브러리를 가져오고 @ComponentScan ( "org.ycavatars.sboot.kit")을 추가하기 만하면됩니다. 그러면 HTTPS 연결이 생깁니다.

  5. ==============================

    5.Groovy에서 구현 된 커스터마이져의 예제는 다음과 같습니다.

    Groovy에서 구현 된 커스터마이져의 예제는 다음과 같습니다.

    https://github.com/UniconLabs/orville/blob/master/web/src/main/groovy/org/apereo/openregistry/config/TomcatSslConfiguration.groovy

  6. from https://stackoverflow.com/questions/19613562/how-can-i-specify-my-keystore-file-with-spring-boot-and-tomcat by cc-by-sa and MIT license