Java 17.0.5调用X509Certificate.getInst()抛异常是否为Bug?
这不属于Java 17.0.5的Bug,而是依赖内部API导致的兼容性问题
com.sun开头的类是Java内部实现,不该被用户代码依赖
Oracle从一开始就明确:com.sun/sun前缀的类属于JDK的内部细节,不属于公开标准API,没有版本间兼容性承诺,随时可能被修改、隐藏甚至删除。Java 9引入模块化后,这类内部API的访问限制更严格,很多直接被移除,X509V1CertImpl就是其中之一。该类的移除是预期的版本迭代行为
Java 17中移除com.sun.security.cert.internal.x509.X509V1CertImpl是符合官方维护策略的正常操作,完全不是Bug。你的代码问题出在默认依赖了内部类
你封装的getInst方法在X509Provider为null时,默认指向了这个已被移除的内部类。正确的做法是改用Java官方公开的X509证书处理API,比如CertificateFactory,示例代码如下:
private static final X509Certificate getInst(Object value) throws CertificateException { CertificateFactory factory = CertificateFactory.getInstance("X.509"); if (value instanceof InputStream) { return (X509Certificate) factory.generateCertificate((InputStream) value); } else if (value instanceof byte[]) { return (X509Certificate) factory.generateCertificate(new ByteArrayInputStream((byte[]) value)); } else { throw new CertificateException("Unsupported argument type"); } }
说白了,你遇到的问题不是Java的Bug,而是自己的代码使用了不被官方支持的内部API导致的兼容性问题。换成公开API就能解决跨版本运行的问题。
内容的提问来源于stack exchange,提问作者Kevin Chuang
相关产品推荐
相关产品推荐

