|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
没有那个大公司会傻了吧唧用.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开发主要占据大部分的中小型和中型的的桌面开发,原因是它封装了很多工具 |
|