首先创建服务器端私有密钥和公共密钥

1, keytool -genkey -alias clientkey -keystore kserver.ks

密码: serverpass

2, keytool -export -alias serverkey -keystore kserver.ks -file server.crt

3, keytool -import -alias serverkey -file server.crt -keystore tclient.ks

密码: clientpublicpass

下面创建客户器端私有密钥和公共密钥

1, keytool -genkey -alias clientkey -keystore kclient.ks

密码: clientpass

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

3, keytool -import -alias clientkey -file client.crt -keystore tserver.ks

密码: serverpublicpass

把服务器端产生的公共密钥放到客户端, 同样把客户端创建的公共密钥放到服务器端.

下面是服务器端代码:

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 SSLTestServer {

public static void main(String[] args) throws Exception {

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("cert/kserver.ks"), "serverpass".toCharArray());

tks.load(new FileInputStream("cert/tserver.ks"), "serverpublicpass".toCharArray());

kmf.init(ks, "serverpass".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 utput = 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".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 SSLTestClient {

public static void main(String[] args) throws Exception {

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("cert/kclient.ks"), "clientpass".toCharArray());

tks.load(new FileInputStream("cert/tclient.ks"), "clientpublicpass".toCharArray());

kmf.init(ks, "clientpass".toCharArray());

tmf.init(tks);

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

SSLSocket sslSocket = (SSLSocket) ctx.getSocketFactory().createSocket("localhost", 8443);

InputStream input = sslSocket.getInputStream();

OutputStream utput = sslSocket.getOutputStream();

BufferedInputStream bis = new BufferedInputStream(input);

BufferedOutputStream bos = new BufferedOutputStream(output);

bos.write("Hello".getBytes());

bos.flush();

byte[] buffer = new byte[20];

int length = bis.read(buffer);

System.out.println(new String(buffer, 0, length));

sslSocket.close();

}

}

常见的HTTPS传输, 不需要进行客户端认证, 也就是单向认证. 这时也就不需要创建客户端的私钥和公钥. 服务器端也只要配置一下服务器端的私钥即可, 当客户端浏览器访问时会生成一个证书文件,类似于上面创建的crt文件. 如果需要程序访问,可以通过这个crt文件生成一个keystore. 然后是用这个keystore作为trust keystore即可.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10742815/viewspace-589278/,如需转载,请注明出处,否则将追究法律责任。

linux ssl 双向认证 脚本,SSL双向认证的例子相关推荐

  1. SSL双向认证和SSL单向认证的流程和区别

    refs: SSL双向认证和SSL单向认证的区别 https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证! https://cloud.te ...

  2. Openssl 建立双向认证的 SSL/TLS 通信

    话不多说,直接利用 Openssl 在两台 uBuntu 之间建立双向认证的 SSL/TLS 通信. 笔者使用的 Openssl 版本为 OpenSSL 1.1.1 11 Sep 2018 生成证书 ...

  3. SSL/TLS 双向认证(一) -- SSL/TLS工作原理

    本文部分参考: https://www.wosign.com/faq/faq2016-0309-03.htm https://www.wosign.com/faq/faq2016-0309-04.ht ...

  4. SSL/TLS 双向认证(一) -- SSL/TLS 工作原理

    本文部分参考: https://www.wosign.com/faq/faq2016-0309-03.htm https://www.wosign.com/faq/faq2016-0309-04.ht ...

  5. SSL双向认证和SSL单向认证的区别

    双向认证 SSL 协议要求服务器和用户双方都有证书.单向认证 SSL 协议不需要客户拥有CA证书,具体的过程相对于上面的步骤,只需将服务器端验证客户证书的过程去掉,以及在协商对称密码方案,对称通话密钥 ...

  6. 什么是SSL双向认证,与单向认证证书有什么区别?

    SSL/TLS 证书是用于用户浏览器和网站服务器之间的数据传输加密,实现互联网传输安全保护,大多数情况下指的是服务器证书.服务器证书是用于向浏览器客户端验证服务器,这种是属于单向认证的SSL证书.但是 ...

  7. netty中实现双向认证的SSL连接

    1. 前期准备工作 双向证书认证的双方称为client和server,首先为client和server生成证书.由于仅仅是自己学习使用,因此可以在本地自建一个CA,然后用CA的证书分别签发client ...

  8. pythonssl双向认证_flas的双向ssl认证

    免责声明 在我开始之前,我会注意到"伊曼纽尔·伊"的评论.如果首先在生产服务器或开发服务器上执行此操作,则需要考虑.例如,如果您使用的是Apache WebServer,那么可以从 ...

  9. Vyos OpenVPN (SSL TLS+User Auth) 本地PAM认证 SSLVPN服务器搭建

    VYOS OpenVPN SSL TLS + User Auth + PAM认证多用户拨入 实现目标 1.安装环境 1.1.证书生成 1.2.用户认证脚本 3.OpenVPN Server配置 3.1 ...

  10. linux 锐捷客户端 脚本,基于802.1x的锐捷linux客户端认证方法(最新)

    校园网的Linux用户大概都有这样的苦恼,如今大多数校园网都必须安装基于802.1X协议的认证软件才可以上网,也许windows操做系统的用户以为安装这样的软件上网,那是一件很简单的事情,可是对于li ...

最新文章

  1. 从库备份中恢复一张表
  2. 好消息,MaxtoCode完全支持2005BETA2版,多谢恩电提供的测试样例
  3. 1.在VS2010中文版中开发WP7程序
  4. java修改默认字符编码_设置默认的Java字符编码?
  5. 作者:​高晨旭(1990-),男,北京系统工程研究所研究实习员。
  6. comparator 字符串比较大小_java – 如何使用Comparator比较空值?
  7. 图片添加图片水印和文字水印
  8. WPF ListView展示层叠信息
  9. 马蜂窝等多家旅游平台针对肺炎疫情推出旅客保障措施
  10. pythonexcel计算横列总和-在python中,如何在字典中找到值的总和?每个键都有多个值...
  11. 移动组件到指定坐标_《我的世界》传送石碑组件 史蒂夫表示跑路的日子终于结束了...
  12. [object%20HTMLInputElement] 是什么意思?
  13. 机器翻译市场需求调研报告
  14. (时间表达式)定时任务Quartz 之 cron表达式及在线生成器
  15. mysql分组求和_mysql 行转列,对列的分组求和,对行求和
  16. PowerDesign license安装问题
  17. 寄生方式分类计算机病毒,计算机病毒寄生方式和感染途径分类
  18. 信息论与编码-python实现三种编码(香农编码,费诺编码,赫夫曼编码)
  19. 二维vector的输入
  20. Kubernetes 1.25 发布!博云带你玩转新特性

热门文章

  1. 当下垂直搜索引擎集锦一
  2. 谭松韵被造谣ee文件与服务器,黄磊何炅心疼谭松韵被造谣!从和张子枫相处看出人品!...
  3. 超低延时的H5直播,电子游戏互动控制直播,桌面远程控制直播方案
  4. 热议:CSS为什么这么难学?一定是你的方法不对
  5. 浅谈后缀自动机SAM
  6. 将苹果手机数据导入苹果手机苹果?如何传输苹果手机数据
  7. 【C++ 程序】 TVJ Complex Calculator (v 2.1) 复数计算器
  8. lmdb.Error: 路径 : ϵͳ�Ҳ���ָ����·����解决办法
  9. IOS开发之——TOM猫(19)
  10. C语言输出三阶魔方阵