【问题标题】:Java ssl client identificationJava ssl客户端识别
【发布时间】:2014-05-12 07:04:00
【问题描述】:

我正在使用具有相互标识 (ClientAuth) 的 SSL 套接字服务器和客户端程序。客户端有两种类型,每种类型都使用自己的证书。服务器如何确定新连接的客户端的类型,例如客户的证书别名或其他一些可区分的属性?

这是我设置服务器并接受连接表单客户端的代码:

SSLContext ctx = SSLContext.getInstance("TLSv1.2");
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance("JKS");

ks.load(new FileInputStream(serverKeystoreFile), serverKeystorePass);
kmf.init(ks, serverCertificatePass);
ks.load(new FileInputStream(serverTruststoreFile), serverTruststorePass);
tmf.init(ks);
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLServerSocketFactory ssf = ctx.getServerSocketFactory();
SSLServerSocket sslserversocket = (SSLServerSocket) ssf.createServerSocket(port);
sslserversocket.setNeedClientAuth(true);

// accept connection from client
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();

// At this point, I would like to determine the connected client's certificate alias
// or some other property that is unique for each of the acceptable client certificates.

【问题讨论】:

  • " ... or some other distinct property" - 除了下面 Warren 的回答,您还可以致电 getCipher 来检索密码套件。 getCipher 在SSLContext 上可用,例如HttpsUrlConnection。我不确定它是否符合您的需要,但它绝对是特定连接的属性。您还有getSessionContext,它应该提供额外的会话特定信息。
  • 加载密钥库时不要忘记关闭输入流。

标签: java ssl


【解决方案1】:

握手完成后,应该可以在服务端调用SSLSocket.getSession().getPeerCertificate()获取客户端的证书了。

【讨论】:

  • 感谢您的提示,这对我很有用:SSLSocket.getSession().getPeerPrincipal().getName()
猜你喜欢
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 2017-10-04
  • 2016-02-21
  • 2011-03-17
  • 2011-01-27
  • 2016-05-06
相关资源
最近更新 更多