java实现ssl双向认证

java 建立双向认证 https连接

绝对好用的。直用的这个,GOOD LUCK FOR YOU

public static String httpRequest(String requestUrl, String requestMethod, String outputStr) {

JSONObject jsonObject = null;

StringBuffer buffer = new StringBuffer();

try {

// 创建SSLContext对象,并使用我们指定的信任管理器初始化

TrustManager[] tm = { new MyX509TrustManager() };

SSLContext sslContext = SSLContext.getInstance(“SSL”, “SunJSSE”);

sslContext.init(null, tm, new java.security.SecureRandom());

// 从上述SSLContext对象中得到SSLSocketFactory对象

SSLSocketFactory ssf = sslContext.getSocketFactory();

URL url = new URL(requestUrl);

HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();

httpUrlConn.setSSLSocketFactory(ssf);

httpUrlConn.setDoOutput(true);

httpUrlConn.setDoInput(true);

httpUrlConn.setUseCaches(false);

// 设置请求方式(GET/POST)

httpUrlConn.setRequestMethod(requestMethod);

if (“GET”.equalsIgnoreCase(requestMethod))

httpUrlConn.connect();

// 当有数据需要提交时

if (null != outputStr) {

OutputStream outputStream = httpUrlConn.getOutputStream();

// 注意编码格式,防止中文乱码

outputStream.write(outputStr.getBytes(“UTF-8”));

outputStream.close();

}

// 将返回的输入流转换成字符串

InputStream inputStream = httpUrlConn.getInputStream();

InputStreamReader inputStreamReader = new InputStreamReader(inputStream, “utf-8”);

BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

String str = null;

while ((str = bufferedReader.readLine()) != null) {

buffer.append(str);

}

bufferedReader.close();

inputStreamReader.close();

// 释放资源

inputStream.close();

inputStream = null;

httpUrlConn.disconnect();

System.out.println(“返回的数据:”+buffer.toString());

// jsonObject = JSONObject.fromObject(buffer.toString());

} catch (ConnectException ce) {

log.error(“Weixin server connection timed out.”);

} catch (Exception e) {

log.error(“https request error:{}”, e);

}

return buffer.toString();

}

java实现ssl双向认证

java怎么模拟https双向认证但客户端只有ukey的请求

对于不是优盘的ukey,一般都有驱动程序的。用正确的api就可以不导入直接使用。

java怎么去调用tomcat6配置使用ssl双向认证

客户端的JAVA导入ROOT证书、客户端证书,,,,然后指定使用SSL,就可以

Netty中使用SSL 双向认证(包括证书生成)

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

在windows环境上安装OpenSSL,然后依据OpenSSL目录下的openssl.cnf中[ CA_default ]的配置创建相应的文件夹和文件

serial这个文件中可以初始写入一行记录,包含两个字符01,表示下一个签发的证书采用的序列号是01

接下来生成CA自己的公私钥(public/private key),生成证书签名请求(CSR, Certificate Signing Request)文件并对该请求进行自签名

在openssl的根目录下运行

genrsa —- 同时生成public key和private key

很多人将genrsa解释为只生成private key,这是不对的。可以用下面的命令从文件中解出公钥

注意最后的数字2048表示生成的RSA公私钥的长度

JDK7中对证书检查要求公钥的长度最少为1024位,否则会抛出异常

java.security.cert.CertPathValidatorException: Algorithm constraints check failed

该长度限制是可以配置的,配置文件路径是JAVA_HOME/jre/lib/security/java.security

jdk.certpath.disabledAlgorithms=MD2, RSA keySize 1024

然后用上面生成的公私钥文件创建一个证书签名请求文件

req —- 创建CSR或者证书

-key —- openssl从这个文件中读取private key

careq.pem的内容格式是

最后将该请求文件给CA机构做签名,但我们现在是想在本地建CA,因此自己对该文件进行自签名即可。

其实,上面生成CSR然后做自签名的两个步骤可合并到一步完成

至此,我们已经建立了自己的CA,接下去来分别签发client和server的证书。

以创建client的证书为例。由于jdk自带的keytool工具可以方便的创建key store和公私钥,因此公私钥和csr的创建直接使用keytool

