如何配置Java SSL服务端使其在CertificateRequest中发送多个证书颁发机构
Java SSL 服务端配置CertificateRequest多证书颁发机构方法
CertificateRequest 中的 certificate_authorities 列表,默认由Java SSL服务端加载的信任库(TrustStore)中所有受信任CA证书的Subject DN字段自动提取生成,列表内容和信任库中存储的CA证书一一对应,按以下步骤配置即可新增列表中的CA:
通用原生JSSE配置步骤
- 准备好所有需要下发的CA证书(根CA、中间CA均可,格式为DER或PEM)
- 将所有CA证书导入到服务端使用的信任库文件中,导入命令使用
keytool:
# 导入第一个CA keytool -importcert -alias ca1 -file ca1.crt -keystore server-truststore.jks -storepass <信任库密码> # 导入其他CA,重复命令修改alias参数和证书文件路径即可 keytool -importcert -alias ca2 -file ca2.crt -keystore server-truststore.jks -storepass <信任库密码>
- 初始化
SSLContext时,指定加载该包含多CA的信任库生成TrustManager:
// 加载服务端信任库 KeyStore trustStore = KeyStore.getInstance("JKS"); trustStore.load(new FileInputStream("server-truststore.jks"), trustStorePass.toCharArray()); // 初始化TrustManagerFactory TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(trustStore); // 初始化SSLContext SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(keyManagers, tmf.getTrustManagers(), new SecureRandom());
- 配置服务端
SSLEngine或SSLServerSocket开启客户端证书认证:setNeedClientAuth(true)或setWantClientAuth(true)
Spring Boot场景配置
如果使用Spring Boot内置web容器(Tomcat/Undertow/Jetty),直接修改配置文件即可:
- 先按照上述步骤把所有需要下发的CA导入到服务端信任库
- 修改application.yml配置:
server: ssl: trust-store: classpath:server-truststore.jks trust-store-password: <你的信任库密码> client-auth: need # 开启强制客户端证书认证
自定义CA列表说明
如果需要certificate_authorities列表和信任库内容不一致,可以自定义X509TrustManager的getAcceptedIssuers()方法,直接返回你需要下发的CA证书数组即可,JSSE会自动提取该数组中证书的Subject DN生成最终下发的CA列表。
内容的提问来源于stack exchange,提问作者voipp
相关产品推荐
相关产品推荐

