Java 访问HTTP,信任所有证书,解决SSL报错问题

发布于:2025-07-02 ⋅ 阅读:(24) ⋅ 点赞:(0)
package com.welab.automation.framework.utils.api;

import com.welab.automation.framework.GlobalVar;
import com.welab.automation.framework.utils.entity.api.SignatureUtil;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

import javax.crypto.Cipher;
import javax.crypto.spec.OAEPParameterSpec;
import javax.crypto.spec.PSource;
import javax.net.ssl.*;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.security.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.security.spec.MGF1ParameterSpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.UUID;

public class CallFicoUtils {
    HashMap<String,String> map = new HashMap<>();
    public static void main(String[] args) {
        CallFicoUtils callFicoUtils = new CallFicoUtils();
        //callFicoUtils.callFico();
//        String token = callFicoUtils.getToken("qatest102", "Aa123456");
//        System.out.println("token: " + token);
//        callFicoUtils.callFico("1351963705725952000");

        callFicoUtils.getJwt("1351963705725952000");
    }

    public String getToken(String user, String password){
        getPublicKey();
        getOffSet();
        return getAccessToken(user, password);
    }


    public String getJwt(String customerId){

        String jwtToken="";
        try {
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                // 信任所有证书
                public boolean isTrusted(X509Certificate[] arg0, String arg1)
                        throws CertificateException {
                    return true;
                }
            }).build();
            // 创建主机名验证器,用于绕过主机名验证
            HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
            // 创建 SSL 连接套接字工厂,将自定义的 SSL 上下文和主机名验证器应用于 HTTPS 连接
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
            // 创建自定义的 CloseableHttpClient 实例,将 SSL 连接套接字工厂应用于 HTTP 客户端
            CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();

            String sitUrl = "https://api-sit3.dev-wlab.net/account-mob/v1/oauth/jwt-token?customerId="+customerId;
            String staUrl = "https://api-sta2.sta-wlab.net/onboarding-pro/jwt/"+customerId;

            HttpGet request = new HttpGet(sitUrl);
            CloseableHttpResponse response = httpClient.execute(request);

            HttpEntity entity = response.getEntity();
            String responseBody = EntityUtils.toString(entity);
            int statusCode = response.getStatusLine().getStatusCode();
            System.out.println("Response Status Code: " + statusCode);
            System.out.println("responseBody: " + responseBody);
            JSONObject jsonObject = new JSONObject(responseBody);
            jwtToken = jsonObject.getJSONObject("data").getString("jwtToken");
            jwtToken="Bearer "+jwtToken;
            System.out.println("jwtToken: " + jwtToken);
            GlobalVar.GLOBAL_VARIABLES.put("jwtToken",jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jwtToken;
    }

    public void callFico(){
        //CLIENT_ID,CLIENT_SECRET Stage和SIT不一样
        GlobalVar.GLOBAL_VARIABLES.put("CLIENT_ID","AHNxFv0FE61r8zfv8kemGwL06LNxS6aM");
        GlobalVar.GLOBAL_VARIABLES.put("CLIENT_SECRET","fA52Bm6NkSGGPFPp");
        GlobalVar.GLOBAL_VARIABLES.put("host","https://mapi.sta-wlab.com");
        SignatureUtil signatureUtil = new SignatureUtil("qatest106","Aa123456");
        signatureUtil.getPublicKeyReq();
        int offset = signatureUtil.getOffset();
        signatureUtil.createSignReq(offset);

    }

    public HttpGet setHeaderForPublicKey(HttpGet request){
        request.setHeader("Authorization","Bearer jQU2z9GpqqlwzuOzP7Y2sQN5rTofqM1j6q7Z2sFTuFGGDbz8npihbc");
        request.setHeader("Threat-Metrix-Session-Id","mock");
        request.setHeader("idx-version","3.2");
        request.setHeader("accept-language","en-US");
        request.setHeader("Accept-Encoding","gzip,deflate,br");
        request.setHeader("Client-Id","AHNxFv0FE61r8zfv8kemGwL06LNxS6aM");
        request.setHeader("Client-Secret","fA52Bm6NkSGGPFPp");
        request.setHeader("Accept","*/*");
        request.setHeader("Content-Type","application/json;charset=utf-8");
        return request;
    }