key store和trust store分别对应于ssl握手证书认证中自己的证书和自己所信任的证书列表,二者的文件格式相同,不同之处是key store里面包含ssl握手一方的公私钥和证书,trust store里面包含ssl握手一方所信任的证书,一般没有这些证书所对应的私钥

client证书中我们想添加证书的一项扩展,比如client id,用来区分client的身份,因此需要额外的一份扩展文件client.cnf,内容如下

在导入之前,需要先将CA的证书导入keystore文件

然后导入client自己的证书。注意alias是client,与生产keystore和key pair的必须匹配

keystore文件内容的查看可以使用

或者使用可视化工具KeyStore Explorer查看

由于server的证书也是本地CA签发的,因此client只要信任CA的证书那么自然会信任CA签发出的证书,所以我们只需将CA的证书导入trust store即可

由于clienttruststore.keystore文件尚不存在,此命令首先创建该文件并将CA的证书导入该trust store

由于netty 5现在只有alpha版本,因此保险起见使用4.0.24.final版本的netty。

netty的SSLContext提供了newClientContext来为client创建ssl context,但查看其源码未发现能支持双向认证,即client端的ssl context只接收一个trust store,而不能指定自己的证书以供server端校验。仿照netty example下的securechat的ssl实现但做了修改

首先创建一个能提供client和server的ssl context的工具类,分别加载server和client的key store和trust store里面的证书

io.netty.example.securechat.SecureChatClientInitializer类的构造器接收一个io.netty.handler.ssl.SslContext类型的对象,这个SslContext的对象最终被用来创建SslHandler,而上面factory产生的是javax.net.ssl.SSLContext的对象,因此可以做改动如下

最后添加jvm参数

来查看ssl握手过程控制台的log

具体实现请参考附件源码。

附录:

openssl的配置

对证书签名时,遇到openssl异常failed to update database TXT_DB error

可以有三种方法解决这个问题

方法一:

修改demoCA下 index.txt.attr

unique_subject = yes

改为

unique_subject = no

方法二:

删除demoCA下的index.txt,并再touch下

方法三:

将 common name设置成不同的

有可能是因为签名的csr文件的subject中的一项或几项在该CA之前签发过的证书中已经出现过或者是csr中提供的国家/省份等等的名称与CA自己的不相同,这些限制都可以在openssl.cnf文件中修改

unique_subject=no

[ policy_match ]

countryName = match

organizationName = match

organizationalUnitName = optional

commonName = supplied

emailAddress = optional

SSL+socket 详解-概念

SSL协议采用数字证书及数字签名进行双端实体认证,用非对称加密算法进行密钥协商,用对称加密算法将数据加密后进行传输以保证数据的保密性,并且通过计算数字摘要来验证数据在传输过程中是否被篡改和伪造,从而为敏感数据的传输提供了一种安全保障手段。

SSL协议提供的服务主要有:

1)认证用户和服务器,确保数据发送到正确的客户机和服务器

认证用户和服务器的合法性,使它们能够确信数据将被发送到正确的客户机和服务器上。客户机和服务器都有各自的识别号,这些识别号由公开密钥进行编号,为验证用户是否合法,SSL协议要求在握手交换数据时进行数字认证,以此确保用户的合法性。

2)加密数据以防止数据中途被窃取

SSL协议所采用的加密技术既有对称密钥技术,也有公开密钥技术。在客户机和服务器进行数据交换前,交换SSL初始握手信息,在SSL握手信息中采用了各种加密技术对其进行加密,以保证其机密性和数据的完整性,并且用数字证书进行鉴别,这样就可以防止非法用户进行破译。

3)维护数据的完整性,确保数据在传输过程中不被改变

SSL协议采用Hash函数和机密共享的方法提供信息的完整性服务,建立客户机和服务器之间的安全通道,使所有经过SSL协议处理的业务在传输过程中能全部完整准确无误的到达目的地。

SSL体系结构:

SSL协议位于TCP/IP协议模型的网络层和应用层之间,使用TCP来提供一种可靠的端到端的安全服务,它是客户/服务器应用之间的通信不被攻击抓取,并且始终对服务器进行认证,还可以选择对客户进行认证。SSL体系结构如图1所示。

SSL协议位于TCP/IP协议模型的网络层和应用层之间,使用TCP来提供一种可靠的端到端的安全服务,它是客户/服务器应用之间的通信不被攻击抓取,并且始终对服务器进行认证,还可以选择对客户进行认证。

