格尔接口签名和验签

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);
    }

}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值