java使用安全证书进行接口联调

java使用安全证书进行接口联调

证书导入

使用证书文件生成 .cer后缀的证书

如果对方只给到你 .p12后缀的证书, 没有给到你 .cer后缀的格式的证书,那么你就要使用 .p12后缀的生成 .cer后缀的证书,在这里,我以 xca工具为例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jT6ZmsDY-1597924163711)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200820163742079.png)]

1、点击File,选择New DataBase,新建一个文件夹用来存放生成的cer证书文件(待会要用,所以要记住路径)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i9fH848n-1597924163714)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200820164158305.png)]

2、设置密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-25qYBXWh-1597924163716)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200820164450094.png)]

3、点击 import,选择PKCS#12,找到对方提供的 .p12格式的证书文件,需要输入证书的密码,然后点击import all

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDbKQK0m-1597924163718)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200820164744335.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AgJJGG1Y-1597924163720)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200820165153146.png)]

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JVjyjzVN-1597924163725)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200820165912987.png)]

4、到这里证书就引进过来了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6EDOFwPD-1597924163726)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200820170046873.png)]

5、选择证书,点击Export,然后选择DER (*.cer),最后点击ok

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LfzOsRJL-1597924163727)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200820170332475.png)]

注意:这里的格式要选择cer格式的,不然等会导入jdk会报错;到这里生成证书完毕。

查看生成的cer文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JjLiwpde-1597924163728)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200820171053754.png)]

将cer格式证书导入的jdk的证书库中

如果对方提供了 .cer格式的证书,那么上面的步骤可以略过,直接从这里开始

jdk版本不同证书库位置会有差异,重要的是在jkd中找到cacerts文件位置,这里我的jdk是1.8版本

找到自己的cacerts路径

比如我的是: D:\JAVA-Software\jdk1.8.0_221\jre\lib\security

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yllogBYi-1597924163730)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200820171619282.png)]

如果你是第一次导入证书也没关系

在上述地址栏:D:\JAVA-Software\jdk1.8.0_221\jre\lib\security ,输出cmd,执行如下命令:

# 这里如果没有cacerts文件也这样写,到时候会生成这个文件
keytool -import -file D:\chip\cbip0020_ca.cer -keystore D:\JAVA-Software\jdk1.8.0_221\jre\lib\security\cacerts
# -file : 刚生成的cer证书的全路径
# -keystore : jdk的cacerts证书库文件全路径

输入命令行后会提示要输入jdk证书库密码,默认密码是changeit,有改动的请输入自己的密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4yhf71C4-1597924163731)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200820173455251.png)]

成功后会提示成功是否保存,输入y完成导入;报错的话一般就是证书格式不对或者路径哪里写错了,自行检查

ok,至此,证书已成功导入jdk,那么就下来就行进行代码验证了

接口测试

自己工作中的实例,测试ok

package com.pihao.main;

import org.apache.commons.codec.digest.DigestUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.security.KeyStore;
import java.security.SecureRandom;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;

/*  
 * @author: pihao  
 * @date:  创建时间    2020年8月20日 下午2:09:21   
 */
public class CustomTest2 {
	private final static ObjectMapper mapper = new ObjectMapper();
	
	public static void main(String[] args) throws Exception {
		
		JSONObject body = getObj();
		
        String TEST_URL ="https://xxxxxx/url/p/custom/createorder"; //接口访问地址,https

        KeyStore clientStore = KeyStore.getInstance("PKCS12");
        //这里填写p12格式证书全路径,后面是证书密码
        clientStore.load(new FileInputStream("D:\\chip\\cbip0020.p12"), "IKaFtXqq".toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        //证书密码
        kmf.init(clientStore, "IKaFtXqq".toCharArray());
        KeyManager[] kms = kmf.getKeyManagers();
        KeyStore trustStore = KeyStore.getInstance("JKS");
        //填写自己的jdk证书库全路径,默认密码是changeit,有修改过的填自己的密码
        trustStore.load(new FileInputStream("D:\\JAVA-Software\\jdk1.8.0_221\\jre\\lib\\security\\cacerts"), "changeit".toCharArray());
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(trustStore);
        TrustManager[] tms = tmf.getTrustManagers();
        SSLContext sslContext = null;
        sslContext = SSLContext.getInstance("TLS");
        sslContext.init(kms, tms, new SecureRandom());

        HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

        URL url = new URL(TEST_URL);
        HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
        
        //加密内容
        String content = body + "26e27a4ab1eb4007b1bc1e0d609f2d7e"; 
		System.out.println("加密内容是: "+content);
        String secrate = DigestUtils.sha256Hex(content);
        System.out.println("加密结果是: "+secrate);

        con.setRequestMethod("POST");
        con.setRequestProperty("datadigest", secrate); 	 //签名
        con.setRequestProperty("partnercode", "123456");  //partnercode
        con.setRequestProperty("Content-Type", "application/json;charset=utf-8");
        con.setInstanceFollowRedirects(false);
        con.setDoOutput(true);
        con.setDoInput(true);
        con.connect();


        OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream(), "utf-8");
        out.write(body.toString());
        out.flush();
        out.close();

        System.out.println("接口调用返回: " + con.getResponseMessage());
        InputStream inputStream = con.getInputStream();
        System.out.println(inputStreamToString(inputStream));
        inputStream.close();
        con.disconnect();
	}

	
	