    public static String md5(String input) {
        try {
//            String md5Hex = DigestUtils.md5Hex(input);
//            return md5Hex;

            // 获取 MD5 摘要算法实例
            MessageDigest md = MessageDigest.getInstance("MD5");

            // 将输入转换为字节数组
            byte[] messageDigest = md.digest(input.getBytes());

            // 将字节数组转换为十六进制字符串
            StringBuilder hexString = new StringBuilder();
            for (byte b : messageDigest) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }

            return hexString.toString();

        } catch (Exception e) {
            // 处理异常
            e.printStackTrace();
            return null;
        }

    }

    public static String createCipherEx(String publicKey, int offset,String TEST_ACCOUNT,String TEST_PASSWORD) {
        try {
            String publicKeyPEM = publicKey
                    .replace("-----BEGIN PUBLIC KEY-----", "")
                    .replaceAll(System.lineSeparator(), "")
                    .replace("-----END PUBLIC KEY-----", "");
            GlobalVar.GLOBAL_VARIABLES.put("publicKeyPEM", publicKeyPEM);
            byte[] pbks = Base64.getMimeDecoder().decode(publicKeyPEM);
            int timestamp = Math.round(System.currentTimeMillis() / 1000);
            //V2 add two param certSign , appVersion
            //certhash
            //ios: 3bd802e58930823bf2b206925c4c69c6
            //Android:  9ecb077a717b2fb8c85bdab1f2a3d8c0
            //appversion 1.8.70.310

            String ios_certHash = "3bd802e58930823bf2b206925c4c69c6";
            String android_certHash = "9ecb077a717b2fb8c85bdab1f2a3d8c0";

            String certSign =md5(ios_certHash+timestamp);
            String appVersion = "1.8.70.310";
            X509EncodedKeySpec encodedKeySpec = new X509EncodedKeySpec(pbks);
            PublicKey newPbk = KeyFactory.getInstance("RSA").generatePublic(encodedKeySpec);
            OAEPParameterSpec oaepParameterSpec = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-256"), PSource.PSpecified.DEFAULT);

            Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding");
            cipher.init(Cipher.ENCRYPT_MODE, newPbk, oaepParameterSpec);

            com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject();
            jsonObject.put("certSign", certSign);
            jsonObject.put("appVersion", appVersion);
            jsonObject.put("username", TEST_ACCOUNT);
            jsonObject.put("authType", "PASSWORD");
            jsonObject.put("authValue", TEST_PASSWORD);

            jsonObject.put("timestamp", offset + timestamp);
            System.out.println("timestamp is" + String.valueOf(timestamp));
            jsonObject.put("salt", UUID.randomUUID().toString());
            System.out.println("jsonObject is " + jsonObject.toJSONString());
            byte[] bytes = cipher.doFinal(jsonObject.toString().getBytes());
            System.out.println("Result: " + Base64.getEncoder().encodeToString(bytes));

            return Base64.getEncoder().encodeToString(bytes);
        } catch (Exception ex) {
            System.out.println("system error from createCipherEx");
        }
        return "";
    }



    public String getPublicKey(){

        String publicKey="";
        CloseableHttpClient httpClient = HttpClients.createDefault();

        try {
            HttpGet request = new HttpGet("https://mapi.sta-wlab.com/v1/internal/public-key");
            request = setHeaderForPublicKey(request);
            CloseableHttpResponse response = httpClient.execute(request);
            try {
                HttpEntity entity = response.getEntity();
                String responseBody = EntityUtils.toString(entity);
                int statusCode = response.getStatusLine().getStatusCode();
                System.out.println("Response Status Code: " + statusCode);
                System.out.println("responseBody: " + responseBody);
                JSONObject jsonObject = new JSONObject(responseBody);
                publicKey = jsonObject.getJSONObject("data").getString("publicKey");
                String version = jsonObject.getJSONObject("data").getString("version");
                System.out.println("publicKey: " + publicKey);
                map.put("version",version);
                map.put("publicKey",publicKey);
            } finally {
                response.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                httpClient.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return publicKey;
    }
    public String getOffSet(){
        System.out.println("Start Get OffSet!!!!!!!!");
        String timeString = String.valueOf(new Date().getTime() / 1000);
        String url="https://mapi.sta-wlab.com/v1/clock-skew?time="+timeString;
        System.out.println(url);
        String offSet="";
        CloseableHttpClient httpClient = HttpClients.createDefault();
        try {
            //"https://mapi.sta-wlab.com/v1/clock-skew?time=1741942656"
            HttpGet request = new HttpGet(url);
            request = setHeaderForPublicKey(request);
            CloseableHttpResponse response = httpClient.execute(request);
            try {
                HttpEntity entity = response.getEntity();
                String responseBody = EntityUtils.toString(entity);
                int statusCode = response.getStatusLine().getStatusCode();
                System.out.println("Response Status Code: " + statusCode);
                System.out.println("responseBody: " + responseBody);
                JSONObject jsonObject = new JSONObject(responseBody);
                offSet += jsonObject.getJSONObject("data").getInt("offset");
                System.out.println("offSet: " + offSet);
                map.put("offSet",offSet);
            } finally {
                response.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                httpClient.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return offSet;
    }

    public HttpPost setHeaderForAccessToken(HttpPost request){
        request.setHeader("Authorization","Bearer jQU2z9GpqqlwzuOzP7Y2sQN5rTofqM1j6q7Z2sFTuFGGDbz8npihbc");
        request.setHeader("Threat-Metrix-Session-Id","mock");
        request.setHeader("idx-version","3.2");
        request.setHeader("accept-language","en-US");
        request.setHeader("Accept-Encoding","gzip,deflate,br");
        request.setHeader("Client-Id","AHNxFv0FE61r8zfv8kemGwL06LNxS6aM");
        request.setHeader("Client-Secret","fA52Bm6NkSGGPFPp");
        request.setHeader("Accept","*/*");
        request.setHeader("x-app-version","1.8.70.310");
        request.setHeader("x-platform","ios");//android
        request.setHeader("Content-Type","application/json;charset=utf-8");
        return request;
    }
    public String getAccessToken(String user, String password){
        int offset = Integer.parseInt(map.get("offSet"));
        String credentials =createCipherEx(map.get("publicKey"), offset,user,password);

        String v = "credentials="+credentials+"&authValue=PASSWORD&version="+map.get("version");

        System.out.println("credentials: "+credentials);
        String json = "{\n" +
                "    \"credentials\": \""+credentials+"\"," +
                "    \"authValue\": \"PASSWORD\"," +
                "    \"version\": \""+map.get("version")+"\"" +
                "}";
        System.out.println("json: " + json);
        String accessToken="";

        CloseableHttpClient httpClient = HttpClients.createDefault();
        try {
            HttpPost request = new HttpPost("https://mapi.sta-wlab.com/v2/oauth/token?authType=PASSWORD");
            request.setEntity(new StringEntity(json));
            request = setHeaderForAccessToken(request);
            CloseableHttpResponse response = httpClient.execute(request);
            try {
                HttpEntity entity = response.getEntity();
                String responseBody = EntityUtils.toString(entity);
                int statusCode = response.getStatusLine().getStatusCode();
                System.out.println("Response Status Code: " + statusCode);
                System.out.println("responseBody: " + responseBody);
                JSONObject jsonObject = new JSONObject(responseBody);
                accessToken = jsonObject.getJSONObject("data").getString("accessToken");
                System.out.println("accessToken: " + accessToken);
                map.put("accessToken",accessToken);
            } finally {
                response.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                httpClient.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return accessToken;
    }

    public String callFico(String customerId){
        String json="{\n" +
                "    \"ciamCustomerId\": \""+customerId+"\"," +
                "    \"isCreateAccount\": true," +
                "    \"ltAmlLastVDate\": \"2022-11-23T21:11:41.841Z\"," +
                "    \"ltAmlNextVDate\": \"2022-11-23T21:11:41.841Z\"," +
                "    \"reviewResult\": \"Approve\"," +
                "    \"riskLevelResult\": \"Low\"," +
                "    \"watchlistHitResult\": \"Y\"" +
                "}";
        System.out.println("json: " + json);

        CloseableHttpClient httpClient = HttpClients.createDefault();
        try {
            HttpPost request = new HttpPost("https://api-sta2.sta-wlab.net/onboarding-pro/v1/onboarding-requests/fico-manual-reviews/callback");
            request.setEntity(new StringEntity(json));
            CloseableHttpResponse response = httpClient.execute(request);
            try {
                HttpEntity entity = response.getEntity();
                String responseBody = EntityUtils.toString(entity);
                int statusCode = response.getStatusLine().getStatusCode();
                System.out.println("Response Status Code: " + statusCode);
                System.out.println("responseBody: " + responseBody);
            } finally {
                response.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                httpClient.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return "";
    }


    public static void getToken(){
        try {

            String custiomerId="1350151013742682112";
            String cmds = String.format("curl -X GET \"https://api-sta2.sta-wlab.net/onboarding-pro/jwt/"+custiomerId+"\" -H \"accept: */*\" -H \"Accept-Language: en-US\"");
            // 执行CMD命令
            System.out.println("Executing python script file now.");
            Process pcs = Runtime.getRuntime().exec(cmds);
            pcs.waitFor();
//            System.out.println(pcs.waitFor());

            // 定义Python脚本的返回值
            String result = null;
            // 获取CMD的返回流
            BufferedInputStream in = new BufferedInputStream(pcs.getInputStream());// 字符流转换字节流
            BufferedReader br = new BufferedReader(new InputStreamReader(in));// 这里也可以输出文本日志
            String lineStr = null;
            while ((lineStr = br.readLine()) != null) {
                System.out.println(lineStr);
                result = lineStr;//Python 代码中print的数据就是返回值
            }
            // 关闭输入流
            br.close();
            in.close();
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到