我在Java中使用X500主要相等(JDK 8)。
使用openssl s_client ...
我看到我感兴趣的证书的主题DN被报告为(仅显示CN):
CN=*.myserver.net,...
然而在Java中:
X509Certificate.getSubjectX500Principal().equals("CN=*.myserver.net,...")
报告false
,即两个值不相等。看一下.equals
的实现,似乎比较了X500Name
的规范形式的相等性,这是有道理的。
但是,我看到来自服务器的证书的规范名称实际上是以下形式:
cn=#somehex,...
虽然手动创建的主体的规范名称采用以下形式:
cn=*.myserver.net,...
当然会导致它们(错误地)不相等。
进一步调查,相关逻辑似乎位于sun.security.x509.AVA.isDerString
,用于检查tag = 12
(UTF8String
)或tag = 19
(PrintableString
),而此CN RDN似乎有tag = 20
(T61String
)。
canonicalization docs未指明为何将服务器证书的CN规范化为此十六进制表单。根据{{3}}第2.4节,如果AttributeValue没有String表示,则应使用十六进制形式。但是,这不是这种情况 - RFC 2253(电传打字机)肯定有字符串表示。
JDK将T61String值规范化为十六进制形式的正确行为吗?