`

SSL 的 java 实现

 
阅读更多

 

转载自: http://blog.csdn.net/chw1989/article/details/7584995

实现技术:
JSSE(Java Security Socket Extension
是Sun为了解决在Internet上的实现安全信息传输的解决方案。它实现了SSL和 TSL(传输层安全)协议。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。通过使用JSSE,可以在Client和 Server之间通过TCP/IP协议安全地传输数据。

 

为了实现消息认证。
Server需要:
1)KeyStore: 其中保存服务端的私钥
2)Trust KeyStore:其中保存客户端的授权证书
Client需要:
1)KeyStore:其中保存客户端的私钥
2)Trust KeyStore:其中保存服务端的授权证书

 

使用Java自带的keytool命令,去生成这样信息文件:

1)生成服务端私钥,并且导入到服务端KeyStore文件中

生成一个CA证书,在命令行下执行:
keytool -genkey -alias serverkey -keystore kserver.keystore 

   

     第一个参数是要生成的证书的名字;第二个参数是证书的别名。rsa指明了我们使用的加密方法。
系统会要求输入证书发放者的信息,逐项输入即可。
     系统生成的文件名将会和证书名相同。证书可以提交给权威CA认证组织审核,如果通过审核,组织会提供信任担保,向客户担保你的连接是安全的。当然这不是必须的。在我们的例子中会把证书直接打包到客户端程序中,保证客户端是授权用户,避免伪造客户,所以不需要提交审核。

生成后的结果:

keytool -genkey -keystore SSLKey -keyalg rsa -alias SSL 指定了使用RSA 加解密的方式

 

2)根据私钥,导出服务端证书,生成server .crt 文件。keytool -export -alias serverkey -keystore kserver.keystore -file server.crt

注意: -alias 和 -keystore 要相同,

crt 文件是公钥,用来解密,用来解密的要导入对方的trust 账户中。

 

3)将服务端证书,导入到客户端的Trust KeyStore

keytool -import -alias serverkey -file server.crt -keystore tclient.keystore

采用同样的方法,生成客户端的私钥,客户端的证书,并且导入到服务端的Trust KeyStore中
1)keytool -genkey -alias clientkey -keystore kclient.keystore 


2)keytool -export -alias clientkey -keystore kclient.keystore -file client.crt

--生成客户端的证书
3)keytool -import -alias clientkey -file client.crt -keystore tserver.keystore

--导入到服务端的Trust KeyStore中

 

Server端代码:

    package ssl;  
      
      
    import java.io.BufferedInputStream;  
    import java.io.BufferedOutputStream;  
    import java.io.FileInputStream;  
    import java.io.InputStream;  
    import java.io.OutputStream;  
    import java.net.Socket;  
    import java.security.KeyStore;  
      
    import javax.net.ssl.KeyManagerFactory;  
    import javax.net.ssl.SSLContext;  
    import javax.net.ssl.SSLServerSocket;  
    import javax.net.ssl.TrustManagerFactory;  
      
    /** 
     * 
     * @author Leo 
     */  
    public class Server implements Runnable{  
      
        private static final int    DEFAULT_PORT                    = 7777;  
      
        private static final String SERVER_KEY_STORE_PASSWORD       = "123456";  
        private static final String SERVER_TRUST_KEY_STORE_PASSWORD = "123456";  
      
        private SSLServerSocket     serverSocket;  
      
        /** 
         * 启动程序 
         *  
         * @param args 
         */  
        public static void main(String[] args) {  
            Server server = new Server();  
            server.init();  
            Thread thread = new Thread(server);  
            thread.start();  
        }  
      
        public synchronized void start() {  
            if (serverSocket == null) {  
                System.out.println("ERROR");  
                return;  
            }  
            while (true) {  
                try {  
                    Socket s = serverSocket.accept();  
                    InputStream input = s.getInputStream();  
                    OutputStream output = s.getOutputStream();  
      
                    BufferedInputStream bis = new BufferedInputStream(input);  
                    BufferedOutputStream bos = new BufferedOutputStream(output);  
      
                    byte[] buffer = new byte[20];  
                    bis.read(buffer);  
                    System.out.println("------receive:--------"+new String(buffer).toString());  
      
                    bos.write("yes".getBytes());  
                    bos.flush();  
      
                    s.close();  
                } catch (Exception e) {  
                    System.out.println(e);  
                }  
            }  
        }  
        public void init() {  
            try {  
                SSLContext ctx = SSLContext.getInstance("SSL");  
      
                KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");  
                TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");  
      
                KeyStore ks = KeyStore.getInstance("JKS");  
                KeyStore tks = KeyStore.getInstance("JKS");  
                //keystore 与 trust key store 
                ks.load(new FileInputStream("src/ssl/kserver.keystore"), SERVER_KEY_STORE_PASSWORD.toCharArray());  
                tks.load(new FileInputStream("src/ssl/tserver.keystore"), SERVER_TRUST_KEY_STORE_PASSWORD.toCharArray());  
      
                kmf.init(ks, SERVER_KEY_STORE_PASSWORD.toCharArray());  
                tmf.init(tks);  
      
                ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);  
      
                serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(DEFAULT_PORT);  
                serverSocket.setNeedClientAuth(true);   
            } catch (Exception e) {  
                System.out.println(e);  
            }  
        }  
      
        public void run() {  
            // TODO Auto-generated method stub  
            start();  
        }  
    }  

 Client

    package ssl;  
      
    import java.io.BufferedInputStream;  
    import java.io.BufferedOutputStream;  
    import java.io.FileInputStream;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.io.OutputStream;  
    import java.security.KeyStore;  
      
    import javax.net.ssl.KeyManagerFactory;  
    import javax.net.ssl.SSLContext;  
    import javax.net.ssl.SSLSocket;  
    import javax.net.ssl.TrustManagerFactory;  
      
    /** 
     * SSL Client 
     *  
     * @author Leo 
     */  
    public class Client {  
      
        private static final String DEFAULT_HOST                    = "127.0.0.1";  
        private static final int    DEFAULT_PORT                    = 7777;  
      
        private static final String CLIENT_KEY_STORE_PASSWORD       = "123456";  
        private static final String CLIENT_TRUST_KEY_STORE_PASSWORD = "123456";  
      
        private SSLSocket           sslSocket;  
      
        /** 
         * 启动客户端程序 
         *  
         * @param args 
         */  
        public static void main(String[] args) {  
           Client client = new Client();  
            client.init();  
            client.process();  
        }  
      
       
        public void process() {  
            if (sslSocket == null) {  
                System.out.println("ERROR");  
                return;  
            }  
            try {  
                InputStream input = sslSocket.getInputStream();  
                OutputStream output = sslSocket.getOutputStream();  
      
                BufferedInputStream bis = new BufferedInputStream(input);  
                BufferedOutputStream bos = new BufferedOutputStream(output);  
      
                bos.write("1234567890".getBytes());  
                bos.flush();  
      
                byte[] buffer = new byte[20];  
                bis.read(buffer);  
                System.out.println(new String(buffer));  
      
                sslSocket.close();  
            } catch (IOException e) {  
                System.out.println(e);  
            }  
        }  
      
      
        public void init() {  
            try {  
                SSLContext ctx = SSLContext.getInstance("SSL");  
      
                KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");  
                TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");  
      
                KeyStore ks = KeyStore.getInstance("JKS");  
                KeyStore tks = KeyStore.getInstance("JKS");  
                //key store 与 trust key store 
                ks.load(new FileInputStream("src/ssl/kclient.keystore"), CLIENT_KEY_STORE_PASSWORD.toCharArray());  
                tks.load(new FileInputStream("src/ssl/tclient.keystore"), CLIENT_TRUST_KEY_STORE_PASSWORD.toCharArray());  
      
                kmf.init(ks, CLIENT_KEY_STORE_PASSWORD.toCharArray());  
                tmf.init(tks);  
      
                ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);  
      
                sslSocket = (SSLSocket) ctx.getSocketFactory().createSocket(DEFAULT_HOST, DEFAULT_PORT);  
            } catch (Exception e) {  
                System.out.println(e);  
            }  
        }  
      
    }  

 如此,就完成了服务端和客户端之间的基于身份认证的交互。
client采用kclient.keystore中的clientkey私钥进行数据加密,发送给server。
server采用tserver.keystore中的client.crt证书(包含了clientkey的公钥)对数据解密,如果解密成功,证明消息来自client,进行逻辑处理。

server采用kserver.keystore中的serverkey私钥进行数据加密,发送给client。
client采用tclient.keystore中的server.crt证书(包含了serverkey的公钥)对数据解密,如果解密成功,证明消息来自server,进行逻辑处理。
如果过程中,解密失败,那么证明消息来源错误。不进行逻辑处理。这样就完成了双向的身份认证。

 

分享到:
评论

相关推荐

    ssl java实现

    在Java中实现SSL,主要是通过Java的JSSE(Java Secure Socket Extension)框架来完成的。下面将详细介绍Java中实现SSL的基本步骤、核心概念以及相关的API。 ### 1. SSL协议概述 SSL协议主要包含三个部分:握手协议...

    Java实现SSL双向认证的方法

    实现Java SSL双向认证通常涉及以下几个步骤: 1. **生成密钥库(KeyStore)**: - 服务器端需要一个KeyStore,存储其私钥,通常使用`keytool`命令生成,例如:`keytool -genkey -alias serverkey -keystore ...

    JAVA实现SSL协议

    总的来说,Java实现SSL协议涉及到许多安全概念和技术,包括证书管理、密钥对生成、加密算法选择等。正确配置和使用SSL能为你的应用程序提供强大的安全保障,保护用户的数据免受窃听和篡改。在实际开发过程中,应根据...

    SSL server client JAVA实现代码

    下面将详细介绍如何使用JAVA实现SSL服务器和客户端的通信。 首先,理解SSL的基本流程是必要的。SSL通信通常包括以下步骤: 1. 客户端发起连接请求。 2. 服务器发送其数字证书,证书中包含了公钥。 3. 客户端验证...

    JAVA实现的SSL/TLS双向认证源代码

    本篇将深入探讨如何使用Java实现SSL/TLS双向认证,以及涉及到的相关工具和步骤。 首先,让我们理解什么是SSL/TLS双向认证。通常,SSL/TLS连接采用单向认证,即服务器验证客户端的身份,而客户端不需要验证服务器。...

    Java Socket 实现SMTP邮件发送,支持SSL/TSL

    在本案例中,我们将关注如何使用Java Socket来实现SMTP(Simple Mail Transfer Protocol)邮件发送,并支持SSL(Secure Sockets Layer)和TLS(Transport Layer Security)安全协议。 SMTP是一种互联网标准,用于在...

    SSL.rar_JAVA SSL _ssl_ssl java

    标题"SSL.rar_JAVA SSL _ssl_ssl java"表明这个压缩包包含的是关于Java中实现SSL/TLS协议的示例代码,可能是服务器端和客户端的简单实现。 描述中提到"SSL加密简单的服务端和客户端书写.希望对大家有所帮助",这...

    java程序实现ssl

    在Java编程环境中,通过Java的JSSE(Java Secure Socket Extension)框架可以实现SSL的支持。 **1. Java中的JSSE框架** JSSE是Java提供的一个标准API,它提供了实现SSL/TLS(Transport Layer Security,SSL的后续...

    Java实现SSL TLS

    Java 实现 SSL/TLS SSL(Secure Sockets Layer)和其后续版本 TLS(Transport Layer Security)是网络安全协议,用于在互联网上提供加密通信和身份验证。这个文档旨在为使用 Java 实现 SSL/TLS 提供一个简明易懂的...

    JAVA通过LDAP+SSL(证书)实现用户和组织(部门)增删改查.zip

    本文将深入探讨如何使用Java通过LDAP(轻量级目录访问协议)和SSL(安全套接层)来实现用户和组织(部门)的增删改查操作,并结合证书确保通信的安全性。这些功能通常用于大型企业的用户管理,例如Active Directory...

    java_ssl.rar_JAVA SSL _The Client_ssl_ssl java

    Java SSL(Secure Socket Layer)是Java平台中用于实现安全网络通信的重要组成部分,它提供了一种在互联网上进行安全数据传输的方式。SSL协议主要用于保护HTTP协议,形成HTTPS,以确保诸如网上银行、电子商务交易等...

    SSL双向认证java实现

    SSL 双向认证 Java 实现 SSL 双向认证是指在客户端和服务器端之间的通信过程中,双方都需要对对方进行身份验证和授权,以确保通信的安全性。Java 语言提供了 JSSE(Java Security Socket Extension)来实现 SSL ...

    JAVA NIO MINA2调用大宝CA密码安全套件实现国密SSL安全通道,1.0.1版本,含通信示例代码

    使用方法见:https://blog.csdn.net/upset_ming/article/details/96491058 1. 修改了前一版本中证书验证的bug,支持JDK8的高版本 2. 支持国密SSL双向认证 3. 将过期的国密证书替换为新证书

    netty做服务端支持ssl协议实现websocket的wss协议(java)

    总的来说,实现Netty服务端支持SSL协议以实现WebSocket的WSS协议,需要理解SSL/TLS的工作原理,熟悉Java的SSL编程,以及掌握Netty框架的基本用法。同时,心跳机制的实现也是保持WebSocket连接稳定的关键。

    java实现-SSL双向认证1.docx

    4. **Java代码实现**:在Java中,可以使用JSSE(Java Secure Socket Extension)来配置SSL上下文并创建SSLServerSocket或SSLSocket。在服务器端,需要设置KeyManagerFactory和TrustManagerFactory,它们分别处理...

    Tomcat_SSL.rar_JAVA SSL _ssl_ssl java_tomcat_tomcat ssl

    Tomcat作为一款流行的Java应用服务器,支持SSL配置以实现HTTPS协议,提供加密通信和服务器身份验证。本教程将深入讲解如何在Tomcat中配置SSL,以便在开发和部署Java Web应用时,能够提供安全的数据交换环境。 首先...

    ssl_java.zip

    以上就是Java实现SSL双向认证的基本原理和操作步骤。在实际项目中,需要根据具体需求进行调整和优化,例如使用NIO进行异步通信,或者使用HTTPS在Web服务中实现SSL。在处理SSL连接时,还要注意性能和安全性之间的平衡...

    java的ssl客户端编程与LINUX的OpenSSL服务器通讯的实现及有关文

    java的ssl客户端编程与LINUX的OpenSSL服务器通讯的实现及有关文档 附件中包含本人开发工程中使用过的DEMO程序及制作证书的解本文件

    SSL.gz_ssl_ssl java_ssl证书

    在描述中提到的“简单的SSL实现”,可能是指在Java环境中建立SSL连接的一个简化流程,这通常包括创建SSLContext,初始化SSLSocketFactory,以及设置服务器和客户端的信任策略。这个过程涉及到以下步骤: 1. **生成...

Global site tag (gtag.js) - Google Analytics