采用SSL/TLS形式的安全链接,能防止数据传输过程中被截获修改等问题。

SSL算法简短说明:

对称加密算法:DES 3DES AES 客户端和服务端使用同一个密钥对消息进行加密解密。
    非对称加密算法:RSA, 生成公钥和私钥,采用公钥加密,私钥解密。客户端和服务器端各自持有自己的私钥证书,相互信任对方的证书(证书都导入到了对方的私钥仓库)
    速度上,对称加密算法比非对称加密算法要快。

下面使用jdk工具keytool生成服务端和客户端的密钥和证书,采用的是RSA的非对称加密形式。

生成服务器端证书仓库

keytool -genkey -alias serverks -keysize 2048 -validity 365 -keyalg RSA -dname "CN=localhost" -keypass serverpwd -storepass serverpwd -keystore D:/server-keystore.jks

生成服务器端证书(alias与上面生成时指定的要相同)

keytool -export -alias serverks -keystore D:/server-keystore.jks -storepass serverpwd -file D:/server-cert.cer

生成客户端证书仓库

keytool -genkey -alias clientks -keysize 2048 -validity 365 -keyalg RSA -dname "CN=localhost" -keypass clientpwd -storepass clientpwd -keystore D:/client-keystore.jks

生成客户端证书(alias与上面生成时指定的要相同)

keytool -export -alias clientks -keystore D:/client-keystore.jks -storepass clientpwd -file D:/client-cert.cer

上面四个命令就可以生成客户端和服务器端的证书和仓库了。

对于单项认证,客户端验证服务器端,服务器端不做验证情况,只需要将服务器端证书导入到客户端证书仓库。

对于双向认证,除了上面的导入操作外,还需要将客户端证书导入到服务器端证书仓库。

命令如下:

服务器端证书导入客户端证书仓库

keytool -import -trustcacerts -alias servercert2clientks -file D:/server-cert.cer -storepass clientpwd -keystore D:/client-keystore.jks

客户端证书导入到服务器端证书仓库

keytool -import -trustcacerts -alias clientcert2serverks -file D:/client-cert.cer -storepass serverks -keystore D:/server-keystore.jks

上述命令解释:

keytool    //java jdk自带工具

-genkey  //生成key的命令参数

-alias //生成key别名

-keysize // key大小,2048

-validity //有效期,单位天

-keyalg //key的算法,本文采用RSA

-dname //key的信息串,CN=这里是域名,此外还有OU / O / L / S / C=CH 代表拥有者/归属/地区/城市/国家

-keypass // 生成key的密码,

-storepass //存储的密码

-keystore //生成key输出的路径和文件名

-export //导出证书

-import //导入证书

-file //导出的文件

下面是Java中SSLContext的生成过程:

单向SSL认证服务端代码(客户端对服务端证书进行验证,服务器端接受所有证书)

     //获取X509算法的key管理工厂类KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");//获取keystore类型实例,jks类型KeyStore ks = KeyStore.getInstance("JKS");//读取服务器端的证书库InputStream in = ClassLoader.getSystemResourceAsStream("server-keystore.jks");//加载到keystore,第二个参数密码ks.load(in, "serverpwd".toCharArray());in.close();//初始化keymanager通过keystore和密码kmf.init(ks, "serverpwd".toCharArray());//获取sslcontext,SSL/TLSv1.xSSLContext serverContext = SSLContext.getInstance("TLSv1.2");//单项认证,客户端认证服务器,trustmanager为空,就是服务器端信任所有客户端证书serverContext.init(kmf.getKeyManagers(), null, null);

