SSL/TLS 单双向认证代码示例
采用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 单双向认证代码示例相关推荐
- 加密之SSL和单双向认证
文章目录 1 SSL 1.1 SSL了解 1.2 导入证书 1.3 tomcat配置SSL 1.4 具体操作 2 单向认证 2.1 第三方签名 3 双向认证 3.1 引言 3.2 使用openssl脚 ...
- DotNetty TLS 开启双向认证加密传输数据
这里写目录标题 DotNetty TLS 开启双向认证加密传输数据 一.生成PFX证书 二.服务器端 2.1 引用Nuget: 2.2 创建处理请求类 2.3 注册DotNetty监听服务 三.客户端 ...
- 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 ...
- http(S)系列之(三):https单/双向认证区别
前言 没有梗了,挖槽,不是朕的风格,硬来一个:昨晚做梦妻妾成群,年收入超千万了,可惜被儿子一泡尿滋醒了 参考文献 扯一扯HTTPS单向认证.双向认证.抓包原理.反抓包策略 提醒:参考文献里面涉及到单向 ...
- Centos 7 环境下,如何使用 Apache 实现 SSL 虚拟主机 双向认证 的详细教程:
1. testing ! ... 1 1 原文参考链接: http://showerlee.blog.51cto.com/2047005/1266712 很久没有更新LAMP的相关文档了,刚好最近单位 ...
- openssl私有CA证书签发与单双向认证
什么是CA? CA是数字认证中心的简称.指的是发放.管理.废除数字证书的机构. CA的作用: 检查证书持有者身份的合法性.签发证书(在证书上签字),以防证书被伪造或篡改,以及对证书和密钥进行管理. 建 ...
- nginx配置ssl加密(单双向认证、部分https)
nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番.一开始采用的是全站加密,所有访问http:80的请求强制转换( ...
- ssl证书CA双向认证完整实现步骤(附java客户端代码)(好文章!)
一.基础概念 注:以下概念除专业名词外,均为个人理解,不具备权威性. 1.什么是系统安全管理 置于公网的系统,通常都需要一定的安全管理,据我个人理解,这里的安全管理主要分三个方面: 一是应用内的权限控 ...
- java 填充pdf_Java如何创建和填充PDF表单域(代码示例)
本篇文章给大家带来的内容是关于Java如何创建和填充PDF表单域(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 表单域,可以按用途分为多种不同的类型,常见的有文本框.多行 ...
- ssl介绍以及双向认证和单向认证原理 (转)
证书介绍 SSL安全证书可以自己生成,也可以通过第三方的CA(Certification Authority)认证中心付费申请颁发. SSL安全证书包括: 1. CA证书,也叫根证书或中间 ...
最新文章
- Ubuntu 安装 搜狗输入法
- 【赠书】如何掌握好自然语言处理中的预训练语言模型?你需要读这本书
- c++primer第五版,p134页第2题自编程序
- 关于程序组织和组织技巧的学习
- 瑞幸回应申请破产:这是一个让重生之路又进一步的好消息
- xshell 无法定位输入点_linux基础知识个人总结
- PHP 解决session 死锁
- 判断URL的HTTP状态
- json中保存数据与解析数据与python中json模块做对应关系
- 9-汇编转移指令-offset+jmp+jcc+loop
- 下载dns linux命令,linux dns 部署命令(示例代码)
- 【WPS表格】从身份证号码提取各种信息,如出生日期、年龄、性别、户籍所在地
- C#实现文本语音播放
- java计算机毕业设计网上书城网站源码+系统+数据库+lw文档+mybatis+运行部署
- 树莓派/Ubuntu联网以及查看本机的IP
- Verilog之条件语句、循环语句、块语句与生成语句
- 机场部队都在用的无人机干扰设备----- TFN MR09
- 国内常用 DNS 汇总
- 【护眼阅读】PC端通过主流常用浏览器打开本地WEB页面阅读本地TXT小说
- SAP ABAP SD 销售和分销相关数据库表结构关系