传输层安全访问是通过身份验证和加密传输的过程。JDK的JSSE提供了传输层安全访问的实现。本文旨在通过一个完整的TLS通讯实例,辨析一个普遍的误导。
网络上停留在理论的简单实例通常存在一个误导。在双向信任的情况下,双方都需要信任对方的证书。这样的例子很多,普遍拷贝并简述过程。
其
实,在实践中发现,双方都信任一个权威的CA,并持有该CA根证书和该CA签发的证书,即可以信任对方,实现通讯,不需要对方证书。这样做的好处是,连接
方发生变动后,如果新的接入方也是CA签发认证的,即可认为可信。还有一个好处是,减少一个文件的部署(如果该通讯被重用在其他项目,或许这不是小事)。
〇 Scenario
ICM和UCGW是双向信任的两方,通过TLS通讯。CA是内部公信签证机构。
一 Certificate
签证流程:
0.CA自签证书作为其他设备的根证书
1.ICM和UCGW(两方流程一致,以下简称ICM)自签证书
2.向CA发送签发请求
这一步可以是发送一个CSR将公钥信息传递给CA
本例是将证书直接发给CA
3.CA为请求者签发证书
4.CA发送根证
书和
CA签发的证书
给请求者
5.ICM将CA根证书导入信任列表
6.ICM将CA签发的证书替换自己签发的证书
实现代码:
0.CA自签证书作为其他设备的根证书
CertInfo certInfo
=
new
CertInfo();
SelfSign selfs
=
new
SelfSign();
certInfo.setKeystore(CA_KEYSTORE);
certInfo.setAlias(CA_ALIAS);
certInfo.setCommonName(
"
mars_ca
"
);
selfs.sign(certInfo, CA_CER);
keytool
-genkey -dname "CN=mars_ca, OU=rv, O=rcd, L=ZB, ST=bj, C=China" -alias
root -keyalg RSA -keystore ca--ca.keystore -keypass 111111 -storepass
111111 -validity 60
keytool -export -alias root -keystore ca--ca.keystore -storepass 111111 -rfc -file ca--ca.cer
Certificate stored in file <ca--ca.cer>
keytool -list -keystore ca--ca.keystore -storepass 111111
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
root, May 24, 2011, PrivateKeyEntry,
Certificate fingerprint (MD5): 24:48:A3:4D:9F:EE:39:DE:8C:E7:51:60:7E:94:7A:76
1.ICM和UCGW(两方流程一致,以下简称ICM)自签证书
//
CertInfo certInfo = new CertInfo();
//
SelfSign selfs = new SelfSign();
certInfo.setKeystore(ICM_KEYSTORE);
certInfo.setAlias(ICM_ALIAS);
certInfo.setCommonName(
"
mars_icm
"
);
selfs.sign(certInfo, ICM_CER);
//
SelfSign selfs = new SelfSign();
//
CertInfo certInfo = new CertInfo();
certInfo.setKeystore(UCGW_KEYSTORE);
certInfo.setAlias(UCGW_ALIAS);
certInfo.setCommonName(
"
mars_UCGW
"
);
selfs.sign(certInfo, UCGW_CER);
keytool
-genkey -dname "CN=mars_icm, OU=rv, O=rcd, L=ZB, ST=bj, C=China" -alias
icm -keyalg RSA -keystore iview.keystore -keypass 111111 -storepass
111111 -validity 60
keytool -export -alias icm -keystore iview.keystore -storepass 111111 -rfc -file icm--icm.cer
Certificate stored in file <icm--icm.cer>
keytool
-genkey -dname "CN=mars_UCGW, OU=rv, O=rcd, L=ZB, ST=bj, C=China"
-alias ucgw -keyalg RSA -keystore ucgw.keystore -keypass 111111
-storepass 111111 -validity 60
keytool -export -alias ucgw -keystore ucgw.keystore -storepass 111111 -rfc -file ucgw--ucgw.cer
Certificate stored in file <ucgw--ucgw.cer>
keytool -export -alias ca_signed -keystore ca--ca_sign.keystore -storepass 111111 -rfc -file ca--icm.signed.cer
Certificate stored in file <ca--icm.signed.cer>
keytool -export -alias ca_signed -keystore ca--ca_sign.keystore -storepass 111111 -rfc -file ca--ucgw.signed.cer
Certificate stored in file <ca--ucgw.signed.cer>
keytool
-
list
-
keystore iview.keystore
-
storepass
111111
Keystore type: JKS
Keystore provider: SUN
Your keystore contains
1
entry
icm
, May
24
,
2011
, PrivateKeyEntry,
Certificate fingerprint (MD5):
78
:5C:AA:1B:
27
:9D:FB:3E:BE:1A:BD:6E:C5:A5:
25
:BD
keytool
-
list
-
keystore ucgw.keystore
-
storepass
111111
Keystore type: JKS
Keystore provider: SUN
Your keystore contains
1
entry
ucgw
, May
24
,
2011
, PrivateKeyEntry,
Certificate fingerprint (MD5): 7B:
88
:
44
:
27
:
88
:
66
:2D:6B:
64
:E3:D5:
34
:4A:
03
:DA:8F
2.向CA发送签发请求
3.CA为请求者签发证书
CASign cas
=
new
CASign();
cas.sign(ICM_CER, ICM_SIGN_CER, CASIGN_KEYSTORE);
cas.sign(UCGW_CER, UCGW_SIGN_CER, CASIGN_KEYSTORE);
5.ICM将CA根证书导入信任列表
6.ICM将CA签发的证书替换自己签发的证书
CertImport im
=
new
CertImport();
im.importCA(ICM_KEYSTORE);
im.importSign(ICM_ALIAS, ICM_SIGN_CER, ICM_KEYSTORE);
im.importCA(UCGW_KEYSTORE);
im.importSign(UCGW_ALIAS, UCGW_SIGN_CER, UCGW_KEYSTORE);
keytool -importcert -noprompt -alias root -file ca--ca.cer -keystore iview.keystore -storepass 111111
Certificate was added to keystore
keytool
-importcert -noprompt -trustcacerts -alias icm -file ca--icm.signed.cer
-keystore iview.keystore -storepass 111111 -keypass 111111
Certificate reply was installed in keystore
keytool -importcert -noprompt -alias root -file ca--ca.cer -keystore ucgw.keystore -storepass 111111
Certificate was added to keystore
keytool
-importcert -noprompt -trustcacerts -alias ucgw -file
ca--ucgw.signed.cer -keystore ucgw.keystore -storepass 111111 -keypass
111111
Certificate reply was installed in keystore
keytool
-
list
-
keystore iview.keystore
-
storepass
111111
Keystore type: JKS
Keystore provider: SUN
Your keystore contains
2
entries
root
, May
24
,
2011
, trustedCertEntry,
Certificate fingerprint (MD5):
24
:
48
:A3:4D:9F:EE:
39
:DE:8C:E7:
51
:
60
:7E:
94
:7A:
76
icm
, May
24
,
2011
, PrivateKeyEntry,
Certificate fingerprint (MD5):
18
:D9:
40
:BD:
65
:6C:4D:B9:F3:
87
:2B:
09
:
63
:CD:F0:7A
keytool
-
list
-
keystore ucgw.keystore
-
storepass
111111
Keystore type: JKS
Keystore provider: SUN
Your keystore contains
2
entries
root
, May
24
,
2011
, trustedCertEntry,
Certificate fingerprint (MD5):
24
:
48
:A3:4D:9F:EE:
39
:DE:8C:E7:
51
:
60
:7E:
94
:7A:
76
ucgw
, May
24
,
2011
, PrivateKeyEntry,
Certificate fingerprint (MD5): 2A:3D:3F:A6:E3:2F:
36
:B9:
71
:CD:AB:1D:9F:
19
:8A:
49
二 TLS
这里以ICM作为服务器端,UCGW作为客户端。
方式一:加载keystore到环境变量,启用默认工厂SSL-Server-Socket-Factory
public
class
SSLServer {
public
static
void
main(String args[])
throws
Exception {
System.setProperty(
"
javax.net.ssl.keyStore
"
, TLSParameter.ICM_KEYSTORE);
System.setProperty(
"
javax.net.ssl.keyStorePassword
"
, TLSParameter.S_KEY_PASS);
SSLServerSocketFactory ssf
=
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
ServerSocket ss
=
ssf.createServerSocket(TLSParameter.SSLPORT);
System.out.println(
"
SSL Server is started.
"
);
while
(
true
) {
Socket s
=
ss.accept();
PrintStream out
=
new
PrintStream(s.getOutputStream());
out.println(
"
ICM say Hello to UCGW!
"
);
out.close();
s.close();
}
}
}
public
class
SSLClient {
public
static
void
main(String args[])
throws
Exception {
System.setProperty(
"
javax.net.ssl.trustStore
"
, TLSParameter.UCGW_KEYSTORE);
SSLSocketFactory ssf
=
(SSLSocketFactory) SSLSocketFactory.getDefault();
Socket s
=
ssf.createSocket(TLSParameter.IP, TLSParameter.SSLPORT);
BufferedReader in
=
new
BufferedReader(
new
InputStreamReader(s.getInputStream()));
String x
=
in.readLine();
System.out.println(x);
in.close();
}
}
方式二:设置SSLContext,通过上下文实例启用SSL-Server-Socket-Factory
public
class
SSLServer1 {
public
static
void
main(String args[])
throws
Exception {
SSLContext sslContext
=
SSLContext.getInstance(PROTOCOL);
KeyManager[] km
=
TLSSocket.createKeyManagers(keyStoreType, ICM_KEYSTORE);
TrustManager[] tm
=
TLSSocket.createTrustManagers(keyStoreType, ICM_KEYSTORE);
SecureRandom random
=
SecureRandom.getInstance(SHA1PRNG);
sslContext.init(km, tm, random);
SSLServerSocketFactory factory
=
sslContext.getServerSocketFactory();
ServerSocket ss
=
(SSLServerSocket) factory.createServerSocket(SSLPORT);
System.out.println(
"
SSL Server is started.
"
);
while
(
true
) {
Socket s
=
ss.accept();
PrintStream out
=
new
PrintStream(s.getOutputStream());
out.println(
"
ICM say Hello to UCGW!
"
);
out.close();
s.close();
}
}
}
public
class
SSLClient1 {
public
static
void
main(String args[])
throws
Exception {
SSLContext sslContext
=
SSLContext.getInstance(PROTOCOL);
KeyManager[] km
=
TLSSocket.createKeyManagers(keyStoreType, UCGW_KEYSTORE);
TrustManager[] tm
=
TLSSocket.createTrustManagers(keyStoreType, UCGW_KEYSTORE);
SecureRandom random
=
SecureRandom.getInstance(SHA1PRNG);
sslContext.init(km, tm, random);
SSLSocketFactory factory
=
sslContext.getSocketFactory();
System.out.println(
"
TLS Client, Connecting to server
"
+
IP
+
"
:
"
+
SSLPORT);
SSLSocket socket
=
(SSLSocket) factory.createSocket(IP, SSLPORT);
socket.setUseClientMode(
true
);
BufferedReader in
=
new
BufferedReader(
new
InputStreamReader(socket.getInputStream()));
String x
=
in.readLine();
System.out.println(x);
in.close();
}
}
三 Summary
ICM和UCGW共同信任CA,各自持有CA根证书和CA签发的自身证书,通过TLS协议实现传输层的安全通讯。
双向信任的两方无需持有对方证书。
四 EasterEgg
运行结果:
服务器端:
SSL Server is started.
client端:
ICM say Hello to UCGW!
网络包分析(工具:Wireshark)
1.抓取本地通信:route add 192.168.225.166
mask 255.255.255.255 192.168.225.254
metric 1
Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 192.168.225.166
Subnet Mask . . . . . . . . . . . : 255.255.255.0
IP Address. . . . . . . . . . . . : fe80::225:64ff:feb3:88dc%4
Default Gateway . . . . . . . . . : 192.168.225.254
2.设置过滤器
Filter:
ip.addr==192.168.225.166
Decode As:
transport = SSL
Filter:
ip.addr==192.168.225.166&&ssl
3.结果和分析
测试完毕 请删除本地IP:(reference: http://hi.baidu.com/btb368/blog/item/098d36acfbc837014b36d6cd.html)
route delete 192.168.225.166
Export File:
No. Time Source Destination Protocol Info
217
12.022322
192.168
.
225.166
192.168
.
225.166
SSLv2 Client Hello
Transmission Control Protocol,
Src Port: prp (
2091
), Dst Port:
9527
(
9527
)
, Seq:
1
, Ack:
1
, Len:
103
Secure Socket Layer
SSLv2 Record Layer: Client Hello
No. Time Source Destination Protocol Info
219
12.024335
192.168
.
225.166
192.168
.
225.166
TLSv1 Server Hello, Certificate, Server Hello Done
Transmission Control Protocol,
Src Port:
9527
(
9527
), Dst Port: prp (
2091
)
, Seq:
1
, Ack:
104
, Len:
1210
Secure Socket Layer
TLSv1 Record Layer: Handshake Protocol: Multiple Handshake Messages
No. Time Source Destination Protocol Info
221
12.036842
192.168
.
225.166
192.168
.
225.166
TLSv1 Client Key Exchange
Transmission Control Protocol,
Src Port: prp (
2091
), Dst Port:
9527
(
9527
)
, Seq:
104
, Ack:
1211
, Len:
139
Secure Socket Layer
TLSv1 Record Layer: Handshake Protocol: Client Key Exchange
No. Time Source Destination Protocol Info
225
12.161312
192.168
.
225.166
192.168
.
225.166
TLSv1 Change Cipher Spec, Encrypted Handshake Message
Transmission Control Protocol,
Src Port: prp (
2091
), Dst Port:
9527
(
9527
)
, Seq:
243
, Ack:
1211
, Len:
43
Secure Socket Layer
TLSv1 Record Layer: Change Cipher Spec Protocol: Change Cipher Spec
TLSv1 Record Layer: Handshake Protocol: Encrypted Handshake Message
No. Time Source Destination Protocol Info
227
12.165380
192.168
.
225.166
192.168
.
225.166
TLSv1 Change Cipher Spec
Transmission Control Protocol,
Src Port:
9527
(
9527
), Dst Port: prp (
2091
)
, Seq:
1211
, Ack:
286
, Len:
6
Secure Socket Layer
TLSv1 Record Layer: Change Cipher Spec Protocol: Change Cipher Spec
No. Time Source Destination Protocol Info
229
12.165965
192.168
.
225.166
192.168
.
225.166
TLSv1 Encrypted Handshake Message, Application Data, Application Data, Encrypted Alert
Transmission Control Protocol,
Src Port:
9527
(
9527
), Dst Port: prp (
2091
)
, Seq:
1217
, Ack:
286
, Len:
126
Secure Socket Layer
TLSv1 Record Layer: Handshake Protocol: Encrypted Handshake Message
TLSv1 Record Layer: Application Data Protocol: Application Data
TLSv1 Record Layer: Application Data Protocol: Application Data
TLSv1 Record Layer: Encrypted Alert
No. Time Source Destination Protocol Info
233
12.166930
192.168
.
225.166
192.168
.
225.166
TLSv1 Encrypted Alert
Transmission Control Protocol,
Src Port: prp (
2091
), Dst Port:
9527
(
9527
)
, Seq:
286
, Ack:
1344
, Len:
23
Secure Socket Layer
TLSv1 Record Layer: Encrypted Alert
分享到:
相关推荐
Java Socket编程是网络编程中的重要一环,它...总之,Java Socket编程是构建网络应用程序的基础,通过理解并实践"java socket传输demo",开发者可以掌握网络通信的基本原理,为进一步开发复杂的网络应用打下坚实基础。
总之,"JAVA文件传输(论文+源代码).zip"提供了一个全面的学习资源,涵盖了从理论到实践的Java文件传输技术。通过深入阅读论文和研究源代码,开发者可以加深对网络编程的理解,并能构建自己的文件传输系统。
### 基于Java的文件传输机制解析与实践 #### 引言 在现代网络通信中,文件传输是一项基本而重要的功能。Java作为一种广泛应用的编程语言,提供了多种方式实现文件在网络间的传输,其中,基于Socket的文件传输因其...
Java文件传输程序是一种基于Java编程语言...对于初学者,这是一个很好的实践项目,可以帮助理解文件传输和多线程编程的原理。对于有经验的开发者,这个程序可以作为一个起点,进行性能优化、安全性增强等方面的改进。
综上所述,Java在视频传输方面提供了全面的支持,包括网络连接、数据编码解码、流媒体处理、文件上传优化以及安全传输。通过深入学习和实践,开发者可以构建高效、稳定的视频传输系统。而"12题_视频传输(Java程序)...
在实际应用中,我们还需要考虑错误处理、资源管理(关闭流和Socket)、并发处理(多个客户端同时连接)以及安全性(加密传输,防止中间人攻击)等问题。对于大型项目,可能还会涉及负载均衡、服务发现等高级网络编程...
泛型的引入极大地增强了Java集合框架的类型安全性和灵活性。 用户图形界面GUI是创建交互式应用的基础。文件解释了AWT组件的使用、GUI的设计和Swing框架的结构和事件处理机制,这对于开发图形用户界面应用是必不可少...
然而,正确配置和使用SSL/TLS协议并不总是直观的,需要对协议细节和Java安全框架有一定的了解。在实际应用中,开发者应密切关注最新的安全标准和最佳实践,以确保其应用程序能够在不断演变的威胁环境中保持安全。
在Java编程语言中,文件传输是一项基础且重要的任务...通过这个“java版文件传输的小程序”,开发者可能已经实现了上述部分或全部功能,为学习Java的朋友提供了一个实际的案例,让他们更好地理解文件传输的原理和实践。
在Java编程中,TCP/IP(Transmission Control Protocol/Internet Protocol)是一...通过理解和实践,不仅可以掌握文件传输的实现,还能增强对Java网络编程的理解,这对于开发网络应用或进行系统集成工作都非常有帮助。
本篇文章将深入探讨Java如何处理和利用消息字符串进行数据传输,结合源码分析与实用工具的使用,帮助开发者更好地理解和实践这一核心概念。 一、Java消息字符串基础 消息字符串通常指的是以文本形式传输的数据,...
Java提供了一系列类和接口,如File、InputStream和OutputStream,用于读写文件和在网络中传输数据。 最后,可能还会涉及到Java的高级特性和库,比如反射、注解、Lambda表达式以及Java集合框架的高级使用,如TreeMap...
《Java安全性编程指南》是一本深入探讨如何在Java平台上实现安全编程的重要著作。该书针对的是那些希望构建安全、可靠的Java应用程序的开发者。在Java语言中,安全性是至关重要的,因为它的跨平台特性使得它成为了...
Java安全性编程实例主要涵盖的是Java平台上的安全机制和实践,这对于任何希望构建可靠、安全的Java应用程序的开发者来说都是至关重要的。Java作为一种跨平台的编程语言,其安全性是其核心特性之一,它提供了多种机制...
Java文件传输是一个常见的编程课题,尤其在毕业设计中,它涉及到网络编程、多线程、文件操作等核心技术。本项目提供了完整的源代码和相关的论文资料,对于深入理解Java技术栈和提升实际编程能力非常有帮助。 1. **...
Java安全编程指南旨在帮助开发者在使用Java编程时遵循最佳的安全实践,以保护应用程序免受潜在威胁。Java作为一种跨平台的编程语言,其安全性是其核心特性之一,但如果不正确地编写代码,可能会引入安全隐患。本指南...
本课程通过一系列实际项目,如文件传输、远程监控、图书管理系统以及温度检测语言图示系统,让学生在实践中理解和应用Java的核心概念。 1. 文件传输:在Java中,文件传输涉及`java.io`和`java.nio`包中的类,如...
本指南旨在提供全面的Java安全编程实践和策略,帮助开发者构建更安全的Java应用程序。 Java安全性涵盖多个层面,包括代码安全、访问控制、数据加密、网络安全以及恶意代码防范等。以下是一些核心的知识点: 1. **...
在IT行业中,文件传输是网络通信中的一个基本需求,而Java作为一种强大的编程语言,提供了丰富的API和工具来实现这样的功能。...通过学习和实践此类项目,开发者可以提升自己在网络编程和数据传输领域的专业技能。