在配置Spring Boot https时,如果使用PKCS12格式(后缀名为.p12)的证书库,启动时可能会报错“java.io.IOException: Invalid keystore format”或者“java.io.IOException: ObjectIdentifier() — data isn’t an object ID (tag = 48)”。可能有如下几种原因:
- 证书库文件损坏
- Java 8对PKCS12格式的支持不足
请检查应用实际使用的证书库文件与你本地的证书库文件是否一致,文件在传输过程中有可能损坏。另外,maven在构建时可能会对resources目录下的文件进行过滤处理,也可能导致证书库文件损坏,如果是这种情况,需要修改maven配置,禁用对证书库文件的过滤处理。具体请参见stackoverflow上的这个问题 java.io.IOException: Invalid Keystore format。
Java 8对PKCS12格式支持不足,某些工具生成的PKCS12证书库,在Java 8中无法正确解析。具体请参见stackoverflow上的这个问题 IOException in Java 8 when reading PKCS12 keystore created with keytool from OpenJDK16。
本人遇到的就是这个问题,测试了一下,升级到Java 11或者Java 17均可以正常启动。
针对 Java 8 的这个问题,有几个解决方案:
- 使用 jks 格式的证书库替代 PKCS12 证书库
- 换一种工具来生成PKCS12证书库,看看Java 8是否支持。