Java:TCP加密,SSL和Netty
好吧,我有一个点对点(一个主机上的客户端/服务器)设置(通过本地局域网),这是使用Netty,一个Java网络框架。我使用原始TCP/IP(如在,没有HTTP)进行通信和传输。Java:TCP加密,SSL和Netty
当前所有数据都以“纯文本”传输,我开始保护这些传输数据的过程。
我有类型的加密/实践等良好的读取(但可能只碰了面和已融化我的大脑)
Netty中包括SSL implemntation,继承人一些联系,希望能够更好地解释自己:
http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/example/securechat/package-summary.html
内部 “SecureChatTrustManagerFactory” 有2种方法:
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实现中可以看出:“这是创建安全连接的基础,但我们忽略了实际上使它们安全/认证的部分”。
我应该知道的其他指针/提示?
预先感谢您。
正如其他人指出的那样,应用程序安全性和传输链路安全性之间存在差异。我认为你主要是提到加密,最后一个是你的目标。加密提供窃听者的保密性。另外,由于SSL也包含了消息认证码,它还会在运输过程中为第三方提供数据包保护。一旦收到消息,它不提供任何保护。
正如你可能已经注意到在互联网上的HTTPS连接,你至少需要一个服务器证书。该证书可以保持静态,尽管它应该包含一个到期日期,以便在该时间内更换证书。服务器证书应该被客户信任(例如通过将其嵌入为资源)。您也可以使用SSL进行客户端身份验证,但这意味着您需要有足够的安全措施来保护客户端上的私钥安全。
这可能是以“自签名”服务器证书开始的最佳方式。这就是你需要信任checkServerTrusted
方法的人。基本上,这个链条就是一个证书。
请注意,您需要客户端身份验证来验证客户端,换句话说,尽管这样可以保护传输中的邮件,但服务器身份验证本身意味着任何人都可以成为客户端,至少在传输协议级别上(Web客户端通常使用用户名/密码或cookies来为客户端添加应用程序级别认证)。 – 2012-02-04 20:33:01
我读过很多东西(在网上)与加密,身份验证,签署非常迅速..不是所有的真正沉没,做的金额。我不确定我是否有时间深入,特别是当它的一半已经在Netty中实现时;我主要是在寻找最后一点(证书部分) – Metalstorm 2012-02-02 19:21:01
目前还不清楚你将如何在同伴之间建立信任。这似乎是您的系统中主要缺失的元素。 – Bruno 2012-02-02 19:51:38
@布鲁诺,我认为是对的。我首先查看公钥/私钥加密,然后转换到保护整个传输过程,而不仅仅是通过不安全的连接发送加密数据(是吗?)。我认为这是我需要帮助的地方。 – Metalstorm 2012-02-02 19:59:44