java中远程连接忽略证书

我在职业生涯中遇到过几次问题,就是我们有时希望允许自签名证书用于开发或测试目的。 Google的快速搜索显示了多年来无数Java开发人员遇到的麻烦。

根据确切的证书问题,您可能会收到类似以下内容之一的错误,尽管我几乎肯定有其他表现形式:

java.security.cert.CertificateException: Untrusted Server Certificate Chainjavax.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

要解决此问题,通常需要修改JDK信任库文件,这可能会很痛苦,而且常常会遇到麻烦。 最重要的是,您团队中的每个开发人员都必须做同样的事情,并且您在每个新环境中都会遇到相同的问题。

幸运的是,有一种方法可以以通用的方式解决问题,而不会给开发人员带来任何负担。 我们将重点介绍普通的HttpURLConnection类型的连接,因为它是最通用的类​​型,仍应帮助您了解其他库的使用方向。 如果您使用的是Apache HttpClient,请参见此处 。

警告:知道您在做什么!

请注意使用此代码的含义:这意味着您完全不关心主机验证,而仅使用SSL来加密通信。 您不是要防止中间人攻击,也不是要确保您已连接到您认为是的主机。 通常可以归结为以下几种有效情况:

  1. 您在锁定的LAN环境中操作。 您不容易受到攻击者拦截的请求(或者,如果存在,则问题更大)。
  2. 您所处的测试或开发环境中,确保通信安全并不重要。

如果这符合您的需求,请继续进行。 否则,也许要三思而后行地想要完成什么。

解决方案:修改信任管理器

既然我们已经放弃了这个免责声明,我们就可以解决当前的实际问题。 Java允许我们控制负责验证HttpsURLConnection的主机和证书的对象。 这可以在全球范围内完成,但是我敢肯定,有经验的人会畏缩于做出如此彻底的改变的想法。 幸运的是,我们还可以根据每个请求进行操作,并且由于很难在网络上找到此类示例,因此我在下面提供了代码。 这种方法很好,因为您无需在全球范围内换掉SSLSocketFactory实现。

随时获取它并在您的项目中使用它。

package com.mycompany.http;import java.net.*;
import javax.net.ssl.*;
import java.security.*;
import java.security.cert.*;public class TrustModifier {private static final TrustingHostnameVerifierTRUSTING_HOSTNAME_VERIFIER = new TrustingHostnameVerifier();private static SSLSocketFactory factory;/** Call this with any HttpURLConnection, and it willmodify the trust settings if it is an HTTPS connection. */public static void relaxHostChecking(HttpURLConnection conn)throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {if (conn instanceof HttpsURLConnection) {HttpsURLConnection httpsConnection = (HttpsURLConnection) conn;SSLSocketFactory factory = prepFactory(httpsConnection);httpsConnection.setSSLSocketFactory(factory);httpsConnection.setHostnameVerifier(TRUSTING_HOSTNAME_VERIFIER);}}static synchronized SSLSocketFactoryprepFactory(HttpsURLConnection httpsConnection)throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {if (factory == null) {SSLContext ctx = SSLContext.getInstance("TLS");ctx.init(null, new TrustManager[]{ new AlwaysTrustManager() }, null);factory = ctx.getSocketFactory();}return factory;}private static final class TrustingHostnameVerifier implements HostnameVerifier {public boolean verify(String hostname, SSLSession session) {return true;}}private static class AlwaysTrustManager implements X509TrustManager {public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { }public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { }public X509Certificate[] getAcceptedIssuers() { return null; }}}

用法

要使用上面的代码,只需在打开流之前调用RelaxHostChecking()方法即可:

URL someUrl = ... // may be HTTPS or HTTP
HttpURLConnection connection = (HttpURLConnection) someUrl.openConnection();
TrustModifier.relaxHostChecking(connection); // here's where the magic happens// Now do your work!
// This connection will now live happily with expired or self-signed certificates
connection.setDoOutput(true);
OutputStream out = connection.getOutputStream();
...

在那里,它是支持自签名证书的本地化方法的完整示例。 这不会影响您的应用程序的其余部分,而其余部分将继续具有严格的托管检查语义。 可以扩展此示例以使用配置设置来确定是否应使用宽松的主机检查,并且如果使用此代码主要是通过自签名证书进行开发的一种方式,我建议您这样做。

参考:在Carfey Software Blog上, 忽略了我们JCG合作伙伴提供的Java自签名证书 。

相关文章 :
  • 使用Spring Security 3.1保护RESTful Web服务
  • 使用Spring Security保护GWT应用程序的安全
  • JBoss 4.2.x Spring 3 JPA Hibernate教程
  • 调试生产服务器– Eclipse和JBoss展示
  • Java EE6 CDI,命名组件和限定符
  • Java教程和Android教程列表

