成待访问网页的证书文件
3. 向导第一步,欢迎界面,直接单击"Next",
4. 向导第二步,选择导出的文件格式,默认,单击"Next",
5. 向导第三步,输入导出的文件名,输入后,单击"Next",
6. 向导第四步,单击"Finish",完成向导
7. 最后弹出一个对话框,显示导出成功
用 keytool 工具把刚才导出的证书倒入本地 keystore。Keytool 命令在
\bin\下,打开 命令行窗口,并到\lib\security\目录下,运行下面的命令: keytool -import -noprompt -keystore cacerts -storepass changeit -alias yourEntry1 -file your.cer
其中参数 alias 后跟的值是当前证书在 keystore 中的唯一标识符,但是大小写不区分;参数 file 后跟的是刚才通过 IE 导出的证书所在的路径和文件名;如果你想删除刚才导入到 keystore 的证 书,可以用命令: keytool -delete -keystore cacerts -storepass changeit -alias yourEntry1
写程序访问 https 地址。如果想测试是否能连上 https,只需要稍改一下 GetSample 例子,把请求 的目标变成一个 https 地址。
GetMethod getMethod = new GetMethod("https://yourdomain");
运行该程序可能出现的问题: 1. 抛出异常 java.net.SocketException: Algorithm SSL not available。出现这个异常可能是因为 没有加 JSSEProvider,如果用的是 IBM 的 JSSE Provider,在程序中加入这样的一行: if(Security.getProvider("com.ibm.jsse.IBMJSSEProvider") == null) Security.addProvider(new IBMJSSEProvider());
或者也可以打开\lib\security\java.security,在行 security.provider.1=sun.security.provider.Sun security.provide
r.2=com.ibm.crypto.provider.IBMJCE
后面加入 security.provider.3=com.ibm.jsse.IBMJSSEProvider 2. 抛出异常 java.net.SocketException: SSL implementation not available。出现这个异常可能是 你没有把 ibmjsse.jar 拷贝到\lib\ext\目录下。 3. 抛出异常 javax.net.ssl.SSLHandshakeException: unknown certificate。出现这个异常表明你 的 JSSE 应该已经安装正确,但是可能因为你没有把证书导入到当前运行 JRE 的 keystore 中, 请按照前面介绍的步骤来导入你的证书。 方法2,扩展 HttpClient 类实现自动接受证书 因为这种方法自动接收所有证书,因此存在一定的安全问题,所以在使用这种方法前请仔细考虑您的系统 的安全需求。具体的步骤如下:
提供一个自定义的 socket factory(test.MySecureProtocolSocketFactory)。这个自定义的类必 须实现接口 org.apachemons.httpclient.protocol.SecureProtocolSocketFactory, 在实现接口 的类中调用自定义的 X509TrustManager(test.MyX509TrustManager),这两个类可以在随本文带 的附件中得到
创建一个 org.apachemons.httpclient.protocol.Protocol 的实例,指定协议名称和默认的端口 号
Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory (), 443);
注册刚才创建的 https 协议对象
Protocol.registerProtocol("https ", myhttps);
然后按照普通编程方式打开 https 的目标地址,代码请参见 test.NoCertificationHttpsGetSample
处理代理服务器 HttpClient 中使用代理服务器非常简单,调用 HttpClient 中 setProxy 方法就可以,方法的第一个参数是代 理服务器地址,第二个参数是端口号。另外 HttpClient 也支持 SOCKS 代理。
httpClient.getHostConfiguration().setProxy(hostName,port);