JSSE访问带有未验证证书的HTTPS

2016-02-19 18:37 9 1 收藏

下面是个简单易学的JSSE访问带有未验证证书的HTTPS教程,图老师小编详细图解介绍包你轻松学会,喜欢的朋友赶紧get起来吧!

【 tulaoshi.com - 编程语言 】

      摘 要JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以很轻易地编程实现对HTTPS站点的访问。但是,假如该站点的证书未经权威机构的验证,JSSE将拒绝信任该证书从而不能访问HTTPS站点。本文在简要介绍JSSE的基础上提出了两种解决该问题的方法。
  
  引言
  
  过去的十几年,网络上已经积累了大量的Web应用。如今,无论是整合原有的Web应用系统,还是进行新的Web开发,都要求通过编程来访问某些Web页面。传统的方法是使用Socket接口,但现在很多开发平台或工具如.NET、Java或PHP等都提供了简单的Web访问接口,使用这些接口很轻易编程实现与Web应用系统的交互访问,即使要访问那些采用了HTTPS而不是HTTP的Web应用系统。
  
  HTTPS,即安全的超文本传输协议,采用了SSL技术,被广泛使用以保证Web应用系统的安全性。访问Web应用的编程接口大多封装了SSL,使得访问HTTPS和访问HTTP一样简单。但是很多中、小型应用系统或基于局域网、校园网的应用系统所使用的证书并不是由权威的认证机构发行或者被其验证,直接使用这些编程接口将不能访问HTTPS。
  
  本文将在简要介绍JSSE的基础上,具体描述使用JSSE访问HTTPS的方法,主要说明了如何访问带有未经验证证书的HTTPS站点。
  
  JSSE简介
  
  Java安全套接扩展 (Java Secure Socket Extension, JSSE)是实现Internet安全通信的一系列包的集合。它是一个SSL和TLS的纯Java实现,可以透明地提供数据加密、服务器认证、信息完整性等功能,可以使我们像使用普通的套接字一样使用JSSE建立的安全套接字。JSSE是一个开放的标准,不只是Sun公司才能实现一个JSSE,事实上其他公司有自己实现的JSSE。
  
  在深入了解JSSE之前,需要了解一个有关Java安全的概念:客户端的TrustStore文件。客户端的TrustStore文件中保存着被客户端所信任的服务器的证书信息。客户端在进行SSL连接时,JSSE将根据这个文件中的证书决定是否信任服务器端的证书。
  
  JSSE中,有一个信任治理器类负责决定是否信任远端的证书,这个类有如下的处理规则:
  
  ⑴ 果系统属性javax.net.sll.trustStore指定了TrustStore文件,那么信任治理器就去jre安装路径下的lib/security/目录中寻找并使用这个文件来检查证书。
  
  ⑵ 果该系统属性没有指定TrustStore文件,它就会去jre安装路径下寻找默认的TrustStore文件,这个文件的相对路径为:lib/security/jssecacerts。
  
  ⑶ 假如 jssecacerts不存在,但是cacerts存在(它随J2SDK一起发行,含有数量有限的可信任的基本证书),那么这个默认的TrustStore文件就是cacerts。
  
  直接使用类HttpsURLConnection访问Web页面
  
  Java提供了一种非常简洁的方法来访问HTTPS网页,即使用类HttpsURLConnection、URL等。这几个类为支持HTTPS对JSSE相关类做了进一步的封装,例子如下所示:
  
  URL reqURL = new URL("https://www.sun.com" ); //创建URL对象
  HttpsURLConnection httpsConn = (HttpsURLConnection)reqURL.openConnection();
  
  /*下面这段代码实现向Web页面发送数据,实现与网页的交互访问
  httpsConn.setDoOutput(true);
  OutputStreamWriter out = new OutputStreamWriter(hUC.getOutputStream(), "8859_1");
  out.write( "……" );
  out.flush();
  out.close();
  */
  
  //取得该连接的输入流,以读取响应内容
  InputStreamReader insr = new InputStreamReader(httpsConn.getInputStream();
  
  //读取服务器的响应内容并显示
  int respInt = insr.read();
  while( respInt != -1){
   System.out.print((char)respInt);
   respInt = insr.read();
  }

  这段代码能够正常执行,然而把访问的URL改为https://login.bjut.edu.cn时,程序将抛出异常javax.net.ssl.SSLException,这是由于https://login.bjut.edu.cn站点的安全证书不被JSSE所信任。根据JSSE简介中对信任治理器的分析,一种解决这个问题的方法是按照信任治理器的处理规则,把站点的证书放到证书库文件jssecacerts中,或者把证书存放到任一TrustStore文件中,然后设置系统属性javax.net.sll.trustStore指向该文件。另一种解决方法则是自己实现信任治理器类,让它信任我们指定的证书。下面分别介绍这两种方法。
  
  将证书导入到TrustStore文件中
  
  Java提供了命令行工具keytool用于创建证书或者把证书从其它文件中导入到Java自己的TrustStore文件中。把证书从其它文件导入到TrustStore文件中的命令行格式为:
  
  keytool -import -file src_cer_file –keystore dest_cer_store
  
  其中,src_cer_file为存有证书信息的源文件名,dest_cer_store为目标TrustStore文件。
  
  在使用keytool之前,首先要取得源证书文件,这个源文件可使用IE浏览器获得,IE浏览器会把访问过的HTTPS站点的证书保存到本地。从IE浏览器导出证书的方法是打开“Internet 选项”,选择“内容”选项卡,点击“证书…”按钮,在打开的证书对话框中,选中一个证书,然后点击“导出…”按钮,按提示一步步将该证书保存到一文件中。最后就可利用keytool把该证书导入到Java的TrustStore文件中。为了能使Java程序找到该文件,应该把这个文件复制到jre安装路径下的lib/security/目录中。
  
  这样,只需在程序中设置系统属性javax.net.sll.trustStore指向文件dest_cer_store,就能使JSSE信任该证书,从而使程序可以访问使用未经验证的证书的HTTPS站点。
  
  使用这种方法,编程非常简单,但需要手工导出服务器的证书。当服务器证书经常变化时,就需要经常进行手工导出证书的操作。下面介绍的实现X509证书信任治理器类的方法将避免手工导出证书的问题。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)    X509证书信任治理器类的实现及应用
  
  
  在JSSE中,证书信任治理器类就是实现了接口X509TrustManager的类。我们可以自己实现该接口,让它信任我们指定的证书。
  
  接口X509TrustManager有下述三个公有的方法需要我们实现:
  
  ⑴ oid checkClientTrusted(X509Certificate[] chain, String authType)
  throws CertificateException
  
  该方法检查客户端的证书,若不信任该证书则抛出异常。由于我们不需要对客户端进行认证,因此我们只需要执行默认的信任治理器的这个方法。JSSE中,默认的信任治理器类为TrustManager。
  
  ⑵ oid checkServerTrusted(X509Certificate[] chain, String authType)
  throws CertificateException
  
  该方法检查服务器的证书,若不信任该证书同样抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。在实现该方法时,也可以简单的不做任何处理,即一个空的函数体,由于不会抛出异常,它就会信任任何证书。
  
  ⑶ X509Certificate[] getAcceptedIssuers()
  
  返回受信任的X509证书数组。
  
  自己实现了信任治理器类,如何使用呢?类HttpsURLConnection似乎并没有提供方法设置信任治理器。其实,HttpsURLConnection通过SSLSocket来建立与HTTPS的安全连接,SSLSocket对象是由SSLSocketFactory生成的。HttpsURLConnection提供了方法setSSLSocketFactory(SSLSocketFactory)设置它使用的SSLSocketFactory对象。SSLSocketFactory通过SSLContext对象来获得,在初始化SSLContext对象时,可指定信任治理器对象。下面用一个图简单表示这几个JSSE类的关系:
  
  