在SSL通讯中,首先采用非对称加密交换信息,使得服务器获得浏览器端提供的对称加密的密钥,然后利用该密钥进行通讯过程中信息的加密和解密。为了保证消息在传递过程中没有被篡改,可以加密HASH编码来确保信息的完整性。SSL通讯过程,如图2所示。

一般情况下,当客户端是保密信息的传递者时,客户端不需要数字证书验证自己身份的真实性,如电子银行的应用,客户需要将自己的账号和密码发送给银行,因此银行的服务器需要安装数字证书来表明自己身份的有效性。在某些应用中,服务器端也需要对客户端的身份进行验证,这时客户端也需要安装数字证书以保证通讯时服务器可以辨别出客户端的身份,验证过程类似于服务器身份的验证过程。

SSL Socket通信是对Socket通信的拓展。在Socket通信的基础上添加了一层安全性保护,提供了更高的安全性,包括身份验证、数据加密以及完整性验证。

SSL Socket双向认证实现技术: JSSE(Java Security Socket Extension ),它实现了SSL和TSL(传输层安全)协议。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。通过使用JSSE,可以在客户机和服务器之间通过TCP/IP协议安全地传输数据。为了实现消息认证:

密钥和授权证书的生成方法:

使用Java自带的keytool命令,在命令行生成。

1、生成服务器端私钥kserver.keystore文件

keytool -genkey -alias serverkey -validity 1 -keystore kserver.keystore

2、根据私钥,导出服务器端安全证书

keytool -export -alias serverkey -keystore kserver.keystore -file server.crt

3、将服务器端证书,导入到客户端的Trust KeyStore中

keytool -import -alias serverkey -file server.crt -keystore tclient.keystore

4、生成客户端私钥kclient.keystore文件

keytool -genkey -alias clientkey -validity 1 -keystore kclient.keystore

5、根据私钥,导出客户端安全证书

keytool -export -alias clientkey -keystore kclient.keystore -file client.crt

6、将客户端证书,导入到服务器端的Trust KeyStore中

keytool -import -alias clientkey -file client.crt -keystore tserver.keystore

生成的文件分成两组,服务器端保存:kserver.keystore tserver.keystore 客户端保存:kclient.keystore tclient.kyestore。

客户端采用kclient.keystore中的私钥进行数据加密,发送给服务端,服务器端采用tserver.keystore中的client.crt证书对数据解密,如果解密成功,证明消息来自可信的客户端,进行逻辑处理; 服务器端采用kserver.keystore中的私钥进行数据加密,发送给客户端,客户端采用tclient.keystore中的server.crt证书对数据解密,如果解密成功,证明消息来自可信的服务器端,进行逻辑处理。如果解密失败,那么证明消息来源错误。不进行逻辑处理。

SSL Socket双向认证的安全性:

(1)可以确保数据传送到正确的服务器端和客户端。

(2)可以防止消息传递过程中被窃取。

(3)防止消息在传递过程中被修改.。

在系统运行中可能出现以下情况:

(1) 服务器端、客户端都持有正确的密钥和安全证书,此时服务器端和客户端可以进行正常通信。

(2) 客户端的密钥和安全证书不正确,此时服务器端和客户端不可以进行正常通信。

(3) 客户端未持有密钥和安全证书,此时服务器端和客户端也不可以进行正常通信。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月26日 16:38:33
下一篇 2024年3月26日 16:45:48

