【问题标题】:SSL socket server get certificate cn after handshake握手后 SSL 套接字服务器获取证书 cn
【发布时间】:2018-04-23 13:17:49
【问题描述】:

我有一个 SSL 套接字服务器运行,需要 2 方握手(为此我使用自签名证书)。握手成功后,想在服务器端查看客户端证书的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 已设置。但是我无法解释为什么它似乎没有被传输到服务器。

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

最好的问候,

加尔维斯顿01

【问题讨论】:

  • 如果你这样做System.out.println(cert);会发生什么?
  • [ [ 版本:V3 主题:CN=Unknown,OU="Org Unit",O=Org,L=City,ST=State,C=DE 签名算法:SHA256withRSA,OID = 1.2。 840.113549.1.1.11 ...

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


【解决方案1】:

握手成功后,想查看客户端 服务器端证书的cn。

要检查您收到的证书,您需要调用 getPeerCertificates 而不是 getLocalCertificates,后者用于您发送的证书。

你应该仔细阅读文档:

public X500Principal getSubjectX500Principal()

从 作为 X500Principal 的证书。如果主题值为空,则 返回的 X500Principal 对象的 getName() 方法返回一个 空字符串(“”)。

因此,不建议在未先检查输入的情况下调用indexOf() substring()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2012-04-28
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    相关资源
    最近更新 更多