【问题标题】:Java: TCP Encryption, SSL and NettyJava:TCP 加密、SSL 和 Netty
【发布时间】:2012-02-25 10:55:35
【问题描述】:

好的,所以我有一个点对点(一个主机上的客户端/服务器)设置(通过本地 LAN),这是使用 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 中实现时;我主要是在寻找最后一点(证书部分)
  • 目前尚不清楚您将如何在对等方之间建立信任。这似乎是您系统中缺少的主要元素。
  • @Bruno,我认为这是正确的。我首先关注的是公钥/私钥加密,然后转向保护整个传输过程,而不是仅仅通过不安全的连接发送加密数据(对吗?)。我想这就是我需要帮助的地方。
  • 听起来您正在查看消息级别的安全性,而您现在正在查看传输级别的安全性。无论哪种方式,您都应该了解 PKI(和/或 Web-of-Trust/PGP)和身份管理。

标签: java encryption ssl tcp netty


【解决方案1】:

正如其他人所指出的,应用程序安全性和传输链路安全性之间存在差异。我认为您的目标是最后一个,因为您主要提到加密。加密提供了窃听者的机密性。此外,由于 SSL 还包含消息验证代码,它还将为第三方在传输过程中更改数据包提供保护。一旦收到消息,它不提供任何保护。

您可能已经注意到,在 Internet 上进行 HTTPS 连接时,您至少需要一个服务器证书。此证书可以保持静态,但它应该包含一个到期日期,您应该在该日期更换证书。服务器证书应该受到客户端的信任(例如,通过将其嵌入为资源)。您也可以将 SSL 与客户端身份验证一起使用,但这意味着您需要采取充分的安全措施来确保客户端上的私钥安全。

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

【讨论】:

  • 请注意,您需要客户端身份验证来对客户端进行身份验证,换句话说,尽管这将保护传输中的消息,但仅服务器身份验证就意味着任何人都可以成为客户端,至少在传输协议级别(Web当然,客户端通常使用用户名/密码或 cookie 来为客户端添加应用程序级别的身份验证)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多