来源:http://www.tulaoshi.com/n/20160219/1618377.html

延伸阅读
标签: 浏览器
如何避免IE8访问Https网站时弹出提示   使用过IE8浏览器的朋友都知道,访问一些采用Https协议的网站都会弹出是否只查看安全传送的网页内容?此网页包含的内容将不使用安全的HTTPS连接传送,可能危及到整个网页的安全。的对话框,我们只有点击否按钮才能完整显示网页。而且没有不再提示的选择,只要是刷新或者打开新的窗口,又会弹出这...
标签: 电脑入门
什么是HTTPS: HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。 它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。...
itools安装失败验证失败未越狱解决方法   1.更新免费的正版应用程序,如新浪、微博等,需在itools设置内添加你的iTunes账号和密码,验证之后,即可直接用itools更新该程序。 2.更新itools 正版体验的免费应用程序,当该程序有了更新之后,并且itools已经有了该版本号的正版体验版本,即可直接用itools更新该程序。 3.更...
如何解决win7安装FLASH时提示证书验证失败   1、首先打开IE浏览器,然后点击菜单栏上面的工具-Internet选项项; 2、在弹出来的Internet选项窗口中,切换到内容选项卡下,然后在下方证书栏下点击发行者按钮; 3、接着在弹出来的证书界面中,切换到未受信任的发布者标签,然后在里面选择要删除的发行者,选择Adobe Systerms ...
未越狱iPhone访问限制密码忘了怎么办 依次打开设置=》通用=》访问限制 ,在这里设置访问限制密码。如果这个密码之前设置过,但是忘记了怎么办呢,这里给出几个解决方案: 越狱解决方法 如果你的iPhone/iPad已经越狱的话,那么就比较方便了,首先准备好软件:ifunbox/PP助手/iFile 等软件 用数据线将iPhone连接电脑...

经验教程

628

收藏

91
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部