簡體   English   中英

強制客戶端或服務器重新啟動 SSL 握手(或終止 SSL 會話)

[英]Force client or server to restart SSL handshake (or expire SSL session)

我有一個 java 客戶端,它連接到一個 HTTPS 服務器(也用 Java 編寫的服務器)。 這是客戶端中的 HttpClient 設置:

SSLContext ctx = SSLContext.getInstance("TLSv1.2");
keyManagers = ...; // Created from a PKIX KeyManagerFactory
trustManagers = ...; // Created from a PKIX TrustManagerFactory
ctx.init(keyManagers, trustManagers, new SecureRandom());
SSLContext.setDefault(ctx);

RequestConfig defaultRequestConfig = RequestConfig.custom()//
       .setSocketTimeout(5000)//
       .setConnectTimeout(5000)//
       .setConnectionRequestTimeout(5000)//
       .build();

httpClient = HttpClients.custom()//
       .setSSLContext(ctx)//
       .setDefaultRequestConfig(defaultRequestConfig)//
       .setSSLHostnameVerifier(new NoopHostnameVerifier())//
       .build();

客戶端證書和可信證書存儲在 PKI 令牌中。 客戶端連續向服務器發送一些 HTTP 請求。 一切正常。 現在我想強制客戶端(或服務器)重新啟動握手。 換句話說,我想刷新 SSL 連接,這會導致定期檢查服務器證書。 有什么辦法嗎?

我知道SSLSessionContext.setSessionTimeout() 但這不會刷新當前連接。 它只會強制新連接再次進行握手。

對於未來的讀者。

我在security.stackexchange.com上問了類似的問題,但沒有有關編程的詳細信息。 我以為這個問題可能是安全問題。 但是,該問題現在已從security.stackexchange.com遷移到stackoverflow.com ,並為我提供了令人信服的答案。 我建議參考: https : //stackoverflow.com/a/55004572/5538979

您可以使用以下代碼片段清除 ssl 緩存:

SSLContext sslContext = ...; // your initialised SSLContext
SSLSessionContext sslSessionContext = sslContext.getClientSessionContext();

Collections.list(sslContext.getClientSessionContext().getIds()).stream()
        .map(sslSessionContext::getSession)
        .filter(Objects::nonNull)
        .forEach(SSLSession::invalidate);

暫無
暫無

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

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