Java:TCP加密、SSL和Netty

3

好的,我有一个点对点(客户端/服务器在同一主机上)设置(在本地局域网上),这是使用Java网络框架Netty。我使用原始的TCP/IP(即没有HTTP)进行通信和传输。

目前所有数据都以“明文”形式传输,我正在开始保护此类传输数据的过程。

我已经仔细阅读了各种加密/实践类型等(但可能只是浅尝辄止,已经让我的大脑燃烧了)

Netty包括SSL实现,以下是一些链接,希望能更好地解释自己:

http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/example/securechat/package-summary.html

"SecureChatTrustManagerFactory"中有两个方法:

          public void checkClientTrusted(
                  X509Certificate[] chain, String authType) throws CertificateException {
              // Always trust - it is an example.
              // You should do something in the real world.
              // You will reach here only if you enabled client certificate auth,
              // as described in SecureChatSslContextFactory.
              System.err.println(
                      "UNKNOWN CLIENT CERTIFICATE: " + chain[0].getSubjectDN());
          }

          public void checkServerTrusted(
                 X509Certificate[] chain, String authType) throws CertificateException {
             // Always trust - it is an example.
              // You should do something in the real world.
              System.err.println(
                      "UNKNOWN SERVER CERTIFICATE: " + chain[0].getSubjectDN());
          }

"SecureChatKeyStore" 包含一个硬编码的证书,据我所见。
所以我的问题是:
  • 我需要生成证书吗?
  • 如果需要,每次运行应用程序都需要生成吗?
  • 如果需要,每个客户端都需要生成吗?
  • 如果需要,这个认证是在客户端和服务器之间传递的吗?
  • 如果需要,如何安全地完成?
我不确定从哪里开始。从我看到的Netty实现来看,“这是创建安全连接的基础,但我们省略了实际使它们安全/验证的部分”。
还有其他提示/建议吗?
提前感谢您。

我已经阅读了很多关于加密、身份验证、快速签名等方面的内容(在网络上),但并不是所有的都真正理解了,因为涉及的内容太多了。我不确定是否有时间深入研究,特别是当它已经在Netty中部分实现时;我主要是在寻找最后一部分(证书部分)。 - Metalstorm
你们之间如何建立信任还不清楚。这似乎是你们系统中缺失的主要元素。 - Bruno
@Bruno,我认为你说得对。我最初考虑的是公钥/私钥加密,然后转向保护整个传输过程,而不仅仅是通过不安全连接发送加密数据(这样说对吗?)。我想这就是我需要帮助的地方。 - Metalstorm
听起来你之前看的是消息级安全,而现在你正在看传输级安全。无论哪种方式,你应该阅读有关 PKI(和/或Web-of-Trust/PGP)和身份管理的相关信息。 - Bruno
1个回答

0

正如其他人所指出的,应用程序安全和传输链安全之间存在差异。我认为你主要提到加密,因此你的目标是后者。加密可以防止窃听者窃取机密信息。此外,由于SSL还包括消息认证码,它也可以在传输过程中保护第三方篡改数据包。但一旦接收到消息,它就不再提供任何保护。

正如你在互联网上使用HTTPS连接时可能已经注意到的那样,你至少需要一个服务器证书。该证书可以保持静态,但应包含一个到期日期,在此之前你应该替换证书。服务器证书应该被客户端信任(例如通过将其嵌入资源中)。你也可以使用带有客户端身份验证的SSL,但这意味着你需要有充分的安全措施来保护客户端上的私钥。

最好从一个“自签名”的服务器证书开始。这是你需要在checkServerTrusted方法中信任的证书。基本上,这个证书就是整个证书链。


请注意,您需要客户端身份验证来验证客户端。换句话说,尽管这将保护传输中的消息,但仅有服务器身份验证意味着任何人都可以成为客户端,至少在传输协议级别上(Web客户端通常使用用户名/密码或cookie为客户端添加应用程序级身份验证)。 - Maarten Bodewes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接