From 6b6831bad531485fe26c1cbc3caacb662e9daa64 Mon Sep 17 00:00:00 2001 From: fkf <1475794025@qq.com> Date: Tue, 4 Jul 2023 10:29:32 +0800 Subject: [PATCH] 7-4 --- yxt-supervise-gf-api/pom.xml | 8 + .../yxt/supervise/gf/api/utils/RSAUtils.java | 308 ++++++++++++++++++ .../yxt/supervise/gf/api/utils/RsaUtil.java | 170 ++++++++++ .../gf/api/utils/ThirdPartyApiClient.java | 44 +++ yxt-supervise-gf-biz/pom.xml | 2 +- .../gf/YxtSuperviseGfApplication.java | 2 +- .../com/yxt/supervise/gf/biz/test/Test.java | 125 +++++++ 7 files changed, 657 insertions(+), 2 deletions(-) create mode 100644 yxt-supervise-gf-api/src/main/java/com/yxt/supervise/gf/api/utils/RSAUtils.java create mode 100644 yxt-supervise-gf-api/src/main/java/com/yxt/supervise/gf/api/utils/RsaUtil.java create mode 100644 yxt-supervise-gf-api/src/main/java/com/yxt/supervise/gf/api/utils/ThirdPartyApiClient.java create mode 100644 yxt-supervise-gf-biz/src/main/java/com/yxt/supervise/gf/biz/test/Test.java diff --git a/yxt-supervise-gf-api/pom.xml b/yxt-supervise-gf-api/pom.xml index 7b02084..5048814 100644 --- a/yxt-supervise-gf-api/pom.xml +++ b/yxt-supervise-gf-api/pom.xml @@ -26,6 +26,14 @@ 1.18.24 true + + commons-codec + commons-codec + + + cn.hutool + hutool-all + diff --git a/yxt-supervise-gf-api/src/main/java/com/yxt/supervise/gf/api/utils/RSAUtils.java b/yxt-supervise-gf-api/src/main/java/com/yxt/supervise/gf/api/utils/RSAUtils.java new file mode 100644 index 0000000..d05ac28 --- /dev/null +++ b/yxt-supervise-gf-api/src/main/java/com/yxt/supervise/gf/api/utils/RSAUtils.java @@ -0,0 +1,308 @@ +package com.yxt.supervise.gf.api.utils; + +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import javax.crypto.Cipher; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.Map; + +/** + * @author feikefei + * @create 2023-06-30-14:53 + */ +public class RSAUtils { + /** + * 指定加密算法为RSA + */ + private static final String ALGORITHM = "RSA"; + /** + * 加密填充方式 + */ + public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";//加密填充方式 + /** + * 密钥长度,用来初始化 + */ + private static final int KEYSIZE = 1024; + /** + * 公钥 + */ + private static Key publicKey = null; + /** + * 私钥 + */ + private static Key privateKey = null; + /** + * 公钥字符串 + */ + private static String publicKeyString =""; + /** + * 私钥字符串 + */ + private static String privateKeyString =""; + /** + * RSA最大加密明文大小 + */ + private static final int MAX_ENCRYPT_BLOCK = 117; + /** + * RSA最大解密密文大小 + */ + private static final int MAX_DECRYPT_BLOCK = 128; + + /** + * 生成密钥对 + * + * @throws Exception + */ + public static Map generateKeyPair() throws Exception { + +// // /** RSA算法要求有一个可信任的随机数源 */ + SecureRandom secureRandom = new SecureRandom(); + /** 为RSA算法创建一个KeyPairGenerator对象 */ + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM); + /** 利用上面的随机数据源初始化这个KeyPairGenerator对象 */ + keyPairGenerator.initialize(KEYSIZE, secureRandom); +// /** 生成密匙对 */ + KeyPair keyPair = keyPairGenerator.generateKeyPair(); + Map keyMap = new HashMap(); +// /** 得到公钥 */ + BASE64Encoder encoder = new BASE64Encoder(); + + keyMap.put("public", new String(encoder.encode(keyPair.getPublic().getEncoded()).getBytes(), "UTF-8")); + keyMap.put("private", new String(encoder.encode(keyPair.getPrivate().getEncoded()).getBytes(), "UTF-8")); + return keyMap; + } + + /** + * 生成公钥对象 + * + * @param publicKeyStr + * @throws Exception + */ + public static Key setPublicKey(String publicKeyStr) throws Exception { + return RSAUtils.publicKey = generatePublicKey(publicKeyStr); + } + + /** + * 生成私钥对象 + * + * @param privateKeyStr + * @throws Exception + */ + public static void setPrivateKey(String privateKeyStr) throws Exception { + RSAUtils.privateKey = generatePrivateKey(privateKeyStr); + } + + /** + * 私钥加密方法 + * + * @param privatekey + * @return + * @throws Exception + */ + public static String encryptByPrivateKey(String source, String privatekey) throws Exception { + generatePrivateKey(privatekey); + /** 得到Cipher对象来实现对源数据的RSA加密 */ + Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + byte[] data = source.getBytes(); + /** 执行数据分组加密操作 */ + int inputLen = data.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offSet = 0; + byte[] cache; + int i = 0; + // 对数据分段加密 + while (inputLen - offSet > 0) { + if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { + cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); + } else { + cache = cipher.doFinal(data, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_ENCRYPT_BLOCK; + } + byte[] encryptedData = out.toByteArray(); + out.close(); + BASE64Encoder encoder = new BASE64Encoder(); + return encoder.encode(encryptedData); + } + + /** + * 使用公钥解密算法 + * + * @param cryptoSrc 密文 + * @return + * @throws Exception + */ + public static String decryptByPublicKey(String cryptoSrc, String publicStr) throws Exception { + setPublicKey(publicStr); + /** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */ + Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING); + cipher.init(Cipher.DECRYPT_MODE, publicKey); + BASE64Decoder decoder = new BASE64Decoder(); + byte[] encryptedData = decoder.decodeBuffer(cryptoSrc); + /** 执行解密操作 */ + + int inputLen = encryptedData.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offSet = 0; + byte[] cache; + int i = 0; + // 对数据分段解密 + while (inputLen - offSet > 0) { + if (inputLen - offSet > MAX_DECRYPT_BLOCK) { + cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); + } else { + cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_DECRYPT_BLOCK; + } + byte[] decryptedData = out.toByteArray(); + out.close(); + + return new String(decryptedData); + } + + + /** + * 公钥加密方法 + * + * @param pubString + * @return + * @throws Exception + */ + public static String encryptByPublicKey(String source, String pubString) throws Exception { + Key key = setPublicKey(pubString); + /** 得到Cipher对象来实现对源数据的RSA加密 */ + Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING); + cipher.init(Cipher.ENCRYPT_MODE, key); + byte[] data = source.getBytes(); + /** 执行分组加密操作 */ + int inputLen = data.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offSet = 0; + byte[] cache; + int i = 0; + // 对数据分段加密 + while (inputLen - offSet > 0) { + if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { + cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); + } else { + cache = cipher.doFinal(data, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_ENCRYPT_BLOCK; + } + byte[] encryptedData = out.toByteArray(); + out.close(); + + BASE64Encoder encoder = new BASE64Encoder(); + return encoder.encode(encryptedData); + } + + + /** + * 私钥解密算法 + * + * @param cryptoSrc 密文 + * @return + * @throws Exception + */ + public static String decryptByPrivateKey(String cryptoSrc, String privatekey) throws Exception { + //生成私钥对象 + setPrivateKey(privatekey); + /** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */ + Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + BASE64Decoder decoder = new BASE64Decoder(); + byte[] encryptedData = decoder.decodeBuffer(cryptoSrc); + + /** 执行解密操作 */ + int inputLen = encryptedData.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offSet = 0; + byte[] cache; + int i = 0; + // 对数据分段解密 + while (inputLen - offSet > 0) { + if (inputLen - offSet > MAX_DECRYPT_BLOCK) { + cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); + } else { + cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_DECRYPT_BLOCK; + } + byte[] decryptedData = out.toByteArray(); + out.close(); + return new String(decryptedData); + } + + /** + * 将给定的公钥字符串转换为公钥对象 + * + * @param publicKeyStr + * @return + * @throws Exception + */ + private static Key generatePublicKey(String publicKeyStr) throws Exception { + publicKeyString = publicKeyStr; + try { + BASE64Decoder base64Decoder = new BASE64Decoder(); + byte[] buffer = base64Decoder.decodeBuffer(publicKeyStr); + KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM); + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer); + publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec); + return publicKey; + } catch (NoSuchAlgorithmException e) { + throw new Exception("无此算法"); + } catch (InvalidKeySpecException e) { + throw new Exception("公钥非法"); + } catch (IOException e) { + throw new Exception("公钥数据内容读取错误"); + } catch (NullPointerException e) { + throw new Exception("公钥数据为空"); + } + } + + /** + * 将给定的私钥字符串转换为私钥对象 + * + * @param privateKeyStr + * @return + * @throws Exception + */ + private static Key generatePrivateKey(String privateKeyStr) throws Exception { + privateKeyString = privateKeyStr; + try { + BASE64Decoder base64Decoder = new BASE64Decoder(); + byte[] buffer = base64Decoder.decodeBuffer(privateKeyStr); + KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer); + privateKey = (RSAPrivateKey) keyFactory.generatePrivate(keySpec); + return privateKey; + } catch (NoSuchAlgorithmException e) { + throw new Exception("无此算法"); + } catch (InvalidKeySpecException e) { + throw new Exception("私钥非法"); + } catch (IOException e) { + throw new Exception("私钥数据内容读取错误"); + } catch (NullPointerException e) { + throw new Exception("私钥数据为空"); + } + } +} diff --git a/yxt-supervise-gf-api/src/main/java/com/yxt/supervise/gf/api/utils/RsaUtil.java b/yxt-supervise-gf-api/src/main/java/com/yxt/supervise/gf/api/utils/RsaUtil.java new file mode 100644 index 0000000..b871c8c --- /dev/null +++ b/yxt-supervise-gf-api/src/main/java/com/yxt/supervise/gf/api/utils/RsaUtil.java @@ -0,0 +1,170 @@ +package com.yxt.supervise.gf.api.utils; + + + +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.asymmetric.RSA; +import org.apache.commons.codec.digest.DigestUtils; +import sun.misc.BASE64Encoder; + +import javax.crypto.Cipher; +import javax.crypto.NoSuchPaddingException; +import java.io.ByteArrayOutputStream; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + +/** + * @author feikefei + * @create 2023-06-30-8:49 + */ +public class RsaUtil { + /** + * 指定加密算法 + */ + private static final String KEY_ALGORITHM = "RSA"; + + /** + * 指定生成多少位的密钥 + */ + private static final int KEY_BIT = 1024; + + /** *//** + * RSA最大加密明文大小 + */ + private static final int MAX_ENCRYPT_BLOCK = 117; + + public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding"; + + /** *//** + * RSA最大解密密文大小 + * 1024位密钥的要设置为128, + * 248位密钥的要改成256,不然会报错 + */ + private static final int MAX_DECRYPT_BLOCK = 128; + + /** + * 生成密钥对 + * @return + * @throws Exception + */ + public static Map genKeyPair() throws Exception { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM); + keyPairGenerator.initialize(KEY_BIT); + KeyPair keyPair = keyPairGenerator.generateKeyPair(); + RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();//生成公钥 + RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();//生成密钥 + Map map = new HashMap<>(2); + map.put("publicKey",rsaPublicKey); + map.put("privateKey",rsaPrivateKey); + return map; + } + + /** + * 获取公钥 + * @param map + * @return + */ + public static String getPublicKey(Map map){ + Key key = (Key) map.get("publicKey"); + String publicKey = Base64.getEncoder().encodeToString(key.getEncoded()); + return publicKey; + } + + /** + * 获取私钥 + * @param map + * @return + */ + public static String getPrivate(Map map){ + Key key = (Key) map.get("privateKey"); + String privateKey = Base64.getEncoder().encodeToString(key.getEncoded()); + return privateKey; + } + + /** + * 公钥分段加密 --》公钥加密 + * @param data + * @param publicKey + * @return + * @throws Exception + */ + public static String encrypt(String data, String publicKey) throws Exception { + byte[] bytes = Base64.getDecoder().decode(publicKey);//先把公钥进行解码 + X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(bytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PublicKey publicK = keyFactory.generatePublic(x509EncodedKeySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, publicK); + int inputLen = data.getBytes("UTF-8").length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offset = 0; + byte[] cache; + int i = 0; + // 对数据分段加密 + while (inputLen - offset > 0) { + if (inputLen - offset > MAX_ENCRYPT_BLOCK) { + cache = cipher.doFinal(data.getBytes("UTF-8"), offset, MAX_ENCRYPT_BLOCK); + } else { + cache = cipher.doFinal(data.getBytes("UTF-8"), offset, inputLen - offset); + } + out.write(cache, 0, cache.length); + i++; + offset = i * MAX_ENCRYPT_BLOCK; + } + byte[] encryptedData = out.toByteArray(); + out.close(); + // 获取加密内容使用base64进行编码,并以UTF-8为标准转化成字符串 + // 加密后的字符串 + return Base64.getEncoder().encodeToString(encryptedData); + } + + /** + * 私钥分段解密 --》私钥解密 + * @param data + * @param privateKey + * @return + * @throws Exception + */ + public static String decrypt(String data, String privateKey) throws Exception { + byte[] bytes = Base64.getDecoder().decode(privateKey);//先对私钥进行解码 + PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(bytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PrivateKey privateK = keyFactory.generatePrivate(pkcs8EncodedKeySpec); + + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, privateK); + byte[] dataBytes = Base64.getDecoder().decode(data);//对要解密的数据进行解码 + int inputLen = dataBytes.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offset = 0; + byte[] cache; + int i = 0; + // 对数据分段解密 + while (inputLen - offset > 0) { + if (inputLen - offset > MAX_DECRYPT_BLOCK) { + cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK); + } else { + cache = cipher.doFinal(dataBytes, offset, inputLen - offset); + } + out.write(cache, 0, cache.length); + i++; + offset = i * MAX_DECRYPT_BLOCK; + } + byte[] decryptedData = out.toByteArray(); + out.close(); + // 解密后的内容 + return new String(decryptedData, "UTF-8"); + } + + public static String[] RandomAuthentHeader() { + String timeSpan = String.valueOf(System.currentTimeMillis() / 100); + String[] authentHeaders = new String[] { "sJI8PuGweKztQ6nLgp3dqcwljdKGFjPBD3XyUqCFsVG8rYhAIbD2AkNIKaefbjOB" + timeSpan + SecureUtil.md5("sJI8PuGweKztQ6nLgp3dqcwljdKGFjPBD3XyUqCFsVG8rYhAIbD2AkNIKaefbjOB"), timeSpan }; + return authentHeaders; + } +} diff --git a/yxt-supervise-gf-api/src/main/java/com/yxt/supervise/gf/api/utils/ThirdPartyApiClient.java b/yxt-supervise-gf-api/src/main/java/com/yxt/supervise/gf/api/utils/ThirdPartyApiClient.java new file mode 100644 index 0000000..d6c9583 --- /dev/null +++ b/yxt-supervise-gf-api/src/main/java/com/yxt/supervise/gf/api/utils/ThirdPartyApiClient.java @@ -0,0 +1,44 @@ +package com.yxt.supervise.gf.api.utils; + +import javax.crypto.Cipher; +import java.nio.charset.StandardCharsets; +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.spec.X509EncodedKeySpec; +import java.util.Base64; + +/** + * @author feikefei + * @create 2023-06-30-15:54 + */ +public class ThirdPartyApiClient { + private static final String PUBLIC_KEY_STRING ="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Z/+Bslu203UtutmzMW/FqS9bQvaMXQHgvU+ilNR5Hm2IZZalBWPoSbCGzlCUA19C3X6T17X09OMa6aDPKBmF6yXvUI7E/nWM9qUJ5hj4zVO/9GoH03WUyCWSBQg4f+LcnLS75v8nI6moOJ5ILkHmg2KNbEdx55UWjSqBatEopnLWtMFDGZswEbKBH3e2yalK6ddh2kUrtcuQGqFYm/uViAOV+KoptwY2MCNSRLKYE4pCA2BCit7nr3EqNZRqqhKaOE44iyv45zCFrllx3nnwF3X/l+rR4G7Vc7HZwiqKF3RXl9PqmTLJkzhdpAdQX/Kr3SRRHsv/DzKjAZr/2jKrQIDAQAB"; + public static String jiami(String data){ + try { + // 解码RSA公钥字符串为字节数组 + byte[] publicKeyBytes = Base64.getDecoder().decode(PUBLIC_KEY_STRING); + // 根据字节数组创建RSA公钥对象 + X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKeyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PublicKey publicKey = keyFactory.generatePublic(spec); + // 使用公钥对象对数据进行加密 + String encryptedData = encryptWithRSA(data, publicKey); + return encryptedData; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private static String encryptWithRSA(String data, PublicKey publicKey) { + try { + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] encryptedBytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); + return Base64.getEncoder().encodeToString(encryptedBytes); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/yxt-supervise-gf-biz/pom.xml b/yxt-supervise-gf-biz/pom.xml index beb0b19..38a66c1 100644 --- a/yxt-supervise-gf-biz/pom.xml +++ b/yxt-supervise-gf-biz/pom.xml @@ -17,7 +17,7 @@ - com.yxt.supervise.monitor + com.yxt.supervise.gf yxt-supervise-gf-api 0.0.1-SNAPSHOT diff --git a/yxt-supervise-gf-biz/src/main/java/com/yxt/supervise/gf/YxtSuperviseGfApplication.java b/yxt-supervise-gf-biz/src/main/java/com/yxt/supervise/gf/YxtSuperviseGfApplication.java index 9addaf1..b0cf5e5 100644 --- a/yxt-supervise-gf-biz/src/main/java/com/yxt/supervise/gf/YxtSuperviseGfApplication.java +++ b/yxt-supervise-gf-biz/src/main/java/com/yxt/supervise/gf/YxtSuperviseGfApplication.java @@ -1,4 +1,4 @@ -package com.yxt.supervise.monitor; +package com.yxt.supervise.gf; import org.springframework.boot.SpringApplication; diff --git a/yxt-supervise-gf-biz/src/main/java/com/yxt/supervise/gf/biz/test/Test.java b/yxt-supervise-gf-biz/src/main/java/com/yxt/supervise/gf/biz/test/Test.java new file mode 100644 index 0000000..ec17440 --- /dev/null +++ b/yxt-supervise-gf-biz/src/main/java/com/yxt/supervise/gf/biz/test/Test.java @@ -0,0 +1,125 @@ +package com.yxt.supervise.gf.biz.test; + +import cn.hutool.crypto.SecureUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; +import com.yxt.supervise.gf.api.utils.RSAUtils; +import com.yxt.supervise.gf.api.utils.RsaUtil; +import com.yxt.supervise.gf.api.utils.ThirdPartyApiClient; +import org.apache.http.Header; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpHead; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.util.EntityUtils; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.Key; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.PublicKey; +import java.security.cert.X509Certificate; + +/** + * @author feikefei + * @create 2023-06-30-8:50 + */ +@RestController +@RequestMapping("test") +public class Test { + private static final String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Z/+Bslu203UtutmzMW/FqS9bQvaMXQHgvU+ilNR5Hm2IZZalBWPoSbCGzlCUA19C3X6T17X09OMa6aDPKBmF6yXvUI7E/nWM9qUJ5hj4zVO/9GoH03WUyCWSBQg4f+LcnLS75v8nI6moOJ5ILkHmg2KNbEdx55UWjSqBatEopnLWtMFDGZswEbKBH3e2yalK6ddh2kUrtcuQGqFYm/uViAOV+KoptwY2MCNSRLKYE4pCA2BCit7nr3EqNZRqqhKaOE44iyv45zCFrllx3nnwF3X/l+rR4G7Vc7HZwiqKF3RXl9PqmTLJkzhdpAdQX/Kr3SRRHsv/DzKjAZr/2jKrQIDAQAB"; + private static PoolingHttpClientConnectionManager httpClientConnectionManager; + @RequestMapping("/test") + public void test(){ + HttpHead reqHeader = new HttpHead(); + String[] autherHeader = RsaUtil.RandomAuthentHeader(); + String data = autherHeader[0]; + String date = autherHeader[1]; + try { + String encrypt = RsaUtil.encrypt(data, publicKey); + String s = RSAUtils.encryptByPublicKey(data, publicKey); + String jiami = ThirdPartyApiClient.jiami(data); + reqHeader.setHeader("data", jiami); + reqHeader.setHeader("date", date); + final String reqUri = "http://hf-service.tiefaos.com/api/system/apply_material/index"; + String tokenJson = httpGet(reqUri, reqHeader.getAllHeaders()); + HttpRequest header = HttpRequest.get(reqUri).header("data", jiami).header("date", date); + System.out.println(tokenJson); + System.out.println(header); + }catch (Exception e){ + e.printStackTrace(); + } + } + + public static String httpGet(String url, Header[] headers) throws Exception { + HttpUriRequest uriRequest = new HttpGet(url); + if (null != headers) + uriRequest.setHeaders(headers); + CloseableHttpClient httpClient = null; + try { + httpClient = declareHttpClientSSL(url); + CloseableHttpResponse httpresponse = httpClient.execute(uriRequest); + HttpEntity httpEntity = httpresponse.getEntity(); + String result = EntityUtils.toString(httpEntity, "utf-8"); + return result; + } catch (ClientProtocolException e) { + System.out.println(String.format("http请求失败,uri{%s},exception{%s}", new Object[] { url, e })); + } catch (IOException e) { + System.out.println(String.format("IO Exception,uri{%s},exception{%s}", new Object[] { url, e })); + } finally { + if (null != httpClient) + httpClient.close(); + } + return null; + } + + private static CloseableHttpClient declareHttpClientSSL(String url) { + if (url.startsWith("https://")) { + return sslClient(); + } else { + return HttpClientBuilder.create().setConnectionManager(httpClientConnectionManager).build(); + } + } + + private static CloseableHttpClient sslClient() { + try { + SSLContext ctx = SSLContext.getInstance("TLS"); + X509TrustManager tm = new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + return null; + } + public void checkClientTrusted(X509Certificate[] xcs, String str) { + } + public void checkServerTrusted(X509Certificate[] xcs, String str) { + } + }; + ctx.init(null, new TrustManager[] { tm }, null); + SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactory.getSocketFactory(); + return HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build(); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } catch (KeyManagementException e) { + throw new RuntimeException(e); + } + } +}