SSL套接字服务器在握手后获得证书cn

时间:2018-04-23 13:17:49

标签: java ssl ssl-certificate jsse mutual-authentication

我有一个SSL套接字服务器,需要进行双方握手(我正在使用自签名证书)。握手成功后,我想在服务器端检查客户端证书的cn。不幸的是,此字段设置为Unknown

以下是我用来确定cn字段值的代码:

((SSLSocket) socket).addHandshakeCompletedListener(new HandshakeCompletedListener() {
    @Override
    public void handshakeCompleted(HandshakeCompletedEvent hce) {
        X509Certificate cert = (X509Certificate)hce.getLocalCertificates()[0];
        String certName = cert.getSubjectX500Principal().getName().substring(3,cert.getSubjectX500Principal().getName().indexOf(","));
        System.out.println(certName);
    }
});

打印Unknown

另外,我使用以下命令检查了客户端的keyStore:

keytool -list -v -keystore clientStore.jks

打印

Keystore-type: JKS
Keystore-provider: SUN

Keystore contains 1 entry

Aliasname: test
creation date: 23.04.2018
entry type: PrivateKeyEntry
certificate length: 1
certificate[1]:
owner: CN=test, OU="Org Unit", O=Org, L=City, ST=State, C=DE
...

如您所见,客户端商店的证书的cn已设置。然而,对我来说,为什么它似乎不会传输到服务器是莫名其妙的。

我会很高兴得到各种帮助。

致以最诚挚的问候,

Galveston01

1 个答案:

答案 0 :(得分:1)

  

握手成功后,我想检查一下客户端   证书在服务器端的cn。

要查看您收到的证书,您需要拨打getPeerCertificates而不是getLocalCertificates,这是您发送的证书。

你应该仔细阅读文档:

  

public X500Principal getSubjectX500Principal()

     

从中返回主题(主题专有名称)值   证书作为X500Principal。如果主题值为空,则   返回的X500Principal对象的getName()方法返回一个   空字符串("")。

出于这个原因,我们不建议在不先检查输入的情况下致电indexOf() substring()