我使用的是JRE 1.8.0_51(我不能改變這一點),它不包括lib/security/cacerts中Let's Encrypt的根證書(它是在1.8.0_141中添加的)
我需要在運行時添加證書,我找到了這段代碼來完成這個任務:
我需要在運行時添加證書。
try {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509"/span>)。
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType() )。
InputStream keyStoreStream = getClass().getClassLoader().getResourceAsStream("j51_le_ca_cert.jks")。
keyStore.load(keyStoreStream, "changeit".toCharArray() )。
trustManagerFactory.init(keyStore)。
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers()。
SSLContext sc = SSLContext.getInstance("SSL"/span>) 。
sc.init(null, trustManagers, null)。
SSLContext.setDefault(sc)。
} catch (Exception e) {
e.printStackTrace()。
}
這樣運行時沒有拋出任何錯誤,但會導致以下情況發生:
這是個很好的例子。
- LE證書被正確地保存下來了。
- LE證書被正確地安裝了,但是覆寫了所有現有的證書
- LE證書沒有被安裝。
- LE證書沒有被安裝,所有現有的證書仍然存在 。
這兩個事件中的哪一個會發生,似乎是任意的,根據系統和運行環境的不同而變化。
我怎樣才能將證書與現有證書一起可靠地安裝呢?
uj5u.com熱心網友回復:
根據你的問題,看起來你有以下要求:
你的問題是什么?
- 不能升級
- 不可能升級Java,需要保持在v1.8.051
- 使用默認的 jdk truststore (cacert) 。
- 在運行期間向現有的信任證書添加額外的信任證書 。
我認為這是有可能的。你可以做的是創建兩個獨立的TrustManagers,并按照這里提到的方法將它們結合起來。在JVM中注冊多個密鑰儲存器。你只需要從默認的 jdk 信任庫(cacert)創建一個信任管理器,同時為你自己的信任庫創建一個包含讓加密的信任庫,并將其與該主題中提到的 CompositeTrustManager 合并。這個特殊的TrustManager可以用來創建一個SSLContext.
。我已經將代碼片段提取到一個庫中,所以如果你不介意使用一個額外的庫,你可以試試下面的片段:
import nl.altindag.ssl.SSLFactory;
import javax.net.ssl.SSLContext;
public class App {
public static void main(String[] args){
SSLFactory sslFactory = SSLFactory.builder()
.withTrustMaterial("j51_le_ca_cert.jks", "changeit".toCharArray()
.withDefaultTrustMaterial()
.withSslContextAlgorithm("SSL")
.build()。
SSLContext sslContext = sslFactory.getSslContext()。
SSLContext.setDefault(sslContext)。
}
}
你可以用下面的代碼段來添加庫:
<dependency>/span>
<groupId>/span>io.github.hakky54</groupId>/span>
<artifactId>sslcontext-kickstart</artifactId>
<version>/span>7.0.0</version>/span>
</dependency>/span>
請參閱這里的完整檔案和使用示例。GitHub - SSLContext Kickstart
我認為最好是升級你的 JDK,但有時這是不可能的,所以我希望這個替代解決方案能對你有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/329844.html
標籤:
