Java的SSL连接
Java代码连接SSL服务器时,JVM需要验证服务器时可信任的。否则你会遇到如下的Exception。
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
SUN提供了若干工具来导入证书,可惜都很繁琐。我在网上找到一个牛人写的程序,可以将指定Server:Port的SSL证书自动导入到JVM的信任列表中。但是该程序并不容易理解,因此我将我的研究结果写了出来。在该程序中,生成证书的过程如下:
1. 找到jre/lib/security/cacerts文件,将其load到一个Java.security.KeyStore中。
2. 获取一个SSLContext的实例,它负责生成SSL Socket的工厂;
3. 生成一个TrustManagerFactory的实例,它负责根据“信任材料源”(来自KeyStore中)生成TrustManager。
4. 获取一个TrustManager,此处为X509TrustManager,基于该实例,创建SavingTrustManager
5. 利用SSLContext初始化TrustManager,此时TrustManager就会注册到SSLSocket中;
6. 利用SSLContext获得SSLSocketFactory并创建到目的端口的SSL Socket连接;
7. TrustManager会获得一个X509Certificate的数组;
8. 将其中的一个Certificate加入到KeyStore中去;
9. 保存KeyStore。
KeyStore
这是一个保存Key的类,它负责读写Key文件。这个文件中包含3类的条目:
1. KeyStore.PrivateKeyEntry:这是为了发布一个Entity而使用的,如果你要发布一个Jar,又想别人放心的使用它,就的使用这个entry,当然客户端需要信任你的Certificate才能使用它;
2. KeyStore.SecretKeyEntry:
3. KeyStore.TrustedCertificateEntry:这是和第一种相对应的,如果你要访问一个别人的SSL端口,为了确保你连的是X而不是Y,你需要将X的证书放在这里,而不是将Y的放在这里;
TrustManagerFactory
它首先装在KeyStore,然后它可以用来验证远端的Server是否是可信任的。根据不同的算法,它可以返回不同的TrustManager,它们依赖于不同的算法进行验证。当客户端通过SSL Socket连接到Server时,它会请求TrustManager验证这个远端的Server。这里用到了回调的方法,TrustManager的以下方法会被调用到:
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException
其中输入的X509Certificate数组来自于远端的Server,于是,我们就得到了很重要的东西。
接下来的工作就是将得到的Certificate存成可信任的,也就是作为KeyStore.TrustedCertificateEntry存到KeyStore中。以后当你要访问这个网站的时候,你就不会遇到文章开始时提到的Exception了。
Java的SSL连接相关推荐
- java使用ssl连接mysql
Connecting Securely Using SSL–官方文档,演示使用 上面文章里 "Setting up Server Authentication" 就是在客户端设置认 ...
- MySQL使用ssl连接,java通过ssl连接数据库
java 通过ssl连接数据库 MySQL使用ssl连接,java通过ssl连接数据库 MySQL驱动与MySQL版本的关系 什么是SSL? MySQL5.7.34 ssl配置文件和参数 MySQL服 ...
- mysql cert_Mysql使用SSL连接
最近项目中用到了SSL连接,记录一下,环境为windows10,Mysql版本为5.6 查看是否支持 SSL 首先在 MySQL 上执行如下命令, 查询是否 MySQL 支持 SSL: mysql&g ...
- java nio ssl_java连接MQTT+SSL服务器
java用ssl加密方式连接mqtt服务器.其它ssl加密的也可以参考,SSLSocketFactory获取部分都是一样的.踩了很多坑,根据生成工具不同(openssl和keytool)以及秘钥文件编 ...
- java ssl证书_Java安全教程–创建SSL连接和证书的分步指南
java ssl证书 在有关应用JEE安全性的系列文章中,我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程. 如我们之前的文章中所述, 安全套接字层(SSL)/ ...
- Java安全教程–创建SSL连接和证书的分步指南
在有关应用JEE安全性的系列文章中,我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程. 如我们之前的文章中所述, 安全套接字层(SSL)/传输层安全性(TLS) ...
- Java通过SSL方式连接MongoDB
环境说明 MongoDB版本 MongoDB 3.4 docker容器 pom.xml <dependency><groupId>org.mongodb</groupId ...
- java连接mysql禁用ssl_java - 连接到MySQL数据库时有关SSL连接的警告
java - 连接到MySQL数据库时有关SSL连接的警告 通过以下两个类,我尝试连接到MySQL数据库. 但是,我总是得到这个错误: Wed Dec 09 22:46:52 CET 2015 WAR ...
- mysql ssl 连接配置与Java连接配置全教程
目录 开篇 开发环境 正文 安装OpenSSL 开启远程连接支持 查看是否支持SSL 创建SSL证书和私钥 创建存放证书和私钥的目录 生成证书和私钥 mysql的SSL开启与证书配置 本地ssl登陆 ...
最新文章
- java为什么实现_为什么在java中这样实现了这样的实现?
- T-SQL 游标名称的作用域
- 用python写一个记账小程序_python实现日常记账本小程序
- 托雷基亚vs_奥特曼:上海英雄魂展来袭,托雷基亚和泰迦等身雕塑国内首秀,泽塔CV压轴...
- 基于Vue+Vue-Router+Vuex+Element-ui+axios,高仿小米商城,实现的电商项目
- python入门之字符串处理_Python基础之字符串操作,格式化。
- php oop基础,php面向对象编程(oop)基础
- mysql 5.5 外键_MySQL 5.5添加外键失败,错误[HY000] [150]和[HY000] [1005]
- ubuntu 双击打不开软件或者创建的快捷方式
- 机器人操作系统二 ROS2:设计、架构和野外使用 - 机器翻译
- october php,php – 如何调用组件内的组件[OctoberCMS]
- android 生物识别_将生物识别提示与cryptoobject一起使用
- 如何看待阿里云成立新零售事业部?
- 图片数据增强的方法——收藏
- php empty 和空字符串区别
- 配置Druid数据源监控
- FAQ 检索式问答系统学习记录
- 矩形波如何傅立叶展开_SolidWorks三维钣金展开放样实例教程
- 全球12个典型区域的surface runoff subsrf runoff比较
- CMS-CMS框架解析
热门文章
- 格式化JSON stringify 的使用
- 【系统设计】系统设计基础:速率限制器
- html 前端优化上传视频,前端上传组件Plupload使用---上传大视频(分片上传)
- Mysql---基础查询进阶、流程控制语句
- 信道建模(大尺度、小尺度、莱斯衰落、瑞利衰落、莱斯信道、瑞利信道)
- 干货分享--企业微信社群促活的12种方式
- request.setattribute详解
- 14寸笔记本 2k linux,HUAWEI 华为 MateBook 14 Linux版 14英寸笔记本电脑(i7-8565U、8G、512G、MX250、2K、100%sRGB)...
- udp ue4 通讯_UE4 UDP通信
- 用python做题——PythonChallenge-1