友善交流技术...

java 带证书的https请求

上一篇 / 下一篇  2016-08-26 16:32:02 / 个人分类:自动化测试

近来需要通过JAVA来实现https请求,普通的忽略证书的https很容易通过,但是带证书的,需要密码的请求,java自带的也可以实现,不过通过网上找的方法一个一个来实,我靠,没有一个能实现的,报了很多的错误如:握手失败的,接收数据失败的。。。。

最后看到一个文章,是通过apache的SSL客户端来实现的,很方便的,今天记录下来,为以后遇到麻烦的朋友们,解决自己的问题。我是捣鼓了2两天啊。


java自己带的SSL不太好使用,建议使用apache的SSL请求客户端

1.下载jar not-yet-commons-ssl-0.3.17.jar 导入项目中 也可以通过pom.xml来实现的

<!-- https://mvnrepository.com/artifact/org.apache.servicemix.bundles/org.apache.servicemix.bundles.not-yet-commons-ssl -->
<dependency>
    <groupId>org.apache.servicemix.bundles</groupId>
    <artifactId>org.apache.servicemix.bundles.not-yet-commons-ssl</artifactId>
    <version>0.3.11_1</version>
</dependency>


2.导入证书:
   
     1. beta-zh-pc3.client.p12 这个是由安装证书的人提供的。(只要这个证书就可以完成的。上面的jssecacerts 可以不要的)
2.jssecacerts ,可以通过InstallCert.java 工具生成的(只要输入url地址就可以的如:openapi.xxxx.com,这是在JAVA自带的工具实现时需要的,可以不要jssecacerts)
 
3.代码的实现如下

 SSLClient client = new SSLClient();
client.addTrustMaterial(TrustMaterial.DEFAULT);
client.addTrustMaterial(new KeyMaterial("d:\\ssl\\beta-xxx.client.p12", "xxxxxx".toCharArray()));
client.setCheckHostname(true); // default setting is "true" for
client.setCheckExpiry(false); // default setting is "true" forclient.setCheckCRL(true); // default setting is "true" for SSLClient
client.setWantClientAuth(true);
// Let's load a client certificate (max: 1 per SSLClient instance).
client.setKeyMaterial(new KeyMaterial("D:\\truststore\\beta-xxx.client.p12", "xxxxxx".toCharArray()));
URL url = new URL(reqUrl);
HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
https.setSSLSocketFactory(client);
/* 发送数据 */
https.setDoOutput(true);
https.setDoInput(true);
https.setRequestMethod("POST"); //
https.setRequestProperty("Accept", contType); //
https.setRequestProperty("Content-Type", contType); //
https.connect();
OutputStreamWriter ut = new OutputStreamWriter(https.getOutputStream(), "UTF-8"); //
out.append(data);
out.flush();
out.close();
/* 接收数据 */
in = new BufferedReader(new InputStreamReader(
https.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line + "\n";
}
int code=https.getResponseCode();
System.out.println(">>>>:Post CODE: "  + code);

TAG: java 证书

 

评分:0

我来说两句

Open Toolbar