簡體   English   中英

具有雲駐留密鑰庫和信任庫(秘密管理器)的相互認證(雙向 TLS/SSL)-Spring 啟動

[英]Mutual Authentication(Two-Way TLS/SSL) with cloud residing KeyStores and TrustStores(Secret Manager) -Spring boot


我正在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

休息模板配置

   @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 通信怎么辦

您的應用程序可能必須信任您與之通信的另一個應用程序使用的證書,並且該證書由同一家公司管理。 在這種情況下,您可以在本地創建一個信任庫並使用它。 您不需要通常用於網站的公司簽署的證書。

您不需要在這兩個地方都設置密鑰庫/信任庫。 我首選的設置密鑰庫和信任庫的方法:

@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

區別在於上游和下游配置。

應用程序屬性:

當您將 application.properties 與server.ssl.*一起使用時,您實際上是在配置您的服務器端。 即您正在創建server.port以接受具有指定server.ssl.key https 流量。 server.ssl.client-auth=need指定客戶端的瀏覽器(或其他應用程序)應使用客戶端證書來通過身份驗證。 server.ssl.trust-store指定可信客戶端的證書。

ssl上下文:

當您使用sslContext您正在配置從 Java 應用程序到外部服務的出站連接。 並且您使用loadKeyMaterialloadTrustMaterial在您的應用程序中使用某些第三方服務。 loadTrustMaterial指定您信任的服務器證書, loadKeyMaterial指定您的應用程序應該使用哪個密鑰連接到某個資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM