java使用安全证书进行接口联调
证书导入
使用证书文件生成 .cer后缀的证书
如果对方只给到你 .p12后缀的证书, 没有给到你 .cer后缀的格式的证书,那么你就要使用 .p12后缀的生成 .cer后缀的证书,在这里,我以 xca工具为例
1、点击File,选择New DataBase,新建一个文件夹用来存放生成的cer证书文件(待会要用,所以要记住路径)
2、设置密码
3、点击 import,选择PKCS#12,找到对方提供的 .p12格式的证书文件,需要输入证书的密码,然后点击import all
4、到这里证书就引进过来了
5、选择证书,点击Export,然后选择DER (*.cer),最后点击ok
注意:这里的格式要选择cer格式的,不然等会导入jdk会报错;到这里生成证书完毕。
查看生成的cer文件
将cer格式证书导入的jdk的证书库中
如果对方提供了 .cer格式的证书,那么上面的步骤可以略过,直接从这里开始
jdk版本不同证书库位置会有差异,重要的是在jkd中找到cacerts文件位置,这里我的jdk是1.8版本
找到自己的cacerts路径
比如我的是: D:\JAVA-Software\jdk1.8.0_221\jre\lib\security
如果你是第一次导入证书也没关系
在上述地址栏: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,有改动的请输入自己的密码
成功后会提示成功是否保存,输入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;
}
}
接口可以调通,响应是成功的!!!