`

基于ssl双向认证的详细例子

阅读更多
产生服务端证书库
keytool -genkey -alias serverkey -keystore kserver.ks
产生服务端私有密匙
keytool -export -alias serverkey -keystore kserver.ks -file server.crt
产生服务端公有密匙
keytool -import -alias serverkey -file server.crt -keystore tclient.ks
产生客户端证书库
keytool -genkey -alias clientkey -keystore kclient.ks
产生客户端私有密匙
keytool -export -alias clientkey -keystore kclient.ks -file client.crt
产生客户端公有密匙
keytool -import -alias clientkey -file client.crt -keystore tserver.ks
删除服务端证书库
keytool -delete -alias serverkey -keystore kserver.ks -storepass 123456
删除客户端证书库
keytool -delete -alias clientkey -keystore kclient.ks -storepass 456789
删除后,必须手动删除这些文件,以便重复操作

具体过程如下:
D:\>keytool -genkey -alias serverkey -keystore kserver.ks
输入keystore密码:  123456
您的名字与姓氏是什么?
  [Unknown]:  xuguo
您的组织单位名称是什么?
  [Unknown]:  fruitking
您的组织名称是什么?
  [Unknown]:  fruitking
您所在的城市或区域名称是什么?
  [Unknown]:  hangzhou
您所在的州或省份名称是什么?
  [Unknown]:  zhejiang
该单位的两字母国家代码是什么
  [Unknown]:  cn
CN=xuguo, OU=fruitking, O=fruitking, L=hangzhou, ST=zhejiang, C=cn 正确吗?
  [否]:  y

输入<clientkey>的主密码
        (如果和 keystore 密码相同,按回车):  123456

D:\>keytool -export -alias serverkey -keystore kserver.ks -file server.crt
输入keystore密码:  123456
保存在文件中的认证 <server.crt>

D:\>keytool -import -alias serverkey -file server.crt -keystore tclient.ks
输入keystore密码:  123456
Owner: CN=xuguo, OU=fruitking, O=fruitking, L=hangzhou, ST=zhejiang, C=cn
发照者: CN=xuguo, OU=fruitking, O=fruitking, L=hangzhou, ST=zhejiang, C=cn
序号: 4a9641c2
有效期间: Thu Aug 27 16:20:18 CST 2009 至: Wed Nov 25 16:20:18 CST 2009
认证指纹:
         MD5:  50:6D:45:A3:37:BF:51:45:94:F0:8B:4D:42:9F:72:8A
         SHA1: A9:C6:26:7E:A2:3E:B9:68:B8:E4:FE:E0:C2:3C:C9:E0:A3:67:76:B5
信任这个认证? [否]:  y
认证已添加至keystore中

D:\>F:

F:\>cd F:\testc

F:\testc>keytool -genkey -alias clientkey -keystore kclient.ks
输入keystore密码:  456789
您的名字与姓氏是什么?
  [Unknown]:  xuguo
您的组织单位名称是什么?
  [Unknown]:  pubone
您的组织名称是什么?
  [Unknown]:  pubone
您所在的城市或区域名称是什么?
  [Unknown]:  hangzhou
您所在的州或省份名称是什么?
  [Unknown]:  zhejiang
该单位的两字母国家代码是什么
  [Unknown]:  cn
CN=xuguo, OU=pubone, O=pubone, L=hangzhou, ST=zhejiang, C=cn 正确吗?
  [否]:  y

输入<cclientkey>的主密码
        (如果和 keystore 密码相同,按回车):  456789

F:\testc>keytool -export -alias clientkey -keystore kclient.ks -file client.crt

输入keystore密码:  456789
保存在文件中的认证 <client.crt>

F:\testc>keytool -import -alias clientkey -file client.crt -keystore tserver.ks

输入keystore密码:  456789
Owner: CN=xuguo, OU=pubone, O=pubone, L=hangzhou, ST=zhejiang, C=cn
发照者: CN=xuguo, OU=pubone, O=pubone, L=hangzhou, ST=zhejiang, C=cn
序号: 4a9643c3
有效期间: Thu Aug 27 16:28:51 CST 2009 至: Wed Nov 25 16:28:51 CST 2009
认证指纹:
         MD5:  FB:CC:9D:5C:E0:7E:A6:70:CB:31:78:BC:06:1F:53:BC
         SHA1: 97:10:7C:B2:70:78:07:5A:2B:2D:51:8E:73:B3:71:FB:4C:51:87:05
信任这个认证? [否]:  y
认证已添加至keystore中

F:\testc>

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;
public class Server {

/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
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("D:/kserver.ks"), "123456".toCharArray());//服务端私匙
        tks.load(new FileInputStream("F:/testc/tserver.ks"), "456789".toCharArray());//客户端公匙

        kmf.init(ks, "123456".toCharArray());
        tmf.init(tks);

        ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        SSLServerSocket serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(8443);
        serverSocket.setNeedClientAuth(true);

        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];
                int length = bis.read(buffer);
                System.out.println("Receive: " + new String(buffer, 0, length).toString());

                bos.write("Hello,Xuguo,welcome to here!".getBytes());
                bos.flush();

                s.close();
            } catch (Exception e) {
                System.out.println(e);
            }
        }
}

}

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
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;


public class Client {

/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
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("F:/testc/kclient.ks"), "456789".toCharArray());//客户端私匙
        tks.load(new FileInputStream("D:/tclient.ks"), "123456".toCharArray());//服务端公匙

        kmf.init(ks, "456789".toCharArray());
        tmf.init(tks);

        ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
        SSLSocket sslSocket = (SSLSocket) ctx.getSocketFactory().createSocket("localhost", 8443);
        InputStream input = sslSocket.getInputStream();
        OutputStream output = sslSocket.getOutputStream();

        BufferedInputStream bis = new BufferedInputStream(input);
        BufferedOutputStream bos = new BufferedOutputStream(output);

        //bos.write("Hello".getBytes());
        bos.write("Xuguo is a super man.".getBytes());
        bos.flush();

        byte[] buffer = new byte[20];
        int length = bis.read(buffer);
        System.out.println(new String(buffer, 0, length));

        sslSocket.close(); 
}

}
分享到:
评论

相关推荐

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

    压缩包中的`wss`测试例子展示了如何在WebSocket上应用SSL/TLS双向认证。 6. **证书导入**:为了测试,你需要将服务器的PKCS12格式的证书导入到浏览器的信任存储中,以便浏览器可以验证服务器的身份。同样,客户端也...

    C# TLS SSL TCP双向认证 X509Store SslStream Certificate

    C# TLS SSL TCP双向认证 X509Store SslStream Certificate Visual Studio 2017 命令提示 键入: makecert -r -pe -n “CN=TestServer” -ss Root -sky exchange 等待来自客户端的连接... 显示安全等级 密钥套件: Aes...

    GMSSL双向认证分析.docx

    总之,GMSSL双向认证是基于TLS协议的一种增强,利用了中国国家密码算法,确保了国内网络通信的自主可控和安全性。通过客户端和服务器之间的多轮交互,实现了双方身份的可靠验证和安全的密钥交换。这个过程涉及到证书...

    Openssl实现双向认证教程(附服务端客户端代码)

    总结,OpenSSL双向认证涉及证书的生成、配置SSL_CTX上下文、加载证书和私钥,以及在服务端和客户端进行验证。正确实施双向认证可以显著提高通信的安全性,防止未经授权的第三方干扰或窃取数据。对于开发者来说,理解...

    易语言-Socket实现OpenSSL双向认证连接

    首先,理解SSL双向认证的概念是至关重要的。在传统的单向认证中,服务器验证客户端的身份,而双向认证则要求双方都提供有效的身份证明。这意味着客户端不仅要验证服务器的身份,服务器也需要验证客户端的身份。这种...

    HP-Socket-5.5.1中文模块带例子-易语言

    同时,如果需要双向认证,客户端也需要提供自己的证书(如client.crt)。CA2.crt可能是证书颁发机构的根证书,用于验证服务器和客户端证书的合法性。 在使用HP-Socket-5.5.1模块时,开发者需要理解以下核心概念: -...

    基于Vue-cli和Servlet的前后端分离的电商系统.zip

    本项目“基于Vue-cli和Servlet的前后端分离的电商系统”就是一个典型的例子,它结合了前端的Vue.js框架和后端的Servlet技术来实现一个完整的电子商务平台。下面将详细探讨相关知识点。 1. **Vue-cli**: Vue-cli是...

    WebService开发实例图解教程

    - 可配置SSL连接为单向或双向认证。 11. **查看已发布EJB** - 在WebLogic管理控制台的“Deployment”部分,可以查看和管理所有已发布的EJB。 12. **消息驱动Bean(MDB)** - persistent MDB保证消息传递的可靠...

    net.rar_ftp http源码

    5. 安全性:讨论FTP和HTTP的安全增强,如FTPS(FTP over TLS/SSL)、HTTPS(HTTP over TLS/SSL)以及认证机制。 6. 错误处理与调试:提供常见网络错误的处理策略,以及如何调试网络应用。 7. 实践项目:可能包含...

    WebRTC+websocket

    2. **后端**:Java实现的WebSocket服务器,可能基于诸如Jetty或Spring Boot等框架,处理来自客户端的连接请求,转发信令数据,并可能提供了额外的服务,如用户认证或会话管理。 3. **配置文件**:可能包括服务器配置...

    暗黑风格-图解网络-小林coding-v2.0.pdf

    超文本的典型例子是HTML文档,它通过各种标签定义了链接、图片等信息,浏览器通过解析这些标签来展示出包含丰富媒体的网页。 ### HTTP方法 HTTP定义了多种请求方法,常用的方法包括GET和POST。 #### GET方法 GET...

    Go-GolanggRPC中间件拦截器链接验证日志记录重试等

    在Go中,`grpc.UnaryServerInterceptor` 和 `grpc.StreamServerInterceptor` 分别用于处理单向和双向流调用的拦截。 二、链接验证 链接验证确保客户端与服务器之间的连接是安全的。在gRPC中,这通常涉及到SSL/TLS...

    带入口的在家工作:使用Apache Guacamole和入口Websocket反向隧道的基于HTML5的远程桌面网关,包括AD身份验证和2-FA

    描述中提到了Active Directory(AD)身份验证和2-FA(两因素认证),这是网络安全的重要组成部分。AD是微软提供的一个目录服务,用于管理和验证用户身份,而2-FA增加了额外的安全层,要求用户提供除密码之外的第二种...

    MyChat:计算机网络课程设计作品---网络聊天室

    MyChat项目就是这样一个例子,它是一个基于Java技术实现的网络聊天应用程序,允许用户通过互联网进行实时通信。 **一、Java网络编程基础** MyChat的开发语言是Java,Java提供了丰富的API来支持网络编程,如Socket...

    websocket-server

    传统的HTTP协议是基于请求-响应模式的,而WebSocket则创建了一条持久连接,允许数据在服务器和客户端之间双向流动,无需为每个交互发送新的HTTP请求。 在JavaScript中,我们可以使用Node.js来构建WebSocket服务器,...

Global site tag (gtag.js) - Google Analytics