1 主要的坑是连接HTTPS 请求,SSL一定要去掉认证,否则要导入证书
2 使用HTTP调用远程服务接口
3 注意调用参数是否正常,接口路径是否符合,有时候他们的文档过时的URL参数不一致
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.3</version>
</dependency>
下面是 两个类的代码
package com.moan.hoe.common.hsm;
import com.alibaba.fastjson.JSONObject;
import com.squareup.okhttp.*;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
/**
* @author SKY
* @version :HttpUtils,2023/2/11 16:30
*/
@Slf4j
public class SignDate {
/**
* 定义全局默认编码格式
*/
private static final String CHARSET_NAME = "UTF-8";
/**
* 定义全局OkHttpClient对象
*/
private static final OkHttpClient httpClient = new OkHttpClient();
public static String sendPost(String url, String jsonData) throws IOException {
String result = "";
RequestBody body = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), jsonData);
Request req = new Request.Builder().url(url).header("Content-Type", "application/json").
header("accept","*/*").post(body).build();
Response response = httpClient.newCall(req).execute();
if (!response.isSuccessful())
{
throw new IOException("Unexpected code " + response);
}
result = response.body().string();
return result;
}
public static String sendPost(String url, String jsonData, String encoding) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
if("https".equalsIgnoreCase(realUrl.getProtocol())){
SslUtils.ignoreSsl();
}
// 打开和URL之间的连接
URLConnection con = realUrl.openConnection();
HttpURLConnection conn = (HttpURLConnection) con;
// 设置通用的请求属性
conn.setRequestMethod("POST");
conn.setConnectTimeout(5 * 1000);
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Content-Type", "application/json");
//conn.setRequestProperty("authorization", authorization);
//conn.setRequestProperty("postman-token", postmanToken);
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), encoding));
// 发送请求参数
// out.print(param);
out.write(jsonData);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
byte[] bresult = result.getBytes();
result = new String(bresult, encoding);
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输出流、输入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
}
catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
//测试
public static void main(String[] args) throws Exception {
//签名
String url = "https://60.194.156.85:15009/api/svs/bss/signMessageDetach";
JSONObject sendData = new JSONObject();
sendData.put("b64OriginData","5oiR6KaB5rWL6K+V562+5ZCNMTIzNDU2Nzg=");
sendData.put("certAlias","sm2");
String returnSign = sendPost(url,sendData.toString(),"utf-8");
log.info(returnSign);
//验签
String url2 = "https://60.194.156.85:15009/api/svs/bss/verifySignedMessageDetach";
JSONObject veryData = new JSONObject();
veryData.put("b64OriginData","5oiR6KaB5rWL6K+V562+5ZCNMTIzNDU2Nzg=");
veryData.put("certAlias","sm2");
veryData.put("b64SignedMessage","MIIClAYKKoEcz1UGAQQCAqCCAoQwggKAAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIIBxjCCAcIwggFloAMCAQICDHssAAAAAAAAAAAAVDAMBggqgRzPVQGDdQUAMBsxCzAJBgNVBAYTAkNOMQwwCgYDVQQDDANTTTIwHhcNMjIwMTA5MTYwMDAwWhcNMzIwMTA4MTU1OTU5WjAeMQswCQYDVQQGEwJDTjEPMA0GA1UEAwwGbmp0ZXN0MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE4uyu1MKTYteVBTVx4UpwSe1lCc30d3CphX/61hg1s1fTL2g2HFKzW8A6yBxiWYGwGDb4uGDB1sHfWerSPTEeOKOBiTCBhjARBglghkgBhvhCAQEEBAMCAEAwCwYDVR0PBAQDAgDAMAwGA1UdEwQFMAMBAQAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAU9lMDFNMKwQO9ZT6Sm20uXsBh14QwHQYDVR0OBBYEFHbUb/qhZVbdR2o8kPgHb8GNFBiLMAwGCCqBHM9VAYN1BQADSQAwRgIhAOYdv35hql+GfLDVAFakQSCCYsg273/wF53u+QBP0N0zAiEAxBj6dZxGZRoN9wsKtW5Xgi24tqNFDrvQmdCLKAVWJO4xgZIwgY8CAQEwKzAbMQswCQYDVQQGEwJDTjEMMAoGA1UEAwwDU00yAgx7LAAAAAAAAAAAAFQwDAYIKoEcz1UBgxEFADANBgkqgRzPVQGCLQEFAARAt6FpSXPeJ4jugsbA9kEMpObci0u8Wxnzw97pPT8kH3oK3fvTacJDWPBb4fXvUJbxezFzoDQQZPIHYQFC3HGuEg==");
veryData.put("b64Cert","sm2");
String signVery = sendPost(url2,veryData.toString(),"utf-8");
log.info(signVery);
}
}
SSL工具类,去掉SLL认证
package com.moan.hoe.common.hsm;
import javax.net.ssl.*;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;
import java.security.cert.CertificateException;
/**
* @author SKY
* @version :SslUtils,2023/2/11 17:53
*/
public class SslUtils {
private static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new miTM();
trustAllCerts[0] = tm;
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
static class miTM implements TrustManager,X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
}
public void checkServerTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
}
/**
* 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
* @throws Exception
*/
public static void ignoreSsl() throws Exception{
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
return true;
}
};
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
}