双向认证相比上面,只是让sslcontext的第二个信任证书参数传递不为空即可,代表服务器端新人的证书对象。

     //获取X509算法的key管理工厂类KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");//获取keystore类型实例,jks类型KeyStore ks = KeyStore.getInstance("JKS");//读取服务器端的证书库InputStream in = ClassLoader.getSystemResourceAsStream("server-keystore.jks");//加载到keystore,第二个参数密码ks.load(in, "serverpwd".toCharArray());in.close();//初始化keymanager通过keystore和密码kmf.init(ks, "serverpwd".toCharArray());//获取sslcontext,SSL/TLSv1.xSSLContext serverContext = SSLContext.getInstance("TLSv1.2");//获取x509信任证书工厂,并根据keystore初始化, 服务器端验证客户端证书是否有效TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");tmf.init(ks);//双向认证,此处多trustManagers参数serverContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

对于TrustManager可以自己实现,但是一般很少自己实现,实现方式如下:

     //获取X509算法的key管理工厂类KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");//获取keystore类型实例,jks类型KeyStore ks = KeyStore.getInstance("JKS");//读取服务器端的证书库InputStream in = ClassLoader.getSystemResourceAsStream("server-keystore.jks");//加载到keystore,第二个参数密码ks.load(in, "serverpwd".toCharArray());in.close();//初始化keymanager通过keystore和密码kmf.init(ks, "serverpwd".toCharArray());//获取sslcontext,SSL/TLSv1.xSSLContext serverContext = SSLContext.getInstance("TLSv1.2");//自定义实现证书验证X509TrustManager x509 = new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() {return null;}/*** 服务器端检查*/public void checkServerTrusted(X509Certificate[] chain, String authType)throws java.security.cert.CertificateException {if (chain == null || chain.length == 0) {throw new IllegalArgumentException("X509Certificate chain cannot be null");}if (authType == null || authType.equals("")) {throw new IllegalArgumentException("X509Certificate authType cannot be null");}boolean isSucc = false;Principal p = null;for (X509Certificate x : chain) {p = x.getSubjectDN();//Principal getName 为keytool 中的-dname参数对应的值if (p != null && p.getName().contains("localhost")) {//这里只验证了-dName那个参数是否能识别isSucc = true;return ;}}if (!isSucc) {throw new  java.security.cert.CertificateException("no authorizication");}}/*** 客户端检查*/public void checkClientTrusted(X509Certificate[] chain, String authType)throws java.security.cert.CertificateException {if (chain == null || chain.length == 0) {throw new IllegalArgumentException("X509Certificate chain cannot be null");}if (authType == null || authType.equals("")) {throw new IllegalArgumentException("X509Certificate authType cannot be null");}boolean isSucc = false;Principal p = null;for (X509Certificate x : chain) {p = x.getSubjectDN();if (p != null && p.getName().contains("localhost")) {isSucc = true;return ;}}if (!isSucc) {throw new  java.security.cert.CertificateException("no authorizication");}}};//双向认证,自定义x509验证实现serverContext.init(kmf.getKeyManagers(), new TrustManager[]{x509}, null);

