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连接相关推荐

  1. java使用ssl连接mysql

    Connecting Securely Using SSL–官方文档,演示使用 上面文章里 "Setting up Server Authentication" 就是在客户端设置认 ...

  2. MySQL使用ssl连接,java通过ssl连接数据库

    java 通过ssl连接数据库 MySQL使用ssl连接,java通过ssl连接数据库 MySQL驱动与MySQL版本的关系 什么是SSL? MySQL5.7.34 ssl配置文件和参数 MySQL服 ...

  3. mysql cert_Mysql使用SSL连接

    最近项目中用到了SSL连接,记录一下,环境为windows10,Mysql版本为5.6 查看是否支持 SSL 首先在 MySQL 上执行如下命令, 查询是否 MySQL 支持 SSL: mysql&g ...

  4. java nio ssl_java连接MQTT+SSL服务器

    java用ssl加密方式连接mqtt服务器.其它ssl加密的也可以参考,SSLSocketFactory获取部分都是一样的.踩了很多坑,根据生成工具不同(openssl和keytool)以及秘钥文件编 ...

  5. java ssl证书_Java安全教程–创建SSL连接和证书的分步指南

    java ssl证书 在有关应用JEE安全性的系列文章中,我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程. 如我们之前的文章中所述, 安全套接字层(SSL)/ ...

  6. Java安全教程–创建SSL连接和证书的分步指南

    在有关应用JEE安全性的系列文章中,我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程. 如我们之前的文章中所述, 安全套接字层(SSL)/传输层安全性(TLS) ...

  7. Java通过SSL方式连接MongoDB

    环境说明 MongoDB版本 MongoDB 3.4 docker容器 pom.xml <dependency><groupId>org.mongodb</groupId ...

  8. java连接mysql禁用ssl_java - 连接到MySQL数据库时有关SSL连接的警告

    java - 连接到MySQL数据库时有关SSL连接的警告 通过以下两个类,我尝试连接到MySQL数据库. 但是,我总是得到这个错误: Wed Dec 09 22:46:52 CET 2015 WAR ...

  9. mysql ssl 连接配置与Java连接配置全教程

    目录 开篇 开发环境 正文 安装OpenSSL 开启远程连接支持 查看是否支持SSL 创建SSL证书和私钥 创建存放证书和私钥的目录 生成证书和私钥 mysql的SSL开启与证书配置 本地ssl登陆 ...

最新文章

  1. java为什么实现_为什么在java中这样实现了这样的实现?
  2. T-SQL 游标名称的作用域
  3. 用python写一个记账小程序_python实现日常记账本小程序
  4. 托雷基亚vs_奥特曼:上海英雄魂展来袭,托雷基亚和泰迦等身雕塑国内首秀,泽塔CV压轴...
  5. 基于Vue+Vue-Router+Vuex+Element-ui+axios,高仿小米商城,实现的电商项目
  6. python入门之字符串处理_Python基础之字符串操作,格式化。
  7. php oop基础,php面向对象编程(oop)基础
  8. mysql 5.5 外键_MySQL 5.5添加外键失败,错误[HY000] [150]和[HY000] [1005]
  9. ubuntu 双击打不开软件或者创建的快捷方式
  10. 机器人操作系统二 ROS2:设计、架构和野外使用 - 机器翻译
  11. october php,php – 如何调用组件内的组件[OctoberCMS]
  12. android 生物识别_将生物识别提示与cryptoobject一起使用
  13. 如何看待阿里云成立新零售事业部?
  14. 图片数据增强的方法——收藏
  15. php empty 和空字符串区别
  16. 配置Druid数据源监控
  17. FAQ 检索式问答系统学习记录
  18. 矩形波如何傅立叶展开_SolidWorks三维钣金展开放样实例教程
  19. 全球12个典型区域的surface runoff subsrf runoff比较
  20. CMS-CMS框架解析

热门文章

  1. 格式化JSON stringify 的使用
  2. 【系统设计】系统设计基础:速率限制器
  3. html 前端优化上传视频,前端上传组件Plupload使用---上传大视频(分片上传)
  4. Mysql---基础查询进阶、流程控制语句
  5. 信道建模(大尺度、小尺度、莱斯衰落、瑞利衰落、莱斯信道、瑞利信道)
  6. 干货分享--企业微信社群促活的12种方式
  7. request.setattribute详解
  8. 14寸笔记本 2k linux,HUAWEI 华为 MateBook 14 Linux版 14英寸笔记本电脑(i7-8565U、8G、512G、MX250、2K、100%sRGB)...
  9. udp ue4 通讯_UE4 UDP通信
  10. 用python做题——PythonChallenge-1