Java应用如何利用内置cacerts完成可信根证书校验?
问题1解答:Java是否默认加载jre/lib/security/cacerts到内存?
Java不会在JVM启动时就默认把cacerts文件全局加载到内存。
日常HTTPS通信能正常工作,是因为Java的SSLContext在按需初始化的时候,会自动读取默认信任库(优先读取javax.net.ssl.trustStore系统参数指定的文件,没有指定的话就用jre/lib/security/cacerts)。
你之前写的ks.load(null, null)返回空是正常表现:这个方法传入null参数的作用是初始化一个空的KeyStore实例,本身就不会读取任何本地的信任库内容。
问题2解答:如何获取系统默认可信证书的KeyStore实例
方案1:手动读取系统默认信任库文件
兼容用户自定义信任库配置的代码示例:
// 优先读取系统参数配置的信任库,没有配置就用内置cacerts String trustStorePath = System.getProperty("javax.net.ssl.trustStore", System.getProperty("java.home") + "/lib/security/cacerts"); // 优先读取系统参数配置的信任库密码,默认密码为changeit String trustStorePwd = System.getProperty("javax.net.ssl.trustStorePassword", "changeit"); // 优先读取系统参数配置的信任库类型,默认用JKS String trustStoreType = System.getProperty("javax.net.ssl.trustStoreType", KeyStore.getDefaultType()); KeyStore trustStore = KeyStore.getInstance(trustStoreType); try (InputStream in = new FileInputStream(trustStorePath)) { trustStore.load(in, trustStorePwd.toCharArray()); }
拿到trustStore实例后就可以用来做后续的证书链校验。
方案2:通过TrustManagerFactory自动加载(更简洁)
如果不需要直接操作KeyStore文件,直接调用TrustManagerFactory的init方法传入null,框架会自动加载系统默认信任库:
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); // 传入null参数时会自动加载系统默认信任库 tmf.init((KeyStore) null); // 获取X509信任管理器直接做证书校验 X509TrustManager trustManager = null; for (TrustManager tm : tmf.getTrustManagers()) { if (tm instanceof X509TrustManager) { trustManager = (X509TrustManager) tm; break; } } // 后续可直接调用trustManager的checkClientTrusted/checkServerTrusted方法校验证书链
内容的提问来源于stack exchange,提问作者avs099
相关产品推荐
相关产品推荐

