变相怪杰 发表于 2015-1-18 11:14:22

JAVA编程:JSSE会见带有未考证证书的HTTPS

没有那个大公司会傻了吧唧用.net开发大型项目,开发了,那等于自己一半的生命线被微软握着呢。而.net不行,限制在window系统,又是捆绑,鄙视微软之!js|会见  摘要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平安套接扩大(JavaSecureSocketExtension,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相干类做了进一步的封装,例子以下所示:

URLreqURL=newURL("https://www.sun.com");//创立URL对象
HttpsURLConnectionhttpsConn=(HttpsURLConnection)reqURL.openConnection();

/*上面这段代码完成向Web页面发送数据,完成与网页的交互会见
httpsConn.setDoOutput(true);
OutputStreamWriterout=newOutputStreamWriter(huc.getOutputStream(),"8859_1");
out.write("……");
out.flush();
out.close();
*/

//获得该毗连的输出流,以读取呼应内容
InputStreamReaderinsr=newInputStreamReader(httpsConn.getInputStream();

//读取服务器的呼应内容并显现
intrespInt=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-filesrc_cer_fileCkeystoredest_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证手札任办理器类的办法将制止手工导出证书的成绩。
<P>  X509证手札任办理器类的完成及使用

  在JSSE中,证手札任办理器类就是完成了接口X509TrustManager的类。我们能够本人完成该接口,让它信托我们指定的证书。

  接口X509TrustManager有下述三个私有的办法必要我们完成:

  ⑴oidcheckClientTrusted(X509Certificate[]chain,StringauthType)
throwsCertificateException

  该办法反省客户真个证书,若不信托该证书则抛出非常。因为我们不必要对客户端举行认证,因而我们只必要实行默许的信托办理器的这个办法。JSSE中,默许的信托办理器类为TrustManager。

  ⑵oidcheckServerTrusted(X509Certificate[]chain,StringauthType)
throwsCertificateException

  该办法反省服务器的证书,若不信托该证书一样抛出非常。经由过程本人完成该办法,可使之信托我们指定的任何证书。在完成该办法时,也能够复杂的不做任那边理,即一个空的函数体,因为不会抛出非常,它就会信托任何证书。

  ⑶X509Certificate[]getAcceptedIssuers()

  前往受信托的X509证书数组。

  本人完成了信托办理器类,怎样利用呢?类HttpsURLConnection仿佛并没有供应办法设相信任办理器。实在,HttpsURLConnection经由过程SSLSocket来创建与HTTPS的平安毗连,SSLSocket对象是由SSLSocketFactory天生的。HttpsURLConnection供应了办法setSSLSocketFactory(SSLSocketFactory)设置它利用的SSLSocketFactory对象。SSLSocketFactory经由过程SSLContext对象来取得,在初始化SSLContext对象时,可指定信托办理器对象。上面用一个图复杂暗示这几个JSSE类的干系:


部分JSSE类的干系图
  假定本人完成的X509TrustManager类的类名为:MyX509TrustManager,上面的代码片段申明了怎样利用MyX509TrustManager:

//创立SSLContext对象,并利用我们指定的信托办理器初始化
TrustManager[]tm={newMyX509TrustManager()};
SSLContextsslContext=SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null,tm,newjava.security.SecureRandom());

//从上述SSLContext对象中失掉SSLSocketFactory对象
SSLSocketFactoryssf=sslContext.getSocketFactory();

//创立HttpsURLConnection对象,并设置其SSLSocketFactory对象
HttpsURLConnectionhttpsConn=(HttpsURLConnection)myURL.openConnection();
httpsConn.setSSLSocketFactory(ssf);
  如许,HttpsURLConnection对象就能够一般毗连HTTPS了,不管其证书是不是经威望机构的考证,只需完成了接口X509TrustManager的类MyX509TrustManager信托该证书。

  小结

  本文次要先容了在HTTPS的证书未经威望机构认证的情形下,会见HTTPS站点的两种办法,一种办法是把该证书导进到Java的TrustStore文件中,另外一种是本人完成并掩盖JSSE缺省的证手札任办理器类。两种办法各有优弱点,第一种办法不会影响JSSE的平安性,但必要手工导进证书;第二种办法固然不必手工导进证书,但必要当心利用,不然会带来一些平安隐患。

唉!都是钱闹的1.Swing和.net开发比较------从市场份额看.net开发主要占据大部分的中小型和中型的的桌面开发,原因是它封装了很多工具

山那边是海 发表于 2015-1-20 18:16:47

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言

谁可相欹 发表于 2015-1-23 18:15:26

让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。

第二个灵魂 发表于 2015-1-24 12:48:33

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

只想知道 发表于 2015-1-25 10:09:53

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

小魔女 发表于 2015-2-5 22:52:59

是一种使网页(Web Page)产生生动活泼画面的语言

冷月葬花魂 发表于 2015-2-9 23:34:20

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

老尸 发表于 2015-2-12 23:07:38

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

海妖 发表于 2015-2-28 06:27:36

Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

莫相离 发表于 2015-3-6 16:51:06

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言

简单生活 发表于 2015-3-12 11:37:19

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

变相怪杰 发表于 2015-3-19 21:29:00

Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
页: [1]
查看完整版本: JAVA编程:JSSE会见带有未考证证书的HTTPS