`
darkjune
  • 浏览: 309867 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

    博客分类:
  • SSL
SSL 
阅读更多

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 );

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

分享到:
评论

相关推荐

    ApacheFtpServer之ssl配置

    2. **连接测试**:点击“连接”,如果一切正常,将会出现SSL证书验证对话框,显示的是之前通过`keytool`生成的证书信息。此时选择接受该证书,即可成功建立安全的FTP连接。 #### 三、总结与扩展 通过上述步骤,...

    javapns-jdk16-163.jar和bcprov-jdk16-145.jar

    Bouncy Castle的强大加密功能可以帮助JavaPNS库安全地与APNS服务器建立连接,并进行加密的数据交换。 在实际应用中,开发者可能需要先配置好Apple的推送证书,然后使用JavaPNS库将这些证书加载到应用中。Bouncy ...

    javapns-jdk

    2. **连接建立**:JavaPNS库负责创建到APNs服务器的SSL连接,这需要提供正确的服务器地址和端口,以及之前提到的证书。 3. **通知构造**:开发者需要定义推送通知的内容,包括标题、正文、声音、附加数据等,并将...

    jdk7源代码(内含jsse源代码)

    2. 使用`SocketChannel`进行NIO操作时,通过`SSLSocketChannel`进行SSL连接也会创建`SSLSocketImpl`。 3. 对于基于HTTP的连接,如HTTPS,`HttpURLConnection`在建立安全连接时也会用到`SSLSocketImpl`。 要解决内存...

    JAVA环境下基于SSL的加密通信.pdf

    通过SSLServerSocket和SSLSocket,服务器和客户端可以建立加密的连接。 5. 最后,利用建立的SSL套接字进行数据的加密传输。在数据传输过程中,SSL协议会自动对数据进行加密和解密,确保数据在传输过程中的安全。 ...

    ftp.zip_FTP客户端程序_ftp_ftp java_ftp客户端 java_java ftp客户端

    5. **SSL/TLS安全连接**:如果FTP服务器支持FTPS(FTP over SSL/TLS),则需要使用`javax.net.ssl.SSLSocket`代替`java.net.Socket`,并遵循SSL/TLS握手过程。 6. **被动模式(PASV)**:FTP有主动和被动两种模式。...

    服务器出现java.sql.SQLException No suitable driver found for 的.pdf

    “java.sql.SQLException: No suitable driver found for”这一异常表示在尝试建立数据库连接时,系统未能找到能够处理特定URL的合适驱动程序。这可能是由于缺少必要的JDBC驱动、驱动未正确加载、驱动与当前环境不...

    实战验证过的最新远程Tomcat调试方式(基于IDEA2023/2024, JDK1.8, TOMCAT9, WIN10的)

    本文将详细介绍一种经过实战验证的远程Tomcat调试方法,适用于JDK1.8、Tomcat 9.0.8、IntelliJ IDEA 2023(Ultimate版)及Windows 10操作系统。该方法已经过验证,可以有效地避免常见的“Unable to connect to the ...

    https连接webservice

    #### 二、建立私密连接的步骤 1. **环境准备**: - 操作系统:Windows 7 - Web服务器:Tomcat 7 - JDK版本:1.7 2. **使用JDK的Keytool生成证书**: - **生产服务器证书**: - 执行命令行命令,使用`...

    commons-net-1.4.1.jar

    开发者可以通过这个类建立连接,登录,切换工作目录,执行文件操作,并断开连接。 2. FTPFile:表示FTP服务器上的文件或目录,提供了文件属性,如大小、类型、修改日期等。 3. FTPSClient:除了FTP,此库还支持FTP...

    目录服务和+JNDI

    ### JNDI与目录服务详解 #### 一、JNDI概述 JNDI(Java Naming and Directory Interface)是Java平台...此外,还介绍了如何使用SASL和SSL与LDAP服务器建立安全连接,这对于在实际项目中应用JNDI技术具有重要意义。

    基于xmpp协议的开源库smack接口api详细介绍

    对于需要使用SSL连接的JDK 1.2和1.3用户,需要在类路径中包含JSSE库。 Smack库中最为核心的类是XMPPConnection,它用于与XMPP服务器建立连接。创建一个基本的连接可以通过以下代码实现: ```java XMPPConnection ...

    Java Programming with Oracle JDBC

    - 连接字符串的格式及参数设置。 - **2.4 处理异常**: - 在连接过程中可能遇到的常见异常。 - 异常处理策略。 #### 四、Applet数据库连接 - **3.1 Oracle驱动程序与JDK版本**: - Oracle JDBC驱动程序的不同...

    smack详细类库

    对于JDK 1.2和1.3,如果需要SSL连接,需要额外添加JSSE库。 **建立连接** 通过`XMPPConnection`类创建到XMPP服务器的连接,例如: ```java XMPPConnection conn1 = new XMPPConnection("jabber.org"); ``` 如果...

    java聊天室代码 私聊,公共聊天

    一旦连接建立,服务器端会为每个客户端创建一个Socket,用于处理一对一的通信。 其次,为了实现多用户的并发聊天,我们需要使用多线程技术。当一个新的客户端连接到服务器时,服务器会在新的线程上处理该连接,这样...

    netty游戏服务器核心

    3. 工作线程池(BossGroup 和 WorkerGroup): BossGroup 处理新进来的连接,WorkerGroup 处理已建立连接上的读写事件。 二、Netty 的 ByteBuf 1. ByteBuf 是 Netty 提供的缓冲区,替代了 JDK 的 ByteBuffer。ByteBuf...

    commons-net-ftp-2.0.jar.zip

    然而,需要注意的是,如果在JDK 1.7以上的版本中使用这个库,可能会遇到一些方法的变更。由于Java的版本更新,某些API可能已经过时或者被移除,因此在使用时需要查阅最新的API文档以确保兼容性。Apache Commons Net...

    jms,weblogic电子书

    3. **配置连接工厂**:连接工厂决定了客户端如何与JMS服务器建立连接。在WebLogic中,可以通过指定JNDI名称、连接池大小等参数来配置连接工厂,以满足不同的性能和可靠性需求。 4. **定义目的地**:根据应用场景...

    Smack类库详细介绍

    值得注意的是,对于希望使用SSL加密连接的开发者,需确保JSSE库位于类路径中,尤其是在JDK1.2和1.3环境下。 #### 建立连接 `XMPPConnection`类是与XMPP服务器建立通信的核心。对于需要SSL安全连接的情况,`...

    sqljdbc_6.0.8112.200_chs.rar

    4. **JDBC API的使用**:JDBC API提供了`Connection`、`Statement`、`PreparedStatement`、`CallableStatement`和`ResultSet`等接口,用于建立数据库连接、执行SQL语句和获取结果。 5. **事务管理**:JDBC支持事务...

Global site tag (gtag.js) - Google Analytics