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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 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 );

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

目录
相关文章
|
安全 网络安全
Foxmail邮箱提示错误:ssl连接错误,errorCode:5解决方法
Foxmail邮箱提示错误:ssl连接错误,errorCode:5解决方法
2464 0
|
2月前
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
252 1
|
4月前
|
安全 Java 关系型数据库
Java连接Mysql SSL初始化失败
Java连接Mysql SSL初始化失败
|
4月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Linux VM使用6380端口(SSL方式)连接Azure Redis (redis-cli & stunnel)
【Azure Redis 缓存】Linux VM使用6380端口(SSL方式)连接Azure Redis (redis-cli & stunnel)
110 0
|
4月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
530 0
|
7月前
|
安全 网络安全 数据安全/隐私保护
HTTP代理SSL连接:保障网络安全的重要协议
HTTP代理SSL连接:保障网络安全的重要协议
|
7月前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
721 0
|
数据采集 网络安全 开发者
Request 爬虫的 SSL 连接问题深度解析
Request 爬虫的 SSL 连接问题深度解析
|
安全 网络安全 数据安全/隐私保护
此网站无法提供安全连接(客户端和服务器不支持一般 SSL 协议版本或加密套件。)
此网站无法提供安全连接(客户端和服务器不支持一般 SSL 协议版本或加密套件。)
683 0