首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有云驻留的KeyStores和TrustStores(秘密管理器) -Spring引导的双向身份验证(双向TLS/SSL)

具有云驻留的KeyStores和TrustStores(秘密管理器) -Spring引导的双向身份验证(双向TLS/SSL)
EN

Stack Overflow用户
提问于 2020-10-17 18:50:43
回答 2查看 1.4K关注 0票数 0

我正在研究在spring 中的相互认证,我可以在本地实现它,并且它运行平稳。

但是我想从亚马逊/谷歌证书管理器那里获得证书/商店,或者可能是从s3桶。

以前的配置

因为我在当地有商店,这样我就能买到它们。

代码语言:javascript
运行
复制
#ApplicationProperties.yaml
server.ssl.enabled=true
#KeyStore
server.ssl.key-alias=1
server.ssl.key-store=classpath:clientKeystore.p12
server.ssl.key-store-password=whatever

#TrustStore
server.ssl.trust-store=classpath:clientTrustStore.p12
server.ssl.trust-store-password=possiblyAnything
server.ssl.client-auth=need

RestTemplate配置

代码语言:javascript
运行
复制
   @Value("${server.ssl.trust-store}")
   private String trustStorePath;
   @Value("${server.ssl.trust-store-password}")
   private String trustStorePass;
   @Value("${server.ssl.key-store}")
   private String keyStorePath;
   @Value("${server.ssl.key-store-password}")
   private String keyStorePass;
   @Value("${server.ssl.key-alias}")
@Bean
public RestTemplate restTemplate()       
{
         SSLContext sslContext = null;
         SSLConnectionSocketFactory sslSocketFactory = 
                 new SSLConnectionSocketFactory(sslContext,NoopHostnameVerifier.INSTANCE);
         sslContext = new SSLContextBuilder()
                       .loadKeyMaterial(keystore, keyStorePassword)
                       .loadTrustMaterial(trustStore,new TrustSelfSignedStrategy())
                       .build();
          HttpClient httpClient  = HttpClients.custom().setSSLSocketFactory(sslSocketFactory).build();
           HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
           requestFactory.setHttpClient(httpClient);
           return new RestTemplate(requestFactory);
}

现在在云中有相同的信任库和密钥存储库,我想在应用程序加载/启动时获取它们。

我真的很困惑,为什么我们在配置(AppPropeties)和sslContext中都使用存储。有什么区别吗?

我就不能把他们单独安排在sslContext吗?如果我能做到这一点,我就可以从云中获取它们,将其处理到密钥库和信任库中,并立即设置它们。

*是否有更好的工作方法?

抱歉,如果这看起来很烂,我对保安还不熟悉,所以我还是在搞清楚事情是怎么运作的。

**还有一个问题**

在典型的客户端服务器设置(多个服务器)中的

  • ,如果我想在相互的TLS上与server1通信,在http(没有ssl)

上与server2通信怎么办?

EN

回答 2

Stack Overflow用户

发布于 2020-10-17 21:47:21

可能会发生这样的情况:您的应用程序必须信任正在与您通信的另一个应用程序使用并由同一公司管理的证书。在这种情况下,您可以在本地创建信任存储并使用它。您不需要由一家公司签署的证书,该证书通常用于网站。

您不需要在这两个地方设置密钥库/信任库。我喜欢设置密钥库和信任库的方法:

代码语言:javascript
运行
复制
@Configuration
public class SSLConfig {
    @Autowired private Environment env;

    @PostConstruct
    private void configureSSL() {
        System.setProperty("javax.net.ssl.keyStore", env.getProperty("server.ssl.key-store"));
        System.setProperty("javax.net.ssl.keyStorePassword", env.getProperty("server.ssl.key-store-password"));
        System.setProperty("javax.net.ssl.trustStore", env.getProperty("server.ssl.trust-store"));
        System.setProperty("javax.net.ssl.trustStorePassword", env.getProperty("server.ssl.trust-store-password"));
    }
}

application.properties

代码语言:javascript
运行
复制
server.ssl.key-store=keystores/client.jks
server.ssl.key-store-password=changeit
server.ssl.trust-store=keystores/mycustom.truststore
server.ssl.trust-store-password=changeit
票数 1
EN

Stack Overflow用户

发布于 2020-11-06 14:48:05

不同之处在于上下游配置。

application.properties:

当您将application.properties与server.ssl.*一起使用时,您实际上正在配置服务器端。也就是说,您正在创建server.port以接受具有指定server.ssl.key的https流量。server.ssl.client-auth=need指定客户端浏览器(或其他应用程序)应该使用客户端证书通过身份验证。server.ssl.trust-store指定受信任客户端的证书。

sslContext:

当您使用sslContext时,您正在配置从java应用程序到外部服务的出站连接。您可以使用loadKeyMaterialloadTrustMaterial在应用程序中使用第三方服务。loadTrustMaterial指定您要信任的服务器证书,loadKeyMaterial指定应用程序应该使用哪个键连接到某些资源。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64406149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档