【发布时间】:2019-05-31 19:34:56
【问题描述】:
我有一个带有 SAN 扩展的 SSL 证书,其域如下:
- foo.com
- bar.foo.com
- something.foo.com
我已将此证书添加到 cacerts 并尝试使用 apache http 客户端连接到 bar.foo.com。
没想到我得到了异常:
Unparseable SubjectAlternativeName extension due to java.io.IOException: URI name must include scheme:foo.com
这将我带到sun.security.x509.URIName 类第 112 行:
https://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/sun/security/x509/URIName.java#l112
if (uri.getScheme() == null) {
throw new IOException("URI name must include scheme:" + name);
}
对我来说,这意味着 SAN 域必须在实际域之前具有有效的方案。看来应该是:
确实,当我在调试代码时替换域时,一切正常!
所以也许我得到的证书不正确?我查看了 Stackoverflow 证书,我看到了什么? SAN 域也在这里没有方案,所以我猜这些是正确的。
当我使用 cURL 时,它也可以正常工作,因此证书是正确的。
我发现了以下java bug记录:
- https://bugs.openjdk.java.net/browse/JDK-4834694
- https://bugs.openjdk.java.net/browse/JDK-4917253
- https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4834694
人们声称这确实是一个错误,但这些记录已有 15 年历史 - 它们来自 2003/2004 年。
显然我做错了什么,因为java不可能有这个错误这么长时间
编辑: 看到我用keytool查看证书时出现了类似的bug:
keytool -list -keystore truststore.jks -v
(...)
#10: ObjectId: 2.5.29.17 Criticality=false
Unparseable SubjectAlternativeName extension due to
java.io.IOException: URI name must include scheme:foo.com
【问题讨论】:
标签: java ssl ssl-certificate x509certificate x509