相关推荐

  • java程序设计教程,java程序设计教程第二版

    Java语言简单程序设计 java语言程序设计就是使用Java语言(是一种可以撰写跨平台应用软件的面向对象的程序设计语言)编写代码,给出解决特定问题程序的过程。 首先,人物类,person ,Teacher类和CollegeStudent类继承之。 它是目前Internet最流行的编程语言之一,具有高度的安全性、可移植性和代码可重用性。Java程序设计由13…

    2024年5月18日
    4000
  • java类别树,java树的分类

    用java怎么构造一个二叉树呢? 在Java中,你可以定义一个类来表示后序线索二叉树,其中包含有头节点、尾节点和当前节点指针。你可以使用递归或迭代方法遍历整棵树,并创建线索,即存储前驱和后继节点的指针。 建立两个类就应该可以了。一个是树的节点,一个是树,这个是我以前编写的宽度优先遍历的树的构建和遍历,希望对你有帮助。 首先我想问为什么要用LinkedList…

    2024年5月18日
    2700
  • 滑动验证码java,滑动验证码平台

    怎么实现滑动拼图验证码功能? 首先随便找一张图片渲染到canvas上,这里#canvas作为画布,#block作为裁剪出来的小滑块。 重置验证码:在每次验证完成后,重置验证码以允许下一次验证。 打开需要验证的网站,找到滑动拼图验证码的位置。点击拼图,拖动到正确的位置。如果拖动到错误的位置,会有提示,需要重新拖动。如果验证成功,会有提示,可以继续操作。滑动拼图…

    2024年5月18日
    3300
  • javabigdecimal序列化,java序列化实现

    请问,java里,如何把BigDecimal类型转成Integer 1、可以使用强制转换来语句来实现数据类型从Long类型转换成Integer或int类型。 2、自动类型转换 自动类型转换,也称隐式类型转换,是指不需要书写代码,由系统自动完成的类型转换。由于实际开发中这样的类型转换很多,所以Java语言在设计时,没有为该操作设计语法,而是由JVM自动完成。 …

    2024年5月18日
    3400
  • java拆箱装箱,java装箱拆箱作用

    java开发工程师必须要学的技术有哪些 1、java工程师需要学习的内容有很多,比如java语法、java界面编程、JavaScript脚本语言等等。 2、JavaEE基础:Java基础语法、面向对象、核心类库、集合、异常、IO、线程、JDK新特性。JavaWeb开发:前端技术、数据库、JAVA数据库操作、软件服务器及服务器相关技术、动态网页JSP、AJAX…

    2024年5月18日
    3100
  • java导入pdf,java导入数学包

    java生成pdf,图片怎么导不进去? 可以用生成PDF报表的Java组件–iText。具体实现方法如下:导入itext-2。1。5。jar跟itextasian-1。5。2。jar两个包到项目里,建立一个pdf文件。一般情况下,iText使用在有以下一个要求的项目中:1。 出现这个问题的原因就是,提问者用的是字符流,实际不确定文件类型的时候,需…

    2024年5月18日
    3400
  • 四则运算java代码,java四则运算实验报告

    简单的java四则运算问题,请大神们指点下。 interceptOperation:对你输入的算式(加减乘除,例如:1*2+2/2)进行运算。传入的a、b参数目测应该为‘*’,‘/’或者+,-。 首先分析一下四则运算表达式的规律就有思路了:四则运算式子都是 “数字 运算符 数字 运算符……”这种形式,也就是两头肯定是数字,运算符两边总是数字。数字可以有多位,…

    2024年5月18日
    3700
  • java图片二进制存到数据库,图片二进制存入数据库

    在java中如何将图片保存到数据库? 1、一般都是这样的,就是在你服务器有一个专门放置图片的文件夹,然后数据库保存的是你服务器图片的路径。需要用的时候就去数据库里面取路径。得到路径以后你想怎么处理图片是你的事情了。 2、另外一种办法是,将图片通过Base64编码后存储到数据库中,数据库中存储图片的base64编码的二进制可以使用TEXT(mysql)类型。 …

    2024年5月18日
    3300
  • java中文社区,forumjava

    请问有哪些电脑论坛好些? 天涯论坛、新浪论坛、猫扑社区、凤凰论坛、搜狐论坛、网易论坛、凯蒂社区、中国网论坛、王大奇论坛。 1978年,美国芝加哥开发了一套基于8080芯片的BBS芝加哥,这是最早的BBS系统。后来随着Mac的出现,开发了基于Mac的公告板。 Coursera(.coursera.org)- Coursera 是在线教育平台,提供数千个或收费的…

    2024年5月18日
    4200
  • laravel调用java服务,laravel use

    amh不支持部署laravel框架么 它由两个主要部分组成:WEB服务器允许从一个原则的JavaScript跟着AJAX的Servlet(小应用程序)来获得,另一方面数据的JavaScript库,可以帮助Web开发人员能够轻松地采取收购优势。数据,以动态地改变网页的内容。 Composer安装完成后,下载最新版Laravel框架,把它解压缩到你服务器上的一个…

    2024年5月18日
    2900

发表回复

登录后才能评论



关注微信