4

事实证明,对于这个特定问题,搜索互联网过于复杂。也许你能指出我正确的方向?

我已经设置了一个带有自签名证书的 SSL/TLS 服务器(不是 HTTPS)。我已成功连接到它并使用 Node.JS 进行了测试

var sock = tls.connect({
  host:'127.0.0.1',
  port:443,
  servername:'foobar',
  ca: fs.readFileSync('foobar-cert.pem')
}, function () {
  if(sock.authorized)
    console.log('secure connection - yea!')
  else
    console.log('Not Secure because ' + sock.authorizationError)
})

但我似乎无法在 Java 中找到等效的示例代码。

如何使用自签名证书文件连接到 Java 中的 TLS 服务器以进行服务器身份验证?自签名证书将在运行时加载,而不是安装到计算机的共享 CA 文件中。

到目前为止,我找到的最佳答案需要一个外部库。这是我最后的手段,因为我确信 Java 会内置我需要的东西,而且我根本不需要外部库。

编辑:感谢您对重新打开问题的快速回复。

编辑:我看到我的问题已关闭,因为重复告诉 java 接受自签名 ssl 证书。这是不正确的,因为我的问题有额外的要求,我在上面说过:

  • 建议:“证书...将其导入您的 JVM 信任库”
    我的要求“自签名证书...未安装到计算机的共享 CA 文件中”

  • 建议:“禁用证书验证”(不推荐)
    我的要求“将在运行时加载自签名证书” (并用于服务器验证)

  • 建议:“使用密钥工具将其导入您的信任库”
    我的要求“自签名证书......未安装到计算机的共享 CA 文件中”

4

2 回答 2

4

不久前我写了一篇博文,展示了如何在 Android 上执行此操作(包括在运行时读取证书),但相同的代码应该可以在桌面上运行。

基本思想是在运行时创建一个信任库,读取证书,并将其添加到信任库中。然后使用自定义信任库创建可与 SSLSocketFactory 一起使用的 SSLContext。

博客文章中的示例将 SSLSocketFactory 传递给 URLConnection,但您可以使用 SSLSocketFactory 的createSocket方法获取套接字并直接使用它。

于 2013-02-27T02:49:32.807 回答
1

您可能会在这个巨大的文档中的某个地方找到答案:

http://download.java.net/jdk8/docs/technotes/guides/security/jsse/JSSERefGuide.html

基本上,使用 SSLSocket 作为初学者。但我认为您不能在运行时添加证书。

于 2013-02-27T00:01:13.643 回答