【转载】 http://www.blogjava.net/etlan/archive/2006/06/29/55767.html
摘 要 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证书信任管理器类的方法将避免手工导出证书的问题。
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类的关系:
图1 部分JSSE类的关系图
假设自己实现的X509TrustManager类的类名为:MyX509TrustManager,下面的代码片断说明了如何使用MyX509TrustManager:
//创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = {new MyX509TrustManager ()};
SSLContext sslContext = SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
//从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
//创建HttpsURLConnection对象,并设置其SSLSocketFactory对象
HttpsURLConnection httpsConn = (HttpsURLConnection)myURL.openConnection();
httpsConn.setSSLSocketFactory(ssf);
这样,HttpsURLConnection对象就可以正常连接HTTPS了,无论其证书是否经权威机构的验证,只要实现了接口X509TrustManager的类MyX509TrustManager信任该证书。
小结
本文主要介绍了在HTTPS的证书未经权威机构认证的情况下,访问HTTPS站点的两种方法,一种方法是把该证书导入到Java的TrustStore 文件中,另一种是自己实现并覆盖JSSE缺省的证书信任管理器类。两种方法各有优缺点,第一种方法不会影响JSSE的安全性,但需要手工导入证书;第二种方法虽然不用手工导入证书,但需要小心使用,否则会带来一些安全隐患。
分享到:
相关推荐
在PostMan这样的API测试工具中,导入HTTPS证书是进行安全接口测试的关键步骤。 PostMan是一款强大的API开发、测试和文档管理工具,支持HTTP和HTTPS协议。当你需要测试一个HTTPS接口时,由于HTTPS采用了SSL/TLS协议...
以上就是关于“如何把HTTPS网站中的安全证书导入到Java的cacerts证书库”的主要知识点。通过这个过程,我们可以解决因Java不信任特定证书而引发的连接问题,确保应用程序能够正常访问需要的HTTPS服务。在实际的开发...
Java证书导入工具是一款专为Java开发者设计的实用小软件,主要功能是协助用户方便快捷地导入HTTPS证书。在Java应用程序中,特别是在涉及到网络通信、尤其是使用HTTPS协议进行安全传输时,正确配置和导入证书是非常...
Step 3: 导入 CA 证书 将转换后的 CA 证书追加到 Linux 系统的证书库中: `cat vmwar.pem >> /etc/pki/tls/certs/ca-bundle.crt` 这样,Linux 系统就可以信任该网站的证书颁发机构了,从而解决证书无效的问题。 ...
根据提供的标题、描述、标签及部分内容,我们可以了解到这段代码主要实现了C#环境下通过HTTPS协议进行数据交互,并在必要时自动导入证书的功能。接下来,我们将详细分析这一知识点。 ### C# HTTPS交互与证书处理 #...
导入SSL证书至操作系统,无论是Windows还是Linux,都是为了确保服务器上的Web服务能够安全地进行HTTPS通信。 在Windows系统中,通常使用命令行工具“certutil”来导入SSL证书。`import.bat`文件很可能包含了以下...
本文将详细介绍如何在Jmeter中导入HTTPS接口测试所需的证书。 首先,你需要获取到服务器的SSL证书。这可以通过浏览器完成,例如在Chrome中,打开目标网站,右键点击地址栏的锁形图标,选择“查看证书”,然后导出...
通过正确配置中间人代理和导入证书,我们可以透明地监控和分析HTTPS通信,从而更好地理解网络行为、检测潜在的安全漏洞或进行应用渗透测试。熟练掌握这一技巧,对于任何想要深入研究网络安全的人来说都至关重要。
Websphere Application Server SSL证书导入 Websphere Application Server(以下简称 WAS)作为 SSL 服务器时,需要导入 CA 证书,以确保数据传输的安全性。本文将详细介绍 WAS 作为 SSL 服务器时的 CA 证书导入...
3. 将 CA 的根证书导入到密钥库,以将其标记为可信任的: ``` keytool -import -trustcacerts -keystore xyssl.jks -alias root -file root.cer ``` 4. 最后,导入 CA 签发的服务器证书到密钥库: ``` keytool...
在网络安全中,数字证书是SSL/TLS协议的核心,确保网站的https连接安全。 2. **自签名证书**:自签名证书是个人或组织自己创建并签署的证书,没有经过第三方CA的验证。虽然它们在测试环境中非常有用,但在生产环境...
本篇文章将详细讲解如何使用C#编程语言在IIS服务器上导入并绑定PFX证书,以实现SSL功能。 首先,PFX(Personal Information Exchange)是一种包含私钥和公钥的证书文件格式,常用于存储服务器证书。在IIS中,导入...
导入证书后,系统应该能够正确建立证书链,从而消除“无法建立到信任根颁发机构的证书链”的错误。但是,需要注意的是,不建议随意导入未知来源的证书,因为这可能引入安全风险。只有在确认证书来源可靠的情况下,才...
2. **导入证书**:在应用程序中,我们需要将证书导入到信任的证书存储库,这可能涉及到编程语言提供的API,例如Java的KeyStore类,或者操作系统级别的证书管理工具,如Windows的证书管理器。 3. **设置信任**:编程...
本资源提供的是在Windows环境下使用openssl和keytool这两个工具来生成HTTPS证书的详细教程。下面将详细介绍这两个工具以及如何使用它们生成证书。 1. **openssl** OpenSSL是一款开源的SSL/TLS库,它包含了一系列...
这个过程中,可能会遇到证书不受信任、证书链不完整等问题,此时需要根据实际情况调整信任管理器或导入缺失的中间证书。对于自签名证书,可能还需要在代码中绕过默认的信任检查。 总结来说,Java实现读取证书访问...
根据提供的文件信息,我们可以整理出有关HTTPS证书制作与配置的关键知识点。下面将详细介绍这些知识点,以便更好地理解HTTPS证书的工作原理及其在实际应用中的配置过程。 ### HTTPS证书制作及配置全记录 #### 一、...
**win-acme 网站HTTPS证书免费申请工具** win-acme是一款专为Windows环境设计的免费工具,它使得在IIS(Internet Information Services)服务器上配置HTTPS证书变得轻松快捷。该工具支持ACME(Automatic ...
如果看到列出的证书中包含了你刚才导入的Wosign证书,那么恭喜,证书导入成功。 **注意事项:** - 如果在导入证书时遇到问题,可能是因为系统环境、权限或者证书格式不正确。确保按照正确的步骤操作,并检查是否有...