我有一个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
答案 0 :(得分:1)
握手成功后,我想检查一下客户端 证书在服务器端的cn。
要查看您收到的证书,您需要拨打getPeerCertificates而不是getLocalCertificates,这是您发送的证书。
你应该仔细阅读文档:
public X500Principal getSubjectX500Principal()
从中返回主题(主题专有名称)值 证书作为X500Principal。如果主题值为空,则 返回的X500Principal对象的getName()方法返回一个 空字符串("")。
出于这个原因,我们不建议在不先检查输入的情况下致电indexOf() substring()
。