【问题标题】:Java Server with Multiple SSL Certificate具有多个 SSL 证书的 Java 服务器
【发布时间】:2013-07-29 11:30:17
【问题描述】:

我有一个情况,不确定是否有可能的解决方案。

我有一个带有 SSL 套接字和证书“A”和“B”的 Java 服务器。我也有两种类型的客户——一种带有证书“A”,另一种带有证书“B”。但是,服务器端只加载了一个证书,因此任一客户端都带有证书。 “A”可以连接或仅连接具有证书的客户端。 “B”可以连接。

是否可以修改 Java 服务器,以便在来自任何客户端的连接上,它将确定使用哪个证书( A 与 B )并使用适当的证书?

P.S:请原谅我的安全无知。

谢谢。

【问题讨论】:

  • 您说的是 Sun/Oracle Glassfish Java 服务器吗?
  • 这是一个带有 SSL 套接字的 java 应用程序 - 充当服务器。
  • 为什么您的客户也会拥有证书 A 和 B?您是否尝试使用客户端证书身份验证?
  • 我没有正确表达自己。我有客户,其中一些拥有证书 A,而另一些拥有证书 B。
  • 他们为什么要“拥有”证书 A 或 B?客户拥有证书是什么意思?您的意思是某些客户端被配置为信任证书 A 和其他证书 B,其中证书 A 和 B 都在服务器上(当然只有服务器有他们的私钥),或者您是在谈论用于身份验证的其他证书客户?

标签: java security ssl certificate ssl-certificate


【解决方案1】:

通过Server Name Indication (SNI) extension可以在相同的IP地址和端口上使用两个服务器证书,这必须得到客户端和服务器的支持。

Java 在客户端支持这一点since Java 7。

很遗憾,服务器端尚不支持此功能。这是planned for Java 8。

同时,如果您的服务器确实需要 SNI 支持,您可以使用另一台服务器来处理 SSL/TLS 连接并将纯文本连接转发到您的应用程序。通常,这可以通过用于 HTTP(S) 的 Apache Httpd(带有反向代理)来完成。

另外,看起来the HTTPS-SNI-Proxy project 对于其他协议可能更灵活(尽管其名称中有 HTTPS)。我没有尝试过,但根据它的 README,它会在初始 Client Hello 中查找 SNI 扩展,然后根据配置将整个 SSL/TLS 连接(不对其进行解密)转发到另一台服务器。在您的示例中,您必须在不同的端口(不是您真正想要收听的端口)上设置两个 SSLServerSockets,并根据客户端使用其 SNI 扩展名请求的内容,将此工具的连接转发到任一端口。

【讨论】:

  • 目前我们正在做直接安全套接字连接。是否有 SNI 代理类型的交易?
  • 我还假设这两个证书用于不同的主机名(否则 SNI 将无济于事)。
猜你喜欢
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2020-12-24
相关资源
最近更新 更多