java - 如何在 Java 项目中启用 TLS?

标签 java ssl

我开发了一个使用 TCP 套接字的应用程序。现在我希望它可以使用 TLS 连接。

我已经搜索了 2 天的一些资源,但没有任何内容看起来像是关于如何实现 TLS 的教程。

这是我对我必须做的事情的理解:

  • 我必须在我的 keystore 中导入我的根 CA。
  • 我必须在我的keystore/truststore 中导入一些其他证书。

我找不到一个清晰的代码示例来解释真正要做什么。

你能帮我做一些客户端/服务器示例或其他有用的教程吗? (我已经尝试搜索“TLS java”、“TLS Java 示例”、“TLS Java 教程”等。但我找不到任何令人满意的内容。)

预先感谢您的关注。

最佳答案

有两种方法可以实现。

最简单的在于 Java 协议(protocol)支持和 URL 对象。

但是因为我认为您已经知道 new URL("https://www.google.com").openStream() 在处理所有TLS/SSL 的东西给你,我会选择“困难”的方式:)

就在我回答您的其他问题之前:导入 CA。 CA 证书位于您的 Java 主目录中的以下任一位置:

  • $JAVA_HOME/lib/security/cacerts (JRE)
  • $JAVA_HOME/jre/lib/security/cacerts(JDK;注意“jre” 在 Java 主页之后)

两者的默认密码都是“changeit”。

要列出其内容,您可以使用 keytool 命令:

$ keytool -list -keystore cacerts -storepass changeit

要添加新证书,只需使用 -import 子命令而不是 -list

那么现在让我们采用“困难”方式(客户端代码):

import javax.net.SocketFactory;
import javax.net.ssl.SSLSocketFactory;

...
String host = "www.google.com";
int port = 443;

SocketFactory basicSocketFactory = SocketFactory.getDefault();
Socket s = basicSocketFactory.createSocket(host, port);
// s is a TCP socket

SSLSocketFactory tlsSocketFactory = SSLSocketFactory.getDefault();
s = tlsSocketFactory.createSocket(s, host, port, true);
// s is now a TLS socket over TCP

就这么简单。

如果您需要服务器套接字,代码几乎相同,您只需将 SocketFactory 换成 ServerSocketFactory 并将 SSLSocketFactory 换成 SSLServerSocketFactory.

希望这对您有所帮助。

关于java - 如何在 Java 项目中启用 TLS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24868820/

相关文章:

tomcat - 无法初始化与 ProtocolHandler 关联的端点

java - org.dbunit.dataset.NoSuchTableException : Did not find table 'xxx' in schema 'null'

java - 综合访问器方法警告

java - AWS Lambda Java函数成功但超时

java - 为数组创建 "reset to original values"方法(开始 java)

PHP curl "Unknown SSL protocol error in connection to"

web-services - 在 SSL 上与 Web 服务通信

java - ThreadPoolExecutor 的排队行为可自定义以更喜欢创建新线程而不是排队?

docker - 使用 nginx 的动态 ssl 证书

ssl - 向 mitmproxy 添加其他受信任的根 CA 证书