【问题标题】:Mutual Authentication(Two-Way TLS/SSL) with cloud residing KeyStores and TrustStores(Secret Manager) -Spring boot具有云驻留密钥库和信任库(秘密管理器)的相互身份验证(双向 TLS/SSL)-Spring 启动
【发布时间】:2021-01-31 23:29:28
【问题描述】:


我正在研究 Spring Boot 中的相互身份验证,我可以在本地实现它并且运行平稳。
但我想从 Amazon/Google 证书中获取证书/存储经理或可能来自 s3 存储桶。

以前的配置
因为我在当地有商店,这样我就可以买到它们

#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 配置

   @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);
}

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


我真的很困惑为什么我们在 config(appPropeties) 和 sslContext 中都使用存储。有什么不同 ?
我不能只将它们设置在 sslContext 吗?如果我能做到这一点,我可以从云中获取它们,将其处理到密钥库和信任库中,立即设置它们。
*有更好的工作方法吗?*
请原谅,如果这看起来很蹩脚,我是安全新手,所以我仍在弄清楚事情是如何运作的。

**还有一个问题**
  • 在典型的客户端服务器设置(多台服务器)中,如果我想在双向 TLS 上与 server1 通信,在 http(无 ssl)上与 server2 通信,该怎么办

【问题讨论】:

    标签: java spring ssl aws-secrets-manager mutual-authentication


    【解决方案1】:

    区别在于上游和下游配置。

    application.properties:

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

    sslContext:

    当您使用 sslContext 时,您正在配置从 Java 应用程序到外部服务的出站连接。你使用loadKeyMaterialloadTrustMaterial 在你的应用程序中使用一些第三方服务。 loadTrustMaterial 指定您信任的服务器证书,loadKeyMaterial 指定您的应用应使用哪个密钥来连接某些资源。

    【讨论】:

      【解决方案2】:

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

      您不需要在这两个地方都设置密钥库/信任库。我首选的设置密钥库和信任库的方式:

      @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

      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
      

      【讨论】:

      • 嘿,但这不是我要找的。我根本不想弄乱应用程序属性。想要类文件本身中的所有内容
      猜你喜欢
      • 1970-01-01
      • 2019-11-28
      • 2014-06-26
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      相关资源
      最近更新 更多