`

SSL

    博客分类:
  • Java
 
阅读更多
JAVA 双向SSL,SOCKET客户端/服务端
[/size][size=small]
实现技术:
JSSE(Java Security Socket Extension)
Server需要:
1)KeyStore: 其中保存服务端的私钥
2)Trust KeyStore:其中保存客户端的授权证书
Client需要:
1)KeyStore:其中保存客户端的私钥
2)Trust KeyStore:其中保存服务端的授权证书


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

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

2)根据私钥,导出服务端证书

3)将服务端证书,导入到客户端的Trust 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


Server:
Java代码
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");   
  
             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:
Java代码
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");   
  
             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);   
         }   
     }   
  



启动Server


启动Client,发送信息。

Server接收如下:正确解密
返回Client信息,

如此,就完成了服务端和客户端之间的基于身份认证的交互。

client采用kclient.keystore中的clientkey私钥进行数据加密,发送给server。
server采用tserver.keystore中的client.crt证书(包含了clientkey的公钥)对数据解密,如果解密成功,证明消息来自client,进行逻辑处理。

server采用kserver.keystore中的serverkey私钥进行数据加密,发送给client。
client采用tclient.keystore中的server.crt证书(包含了serverkey的公钥)对数据解密,如果解密成功,证明消息来自server,进行逻辑处理。

如果过程中,解密失败,那么证明消息来源错误。不进行逻辑处理。这样就完成了双向的身份认证。
分享到:
评论

相关推荐

    boringssl win-x86_64 包含bssl.exe,crypto.lib,ssl.lib

    BoringSSL是一个由Google维护的SSL/TLS实现,它是OpenSSL的一个分支,旨在提供更简洁的代码库,更严格的审核,以及对现代硬件优化的支持。这个win-x86_64包显然为Windows 64位平台设计,包含了三个关键组件:`bssl....

    Tomcat_SSL.rar_JAVA SSL _ssl_ssl java_tomcat_tomcat ssl

    在IT行业中,尤其是在Web服务器和应用服务器领域,SSL(Secure Sockets Layer)和其后续版本TLS(Transport Layer Security)是确保数据传输安全的关键技术。Tomcat作为一款流行的Java应用服务器,支持SSL配置以实现...

    MySQL 使用 SSL 连接配置详解

    MySQL 使用SSL连接配置详解 在现代数据库管理中,安全性是至关重要的,SSL(Secure Sockets Layer)连接为MySQL提供了一种加密数据传输的方式,确保了客户端和服务器之间的通信不被窃听或篡改。本文将详细介绍如何...

    K8S集群ssl证书监控ssl-exporter资源清单文件及镜像文件

    在Kubernetes(K8S)集群环境中,安全套接字层(SSL)证书的监控是确保服务安全和稳定的重要环节。SSL证书用于加密网络通信,确保数据传输的安全性。`ssl-exporter`是一款专为监控SSL/TLS证书状态设计的Prometheus ...

    解决Python找不到ssl模块问题 No module named _ssl的方法

    在Python编程过程中,有时会遇到导入模块时遇到错误,例如"ImportError: No module named _ssl"。这个错误通常表示Python无法找到SSL模块,该模块是Python标准库的一部分,用于处理安全套接层(SSL)和传输层安全...

    mod_ssl(apache SSL插件)

    **Apache SSL 插件:mod_ssl** Apache HTTP Server 是世界上最流行的Web服务器软件,而mod_ssl是Apache的一个核心模块,专门用于实现安全套接层(SSL)协议,为网站提供安全的HTTPS服务。SSL(Secure Sockets Layer...

    ssl_tls协议RFC5246文档_ssl_ssl标准文档_

    SSL/TLS(安全套接层/传输层安全)协议是互联网上广泛使用的安全通信协议,用于在客户端(如浏览器)和服务器之间建立安全、私密的连接,保护数据免受窃听和篡改。RFC5246文档是SSL/TLS协议的最新版本,正式名为...

    本地ssl证书生成工具

    SSL(Secure Sockets Layer)证书是互联网安全领域的重要组成部分,用于加密用户与服务器之间的通信,确保数据在传输过程中不被窃取或篡改。在本地生成SSL证书,可以帮助开发者在测试环境中模拟真实环境的安全设置,...

    信安ssl 配置 文档

    ### 信安SSL配置知识点详解 #### 一、实施步骤和操作过程 1. **登录管理界面**: - **管理口**: 设备的Port1口,地址为192.168.1.99。 - **登录方式**: - 直接连接笔记本电脑至设备的Port1口并通过浏览器访问`...

    STM32 实现SSL通讯

    ### STM32 实现SSL通讯 #### 一、引言 随着网络安全日益受到重视,确保数据传输的安全性成为了一个不容忽视的问题。对于嵌入式系统而言,如何在资源受限的条件下实现安全通信变得尤为重要。本篇文章将基于STM32F...

    ApacheFtpServer之ssl配置

    ### ApacheFtpServer之ssl配置详解 #### 一、FTPS概述 FTPS(File Transfer Protocol Secure),即安全文件传输协议,是一种通过SSL/TLS(Secure Sockets Layer/Transport Layer Security)来保护传统FTP(File ...

    Nginx配置SSL自签名证书的方法

    本文将详细介绍如何在Nginx服务器上配置SSL自签名证书。 首先,我们需要生成自签名SSL证书。这通常包括以下步骤: 1. **生成RSA密钥**:使用`openssl genrsa`命令创建一个带有密码保护的RSA私钥。例如,`openssl ...

    Vue项目部署Nginx配置文件 SSL

    ssl_session_cache shared:SSL:10m; # 管理 SSL 会话缓存 ssl_session_timeout 10m; # 设置 SSL 会话超时时间 ``` 6. **处理静态资源**: - 通过 `location` 块配置,Nginx 可以高效地处理各种静态文件请求,...

    VC工程,ssl通讯socket,服务端和客户端,简单易懂。

    在本文中,我们将深入探讨如何使用Visual C++(VC)进行SSL通信,主要基于OpenSSL库来实现Socket服务器和客户端的交互。SSL(Secure Sockets Layer)是一种安全协议,用于在互联网上提供加密通信和身份验证,而...

    SSL 和windows及浏览器等兼容性报告

    本报告就如何配置SSL/TLS以提供最先进的身份验证和加密技术提出了一般性建议。ssl引擎提供的选项是从 自从Netscape开发SSL2.0以来的早期。TLS的引入使问题变得更具有挑战性,因为服务器和客户端根据各个ssl引擎提供...

    SSL证书在线生成系统源码

    SSL证书在线生成系统源码是实现网站安全的重要工具,它基于公钥基础设施(PKI)原理,用于在互联网上建立安全的数据传输通道。本系统允许用户通过在线方式申请并生成SSL证书,简化了传统SSL证书获取流程,提升了用户...

    超微H12SSL-C用户手册

    ### 超微H12SSL-C用户手册关键知识点解析 #### 一、产品概述与文档准确性声明 根据所提供的文件信息,“超微H12SSL-C用户手册”是一份关于超微H12SSL-C系列服务器主板(包括H12SSL-i/C/CT/NT型号)的操作指南。该...

    linux下用C写的基于SSL 的TCP例子代码!

    在Linux环境下,使用C语言编写基于SSL(Secure Socket Layer)的TCP程序是一项常见的任务,尤其在开发安全通信软件时。SSL是一种网络安全协议,用于在Internet上提供加密通信和身份验证。下面将详细介绍如何在Linux...

    SSL工作原理详解

    SSL(Secure Socket Layer)是一种广泛使用的网络安全协议,其主要任务是提供加密通信和身份认证,确保数据在网络传输过程中的安全性和完整性。SSL的工作原理涉及到多个关键概念和技术。 首先,SSL的核心在于加密,...

    android ssl证书验证

    在Android平台上,SSL(Secure Sockets Layer)证书验证是一个关键的安全环节,用于保护应用程序与服务器之间的通信不被窃听或篡改。SSL证书是身份验证的一种方式,它确保了用户与服务器之间的连接是安全的,数据...

Global site tag (gtag.js) - Google Analytics