	public static String inputStreamToString(InputStream is) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
		String line = reader.readLine();
		StringBuilder builder = new StringBuilder();
		while (line != null) {
			builder.append(line);
			line = reader.readLine();
		}
		return builder.toString();
	}
	
	
    //设置请求报文
	public static JSONObject getObj(){
		JSONObject json = new JSONObject();
		json.put("orderSource", "1");//订单来源
		json.put("productCode", "11111");// 渠道编码
		json.put("orderId", "TEST202008200002");//订单号
		json.put("mailCode", "");//邮件条码
		json.put("volume", 100.0);//邮件体积(立方厘米)
		json.put("length", 10.0);//长度 (cm)
		json.put("width", 10.0);//宽度 (cm)
		json.put("height", 10.0);//高度 (cm)
		json.put("mailWeight", 500);//邮件总重量 (g)
		json.put("mailValue",100.0);//邮件总价值
		json.put("valueType", "USD");//货币
		json.put("batteryFlag", 0);//是否带电 (1 带电,0 不带电)
		json.put("innerType", "3");// 内件类型(1 礼品,2 文件,3 商品货样,5 其他)
		json.put("remark", "商品描述");
		
		JSONObject senderJson = new JSONObject();//寄送人节点信息
		senderJson.put("name", "zhangsan");// 姓名
		senderJson.put("company", "company");// 姓名
		senderJson.put("postCode", "xxxxxx");//邮编
		senderJson.put("phone", "15083609300");//电话
		senderJson.put("mobile", "15083609200");//移动电话
		senderJson.put("email", "123@qq.com");//邮件
		senderJson.put("idType", "");//
		senderJson.put("idNO", "");//
		senderJson.put("countryCode", "CN");//国家简码
		senderJson.put("province", "sheng xxx");//省
		senderJson.put("city", "city xxx");//城市
		senderJson.put("address", "address xxx");// 详细地址
		senderJson.put("duty", "");// 税则号
		
		json.put("sender", senderJson);
		
		JSONObject receiverJson = new JSONObject();//收件人节点信息
		receiverJson.put("name", "lisi");// 姓名
		receiverJson.put("company", "company");// 姓名
		receiverJson.put("postCode", "338000");//邮编
		receiverJson.put("phone", "15083609301");//电话
		receiverJson.put("mobile", "15083609201");//移动电话
		receiverJson.put("email", "123@qq.com");//邮件
		receiverJson.put("idType", "");//
		receiverJson.put("idNO", "");//
		receiverJson.put("countryCode", "US");//国家简码
		receiverJson.put("province", "abc");//省
		receiverJson.put("city", "xx");//城市
		receiverJson.put("address", "jiujinshan");// 详细地址
		receiverJson.put("duty", "");// 税则号
		
		json.put("receiver", receiverJson);
		
		
		JSONArray cargoArray = new JSONArray();//订单内件节点信息,list
		for (int i = 0; i < 1; i++) {
			JSONObject cargoJson = new JSONObject();
			cargoJson.put("innerName", "防疫口罩");//商品中文名称
			cargoJson.put("innerNameEn", "defended_mask");//商品英文名称
			cargoJson.put("innerQty", 2);//商品数量
			cargoJson.put("innerWeight", 400);//商品重量(g)
			cargoJson.put("innerPrice", 89.9);//报关价格
			cargoJson.put("sku", "111000202004230099");//商品 sku 编号
			cargoJson.put("original", "CN");
			cargoJson.put("customsCode", ""); 
			cargoJson.put("innerIngredient", "");
			
			cargoArray.add(cargoJson);
		}
		json.put("cargo", cargoArray);
		
		return json;
	}
	
}

接口可以调通,响应是成功的!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值