翻译自: https://www.javacodegeeks.com/2011/12/ignoring-self-signed-certificates-in.html

java中远程连接忽略证书

java中远程连接忽略证书_忽略Java中的自签名证书相关推荐

  1. java代码连接oracle数据库连接_在JAVA中连接Oracle数据库(例子)

    * TODO 要更改此生成的文件的模板,请转至 * 窗口 - 首选项 - java - 代码样式 - 代码模板 */ package person.fane.test; import java.sql ...

  2. 忽略Java中的自签名证书

    我在职业生涯中遇到过几次问题,就是我们有时希望允许自签名证书用于开发或测试目的. Google的快速搜索显示了多年来无数Java开发人员遇到的麻烦. 根据确切的证书问题,您可能会收到类似以下内容之一的 ...

  3. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  4. EV代码签名证书是什么?和单位代码签名证书有何不同?

    为什么80%的码农都做不了架构师?>>>    代码签名证书由权威CA机构验证软件开发者身份后签发,让软件开发者可以使用代码签名证书,对其开发的软件代码进行数字签名,用于验证开发者身 ...

  5. 无法在证书存储区中找到清单签名证书的解决办法

    以前的一个项目今天打开忽然提示说"无法在证书存储区中找到清单签名证书",很郁闷,不知道怎么回事.最好在 工程属性里面--签名--为Clickonce清单签名 去掉 .再次生成居然成 ...

  6. httpclient 忽略证书_对接外部接口,又一次证书问题!

    Java技术栈 www.javastack.cn 关注优质文章 作者:funnyZpC 出处:cnblogs.com/funnyzpc/p/10989813.html 最近接一外部接口,接口在本地开发 ...

  7. java生成sm2证书_(转载)Java使用IText实现PDF签章

    前文讲到了如何使用Adobe的PDF工具软件进行电子印章应用.在实际应用中还有一种情形就是需要将电子印章功能集成在我们开发的系统里,这里就要用到一些PDF的二次开发库了.做过相关开发的同学应该知道常用 ...

  8. java se好用吗_利用 Java SE 7 更好地管理资源

    2011 年 5 月发布 作者:Julien Ponge 本文介绍 Java 7 针对自动资源管理问题给出的解决办法,即 Coin 项目中提出的新语言结构 try-with-resources 语句. ...

  9. java使用迭代器删除元素_使用Java从地图中删除元素

    java使用迭代器删除元素 关于从Java中的Map删除元素的非常简短的文章. 我们将专注于删除多个元素,而忽略了您可以使用Map.remove删除单个元素的Map.remove . 以下Map将用于 ...

最新文章

  1. Android TextWatcher监控EditText中的输入内容并限制其输入字符个数
  2. ArcGIS 10.7拆分多部件要素(Multipart Features)至单部件要素的两种方法
  3. Chrome谷歌浏览器私密浏览自动开启功能获批专利
  4. Redis在项目中的使用及性能测试
  5. python3pygame 游戏程序_python3 pygame实现接小球游戏
  6. 尝试搭建Apache+Tomcat负载均衡
  7. ISO50001认证辅导,ISO50001验厂优化所有流程中的能源性能,促进更高效的能源管理
  8. 为什么软件需要数字签名?代码签名证书的作用
  9. 从NASA获取全球气象数据
  10. DVWA教程(一) —— Low级别
  11. Android 投屏集成记录
  12. 基于SSM的微信小程序在线学习系统源码【包调试】
  13. 吴峰光杀进 Linux 内核
  14. mysql reads sql data_mysql – CREATE FUNCTION错误“此函数没有确定,否SQL或READS SQL DATA”...
  15. python彩色蟒蛇绘制代码_Python中用绘图库绘制一条蟒蛇
  16. C++语言程序设计(第4版)郑莉练习
  17. 当前量子计算技术前沿是什么水平?
  18. android手机用多久会卡机,你知道Android手机用久了会卡,而iPhone则不会是为什么吗?...
  19. C++/Python PAT乙级1051 复数乘法 (15分)
  20. swoole - 简介

热门文章

  1. 树层级处理上万条数据优化!
  2. 使用layui弹框实现添加时,当添加成功之后如何进行关闭当前窗口刷新父页面的数据
  3. EL表达式和Jstl常见的用法
  4. Ajax传递json数据
  5. Hibernate基本概念 (2)
  6. 多线程的线程通信(生产消费)
  7. from + size must be less than or equal to: [10000] but was [10550]
  8. 网络——获取Web数
  9. zuul过滤器_Zuul 2 –样本过滤器
  10. java自动生成合同_Java 7和Java 8之间的细微自动关闭合同更改