Spring Boot集成Apereo CAS后启动慢:重复打印证书日志
我有一个基于Java 8的Spring Boot应用(分支CAS_integration),已集成Apereo CAS服务器,集成方式为添加Apereo CAS客户端依赖。功能正常,但添加依赖后应用启动时间增加了3分钟。经调试发现,启动时jdk.event.security会持续3分钟以上重复打印4个X509Certificates的相同日志(日志量近100MB),且不清楚这些证书的来源,打印前后无其他操作信号。日志内容如下:
2024-01-19 15:42:11.125 DEBUG 423972 --- [ main] jdk.event.security : X509Certificate: Alg:SHA1withDSA, Serial:10, Subject:CN=JCE Code Signing CA, OU=Java Software Code Signing, O=Sun Microsystems Inc, L=Palo Alto, ST=CA, C=US, Issuer:CN=JCE Code Signing CA, OU=Java Software Code Signing, O=Sun Microsystems Inc, L=Palo Alto, ST=CA, C=US, Key type:DSA, Length:1024, Cert Id:1776909028, Valid from:4/25/01, 9:00 AM, Valid until:4/25/20, 9:00 AM
2024-01-19 15:42:11.125 DEBUG 423972 --- [ main] jdk.event.security : X509Certificate: Alg:SHA1withDSA, Serial:47f, Subject:CN=Legion of the Bouncy Castle Inc., OU=Java Software Code Signing, O=Sun Microsystems Inc, Issuer:CN=JCE Code Signing CA, OU=Java Software Code Signing, O=Sun Microsystems Inc, L=Palo Alto, ST=CA, C=US, Key type:DSA, Length:1024, Cert Id:-2023852845, Valid from:3/11/17, 2:15 AM, Valid until:4/25/20, 9:00 AM
2024-01-19 15:42:11.127 DEBUG 423972 --- [ main] jdk.event.security : X509Certificate: Alg:SHA256withRSA, Serial:d424ae0be3a88ff604021ce1400f0dd, Subject:CN=DigiCert Timestamp 2021, O="DigiCert, Inc.", C=US, Issuer:CN=DigiCert SHA2 Assured ID Timestamping CA, OU=www.digicert.com, O=DigiCert Inc, C=US, Key type:RSA, Length:2048, Cert Id:1348208542, Valid from:1/1/21, 1:00 AM, Valid until:1/6/31, 1:00 AM
2024-01-19 15:42:11.127 DEBUG 423972 --- [ main] jdk.event.security : X509Certificate: Alg:SHA256withRSA, Serial:aa125d6d6321b7e41e405da3697c215, Subject:CN=DigiCert SHA2 Assured ID Timestamping CA, OU=www.digicert.com, O=DigiCert Inc, C=US, Issuer:CN=DigiCert Assured ID Root CA, OU=www.digicert.com, O=DigiCert Inc, C=US, Key type:RSA, Length:2048, Cert Id:-1680473293, Valid from:1/7/16, 1:00 PM, Valid until:1/7/31, 1:00 PM
- 日志级别过高:
jdk.event.security被设置为DEBUG级别,CAS客户端初始化安全上下文、验证证书链时会触发大量证书日志输出,重复打印是因为证书链验证过程被多次调用。 - 证书来源:这些证书是JCE签名CA、Bouncy Castle签名证书以及DigiCert时间戳CA证书,属于Java运行环境内置的信任证书,CAS客户端在建立与CAS服务器的SSL连接或验证CAS票据签名时会加载这些信任证书。
- Java 8特性限制:Java 8的安全日志框架在处理大量重复日志时无优化,持续IO操作拖慢了启动速度。
1. 调整日志级别
在Spring Boot配置文件中降低jdk.event.security的日志级别,避免DEBUG级别的日志输出:
- properties格式:
logging.level.jdk.event.security=INFO
- yml格式:
logging: level: jdk.event.security: INFO
若不需要该类别的日志,可直接设置为OFF:
logging.level.jdk.event.security=OFF
2. 排除冗余依赖
检查CAS客户端依赖是否引入了重复的安全组件(如Bouncy Castle),通过Maven或Gradle排除不必要的模块,减少证书加载次数。
3. 使用自定义信任库
将CAS服务器所需的信任证书单独导出到自定义信任库,配置Spring Boot使用该信任库,避免遍历整个JRE内置信任库,减少证书扫描和验证时间:
server.ssl.trust-store=classpath:custom-truststore.jks server.ssl.trust-store-password=your-password server.ssl.trust-store-type=JKS
4. 升级Java版本(可选)
Java 11及以上版本对安全日志框架和证书加载逻辑做了优化,能减少此类重复日志输出和启动耗时,但需评估应用兼容性。
内容的提问来源于stack exchange,提问作者Aleix Mariné