SSL/TLS 单双向认证代码示例相关推荐

  1. 加密之SSL和单双向认证

    文章目录 1 SSL 1.1 SSL了解 1.2 导入证书 1.3 tomcat配置SSL 1.4 具体操作 2 单向认证 2.1 第三方签名 3 双向认证 3.1 引言 3.2 使用openssl脚 ...

  2. DotNetty TLS 开启双向认证加密传输数据

    这里写目录标题 DotNetty TLS 开启双向认证加密传输数据 一.生成PFX证书 二.服务器端 2.1 引用Nuget: 2.2 创建处理请求类 2.3 注册DotNetty监听服务 三.客户端 ...

  3. XSS网站攻击以及Netty单双向认证和设置白名单

    目录 技术分享之Java安全... 1 一. XSS攻击... 1 1.1 简述... 1 1.2 实例... 1 1.2.1 反射型 XSS. 1 1.2.2 存储型XSS. 4 1.2.3 DOM ...

  4. http(S)系列之(三):https单/双向认证区别

    前言 没有梗了,挖槽,不是朕的风格,硬来一个:昨晚做梦妻妾成群,年收入超千万了,可惜被儿子一泡尿滋醒了 参考文献 扯一扯HTTPS单向认证.双向认证.抓包原理.反抓包策略 提醒:参考文献里面涉及到单向 ...

  5. Centos 7 环境下,如何使用 Apache 实现 SSL 虚拟主机 双向认证 的详细教程:

    1. testing ! ... 1 1 原文参考链接: http://showerlee.blog.51cto.com/2047005/1266712 很久没有更新LAMP的相关文档了,刚好最近单位 ...

  6. openssl私有CA证书签发与单双向认证

    什么是CA? CA是数字认证中心的简称.指的是发放.管理.废除数字证书的机构. CA的作用: 检查证书持有者身份的合法性.签发证书(在证书上签字),以防证书被伪造或篡改,以及对证书和密钥进行管理. 建 ...

  7. nginx配置ssl加密(单双向认证、部分https)

    nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番.一开始采用的是全站加密,所有访问http:80的请求强制转换( ...

  8. ssl证书CA双向认证完整实现步骤(附java客户端代码)(好文章!)

    一.基础概念 注:以下概念除专业名词外,均为个人理解,不具备权威性. 1.什么是系统安全管理 置于公网的系统,通常都需要一定的安全管理,据我个人理解,这里的安全管理主要分三个方面: 一是应用内的权限控 ...

  9. java 填充pdf_Java如何创建和填充PDF表单域(代码示例)

    本篇文章给大家带来的内容是关于Java如何创建和填充PDF表单域(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 表单域,可以按用途分为多种不同的类型,常见的有文本框.多行 ...

  10. ssl介绍以及双向认证和单向认证原理 (转)

    证书介绍 SSL安全证书可以自己生成,也可以通过第三方的CA(Certification Authority)认证中心付费申请颁发. SSL安全证书包括: 1.       CA证书,也叫根证书或中间 ...

最新文章

  1. Ubuntu 安装 搜狗输入法
  2. 【赠书】如何掌握好自然语言处理中的预训练语言模型?你需要读这本书
  3. c++primer第五版,p134页第2题自编程序
  4. 关于程序组织和组织技巧的学习
  5. 瑞幸回应申请破产:这是一个让重生之路又进一步的好消息
  6. xshell 无法定位输入点_linux基础知识个人总结
  7. PHP 解决session 死锁
  8. 判断URL的HTTP状态
  9. json中保存数据与解析数据与python中json模块做对应关系
  10. 9-汇编转移指令-offset+jmp+jcc+loop
  11. 下载dns linux命令,linux dns 部署命令(示例代码)
  12. 【WPS表格】从身份证号码提取各种信息,如出生日期、年龄、性别、户籍所在地
  13. C#实现文本语音播放
  14. java计算机毕业设计网上书城网站源码+系统+数据库+lw文档+mybatis+运行部署
  15. 树莓派/Ubuntu联网以及查看本机的IP
  16. Verilog之条件语句、循环语句、块语句与生成语句
  17. 机场部队都在用的无人机干扰设备----- TFN MR09
  18. 国内常用 DNS 汇总
  19. 【护眼阅读】PC端通过主流常用浏览器打开本地WEB页面阅读本地TXT小说
  20. SAP ABAP SD 销售和分销相关数据库表结构关系

热门文章

  1. 使用python的turtle函数绘制滑稽表情
  2. Retina 显示屏的网页图片兼容方案
  3. 网站被黑客攻击怎么办?
  4. Win10怎么查看隐藏的文件和文件夹?
  5. yd什么意思_YD是什么意思
  6. 2020淘宝双十一快速刷金币工具
  7. iOS 音乐播放器demo讲解
  8. aws篇1 aws-cli的使用
  9. Cox模型中的时间依存协变量和时间依存系数(R语言)第一部分
  10. 六、HTML高级标签