JDK SSL连接建立的一些细节及解释

简介: SSL通道能解决用户验证,指纹防篡改,数据加密。 用户验证通过双方的证书链来进行, 防篡改有证书的数字签名,数据加密则由SSL握手协商后的对称密码来对socket包进行加密。
+关注继续查看

SSL通道能解决用户验证,指纹防篡改,数据加密。 用户验证通过双方的证书链来进行, 防篡改有证书的数字签名,数据加密则由SSL握手协商后的对称密码来对socket包进行加密。

 

SSL双向验证中,1)客户端需要提供自己的证书供服务器端进行验证。2)服务器端用客户端的证书中的公钥对握手数据加密,客户端需要用自己的密钥来解密握手数据。3)握手中需要产生随机数。 所以JDK中的SSLContext中的初始化方法init中需要这三个参数,其声明方法为

init(KeyManager[] km, TrustManager[] tm, SecureRandom random) ,

以下为样例,我们这里不打算从JDK的keytool建立的库中取证书,只是直接从一个已知的字符串中拿证书,所以直接实现一个简单的TrustManager和KeyManager:

sslcontext = SSLContext.getInstance("SSL");
sslcontext.init(new KeyManager[] {new SimpleKeyManager(privateKey, x509selfCertChain)}
                      ,
                      new TrustManager[] {new SimpleTrustManager(x509TrustedCert)}
                      ,
                      new SecureRandom ());

 

 

SimpleKeyManager实现了X509KeyManager接口,保存自己的证书内容和私钥。

SimpleTrustManager实现了TrustManager接口,保存了客户端信任的证书。

 

init后SSLContext初始化完成,此时可以调用SSLContext.getSocketFactory()取得SSLSocketFactory实例。然后用取到的factory来建立SSLSocket连接,当然,还需要提供Socket对象,host地址,host端口:

 

(SSLSocket) sslssFactory.createSocket(Socket s, String host, int port, boolean autoClose);

 

 

得到了SSLSocket之后的操作就跟普通socket一样了,socket.getOutputStream()

 

SSLSocket有几个选项设置SSL连接建立时的设置,如配置服务器模式或客户端模式,以下是较有用的几个:

 SSLSocket.setEnabledCipherSuites( new String[]{"SSL_RSA_WITH_RC4_128_MD5" });

 SSLSocket支持的密码套件。

 SSLSocket.setEnableSessionCreation( true );

 新的SSL可以此socket建立。

 SSLSocket.setNeedClientAuth( true );

 是否要求客户端身份验证,既校验证书。

 SSLSocket.setUseClientMode( false );

 握手时使用什么模式(客户端/服务器)。

目录
相关文章
|
3月前
|
存储 Java
WebSocket区分不同客户端方法
WebSocket区分不同客户端方法
118 0
|
4月前
|
网络协议 Java
Java实现TCP通信的文件上传 之 代码优化开启多线程
Java实现TCP通信的文件上传 之 代码优化开启多线程
|
6月前
|
网络协议
TCP 通信并发服务器详解(附有案例代码)
TCP 通信并发服务器详解(附有案例代码)
|
6月前
|
网络协议
TCP 通信流程详解(附有案例代码)
TCP 通信流程详解(附有案例代码)
|
6月前
|
Python
Python|MitmProxy代理抓包工具实践难点
Python|MitmProxy代理抓包工具实践难点
128 0
|
8月前
|
网络协议 Java
《bug记录》在利用TCP协议创建【服务器-客户端交互程序】中出现的一些问题
《bug记录》在利用TCP协议创建【服务器-客户端交互程序】中出现的一些问题
|
Java
【Java 网络编程】UDP 服务器 与 客户端持续交互 案例
【Java 网络编程】UDP 服务器 与 客户端持续交互 案例
323 0
【Java 网络编程】UDP 服务器 与 客户端持续交互 案例
|
安全 网络安全 数据安全/隐私保护
netty案例,netty4.1中级拓展篇十三《Netty基于SSL实现信息传输过程中双向加密验证》
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
257 0
netty案例,netty4.1中级拓展篇十三《Netty基于SSL实现信息传输过程中双向加密验证》