有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:TCP加密、SSL和Netty

好的,我有一个对等(一台主机上的客户机/服务器)设置(通过本地局域网),这是使用Netty,一个Java网络框架。我使用原始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实现是这样说的:“这是创建安全连接的基础,但我们忽略了使它们真正安全/经过身份验证的部分”

还有其他我应该知道的建议吗

先谢谢你


共 (1) 个答案

  1. # 1 楼答案

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

    正如您在internet上注意到的HTTPS连接,您至少需要一个服务器证书。此证书可以保持静态,但它应该包含一个到期日期,您应该在该日期更换证书。客户端应信任服务器证书(例如,通过将其作为资源嵌入)。您还可以将SSL与客户端身份验证一起使用,但这意味着您需要有足够的安全措施来确保客户端上的私钥安全

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