使用T61String AVAs规范化Java X500主体名称

使用T61String AVAs规范化Java X500主体名称,java,ssl,x509,Java,Ssl,X509,我使用的是Java(JDK 8)中的X500主体等式 使用openssl s_client…我看到我感兴趣的证书的主题DN报告为(仅显示CN): 但是在Java中: X509Certificate.getSubjectX500Principal().equals("CN=*.myserver.net,...") 报告false即两个值不相等。查看.equals的实现,似乎比较了X500Name的规范形式是否相等,这是有意义的 但是,我发现来自服务器的证书的规范名称实际上是以下形式: cn=#s

我使用的是Java(JDK 8)中的X500主体等式

使用
openssl s_client…
我看到我感兴趣的证书的主题DN报告为(仅显示CN):

但是在Java中:

X509Certificate.getSubjectX500Principal().equals("CN=*.myserver.net,...")
报告
false
即两个值不相等。查看
.equals
的实现,似乎比较了
X500Name
的规范形式是否相等,这是有意义的

但是,我发现来自服务器的证书的规范名称实际上是以下形式:

cn=#somehex,...
cn=*.myserver.net,...
而手动创建的主体的规范名称采用以下形式:

cn=#somehex,...
cn=*.myserver.net,...
这当然会导致他们(错误地)不平等

进一步调查,相关逻辑似乎在
sun.security.x509.AVA.isDerString
中,它检查
tag=12
UTF8String
)或
tag=19
PrintableString
),而此CN RDN似乎有
tag=20
T61String

未指明服务器证书的CN被规范化为此十六进制形式的原因。根据第2.4节,如果AttributeValue没有字符串表示,则应使用十六进制形式。然而,这里的情况并非如此——a(电传打字机)肯定有字符串表示

JDK将T61字符串值规范化为十六进制形式是否正确