【问题标题】:Setting Keystore file location using system properties which is inside resources directory of Spring boot使用 Spring Boot 资源目录中的系统属性设置 Keystore 文件位置
【发布时间】:2018-08-12 23:46:55
【问题描述】:

我的 .jks 文件放在 spring boot 应用程序的资源目录中,现在我需要使用系统属性配置密钥库。尝试了各种方法,例如使用System.setProperty("javax.net.ssl.keyStore", "abc.jks"); System.setProperty("javax.net.ssl.keyStore", "classpath:abc.jks"); 设置属性,除了在文件系统System.setProperty("javax.net.ssl.keyStore", "D:/../abc.jks"); 中提供完整路径之外,没有其他工作。如何配置系统属性值,使其工作。我不希望为嵌入式 tomcat 启用它。只是想把它设置到jvm。

【问题讨论】:

  • “没有用”不是一个有用的陈述。 什么没用?您没有提供足够的信息来解决您的问题。发布有关您的设置的详细信息。发布您尝试过的内容。发布您的错误消息。
  • System.setProperty("javax.net.ssl.keyStore", "target/classes/abc.jks");

标签: java spring ssl spring-boot


【解决方案1】:

你需要这样的东西:

application.properties

server.port: 8443
server.ssl.key-store: classpath:${KEYSTORE:keystore.p12}
server.ssl.key-store-password: password
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat

这将查找系统属性 KEYSTORE,如果没有,它将默认为 keystore.p12,因此应用程序可以像这样运行:

java -jar target/spring-boot-https-1.0.jar 

或

java -DKEYSTORE=anotherKeystore.p12 -jar target/spring-boot-https-1.0.jar

如果keystore.p12在resources目录下,你需要做的就是测试

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloControllerIT {

    @LocalServerPort
    private int port;

    private RestTemplate template;

    @Before
    public void setUp() throws Exception {
        createTemplateFromKeyStore("keystore.p12");
    }

    @Test
    public void getHello() throws Exception {
        ResponseEntity<String> response = template.getForEntity("https://localhost:" + port + "/", String.class);
        assertThat(response.getBody(), equalTo("Greetings from Spring Boot!"));
    }

    private void createTemplateFromKeyStore(String keyStoreName) {
        try {
            InputStream keyStoreInputStream = getClass().getResourceAsStream(keyStoreName);
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(keyStoreInputStream, null);

            SSLContext sslContext = SSLContexts.custom()
                    .loadKeyMaterial(keyStore, "password".toCharArray())
                    .loadTrustMaterial(keyStore, new TrustAllStrategy()).build();

            HttpClient httpClient = HttpClients.custom().setSSLContext(sslContext)
                    .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build();

            HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
            requestFactory.setHttpClient(httpClient);

            template = new RestTemplate(requestFactory);
        } catch (IOException | GeneralSecurityException e) {
            throw new RuntimeException(e);
        }
    }
}

见example project

说了这么多你最好还是使用spring profiles 并拥有多个application.properties

application-dev.properties
application-prod.properties

其中包含不同的值并从命令行进行控制

java -Dspring.profiles.active=dev -jar target/spring-boot-https-1.0.jar

【讨论】:

  • 感谢回复,但我不想设置为嵌入式tomcat,而是想设置为jvm。
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多