Java 8 Spring Boot如何获取java.security中的FIPS安全提供者列表?
Java 8 获取FIPS提供者列表的解决方案
问题背景
我的Spring Boot应用基于Java 8运行,JDK8安装目录下jdk1.8.0_372\jre\lib\security中的java.security文件包含两类安全提供者配置:常规的security.provider列表,以及FIPS模式激活时使用的fips.provider列表。尝试用以下代码仅能获取常规列表,无法获取FIPS提供者列表:
java.security.Provider[] providers = java.security.Security.getProviders(); for (java.security.Provider provider : providers) { System.out.println("Provider: " + provider.getName()); }
解决方案
fips.provider列表仅在JVM激活FIPS模式时才会被加载生效,常规模式下不会自动加载。你可以根据需求选择以下两种方式:
方式1:激活FIPS模式后获取已加载的提供者
要让JVM加载fips.provider列表,需在启动Spring Boot应用时添加FIPS激活参数,同时确保java.security中已正确配置fips.provider条目:
- 在应用启动参数中添加:
-Dcom.sun.security.enableFIPS=true(Oracle JDK 8激活FIPS的标准参数,不同厂商JDK可能略有差异) - 启动应用后,原代码
Security.getProviders()即可获取到FIPS模式下的提供者列表
方式2:直接读取配置文件中的fips.provider列表(无需激活FIPS模式)
如果只是想读取java.security文件中定义的fips.provider配置,无需激活FIPS模式,可以手动加载配置文件解析:
import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class FipsProviderLoader { public void printFipsProviders() throws IOException { // 获取当前JRE的java.security配置文件路径 String securityConfigPath = System.getProperty("java.home") + "/lib/security/java.security"; Properties securityProps = new Properties(); try (FileInputStream fis = new FileInputStream(securityConfigPath)) { securityProps.load(fis); } // 遍历并打印所有fips.provider配置项 for (String propKey : securityProps.stringPropertyNames()) { if (propKey.startsWith("fips.provider.")) { System.out.println("FIPS Provider " + propKey + ": " + securityProps.getProperty(propKey)); } } } }
在Spring Boot应用启动时调用printFipsProviders()方法即可输出配置文件中的FIPS提供者列表。
内容的提问来源于stack exchange,提问作者Woodchuck
相关产品推荐
相关产品推荐

