JVM参数何时被解析为系统属性?javax.net.debug配置不生效咨询
问题解答
JVM系统属性的设置时机
所有通过-D参数传入的系统属性,都会在JVM启动的初始化阶段完成赋值,早于任何应用类、扩展库类的加载逻辑,更不会晚于javax.net.ssl.SSLSocketFactory的静态代码块执行,所以不存在静态代码块读取时属性还没赋值的可能。
问题根因:BC-FIPS的特性,不是竞态
你遇到的日志不输出问题是BouncyCastle FIPS Provider的固有特性,核心原因如下:
- BC-FIPS引入后会默认注册自身的JSSE实现(BouncyCastle JSSE Provider),且优先级高于JDK自带的SunJSSE实现,此时应用实际使用的
SSLSocketFactory是BC提供的实现类,而非JDK原生的javax.net.ssl.SSLSocketFactory - BC自身的JSSE实现不会读取
javax.net.debug系统属性控制日志输出,你看到的JDK原生类的静态代码块根本没有被触发执行,所以加的原生调试参数完全不生效
验证及解决方法
- 你可以添加JVM参数
-Djava.security.debug=jca,providers启动应用,查看安全Provider的加载顺序和实际生效的SSLSocketFactory实现类,确认BC JSSE Provider是否处于更高优先级 - 如需开启BC-FIPS下的SSL调试日志,使用BC专属的系统参数即可:
-Dorg.bouncycastle.jsse.debug=ssl,handshake
内容的提问来源于stack exchange,提问作者conorgriffin
相关产品推荐
相关产品推荐

