更新时间:2023-10-11 GMT+08:00
实现示例
调用时请按照实际的cc-gateway地址修改样例:
- https://ip:port/agentgateway
- WORKNO为座席工号,PASSWORD为座席密码,PHONENUMBER为座席软电话号码。
- IF_TRUST_ALL为是否信任所有证书,取值范围为false/true,默认为false,需要加载CC-Gateway客户端证书truststore.jks,并配置客户端证书密码TRUSTSTORE_PASSWORD。配置为true有安全风险,请谨慎使用。
- truststore.jks证书需要跟编译后的MainTest.class放在同一层目录。
package com.huawei.example; import com.alibaba.fastjson.JSON; import lombok.extern.log4j.Log4j2; import org.bouncycastle.crypto.BlockCipher; import org.bouncycastle.crypto.engines.AESEngine; import org.bouncycastle.crypto.prng.SP800SecureRandomBuilder; import org.bouncycastle.jce.provider.BouncyCastleProvider; import sun.security.provider.Sun; import org.apache.commons.io.IOUtils; 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.config.RequestConfig; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; 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.impl.conn.PoolingHttpClientConnectionManager; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.security.KeyStore; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.SecureRandom; import java.security.Security; import java.security.cert.CRL; import java.security.cert.CertPathBuilder; import java.security.cert.CertStore; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.CollectionCertStoreParameters; import java.security.cert.PKIXBuilderParameters; import java.security.cert.PKIXParameters; import java.security.cert.PKIXRevocationChecker; import java.security.cert.X509CertSelector; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Collection; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.TimeUnit; import javax.net.ssl.CertPathTrustManagerParameters; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; public class MainTest { private static final String AGENTGATEWAY_URL = "https://ip:port/agentgateway"; private static final String WORKNO = "100"; private static final String PASSWORD = "xxxxxxxx"; private static final String PHONENUMBER = "88880001"; private static final boolean IF_TRUST_ALL = false; private static final String TRUSTSTORE_PASSWORD = "******"; private static final long MAX_IDLE_TIME = 2L; private static final String HTTP = "http"; private static final String HTTPS = "https"; private static SSLConnectionSocketFactory sslsf = null; private static PoolingHttpClientConnectionManager cm = null; private static CloseableHttpClient httpClient = null; private static final int HTTPCLIENT_CM_MAXCONNECTION = 200; private static final int HTTPCLIENT_CM_MAXPERROUTECONNECTION = 20; private static final int CONNECT_TIMEOUT = 10000; private static final int CONNECTION_REQUEST_TIMEOUT = 10000; private static final int SOCKET_TIMEOUT = 20000; private static final int AES_KEY_BIT_LENGTH = 256; private static final int ENTROPY_SOURCE_BIT_LENGTH = 384; private static final boolean FORCE_RESEED = false; private static final boolean PREDICTION_RESISTANT = false; private static final FastSecureRandomUtil FAST_SECURE_RANDOM = new FastSecureRandomUtil(); /** * @param args */ public static void main(String[] args) { MainTest test = new MainTest(); Map<String, String> resultMap = test.login(WORKNO, PASSWORD, PHONENUMBER); if (resultMap == null) { System.out.println("Send http request to agentgateway failed"); return; } String guid = resultMap.get("guid"); String agwResultString = resultMap.get("result"); HashMap<String, Object> agwResult = JSON.parseObject(agwResultString, HashMap.class); if (agwResult == null) { System.out.println("Parse json to map failed"); return; } if ("0".equals(agwResult.get("retcode"))) { //log in successfully System.out.println("----login ok"); } else if ("100-002".equals(agwResult.get("retcode"))) { //Agent has logged in, but Agent can forcibly log in System.out.println("----has login"); resultMap = test.forceLogin(WORKNO, PASSWORD, PHONENUMBER); if (resultMap == null) { System.out.println("Send http request to agentgateway failed"); return; } guid = resultMap.get("guid"); agwResultString = resultMap.get("result"); agwResult = JSON.parseObject(agwResultString, HashMap.class); if (agwResult == null) { System.out.println("Parse json to map failed"); return; } if ("0".equals(agwResult.get("retcode"))) { //forcibly log in successfully System.out.println("----forceLogin ok"); } else { System.out.println("----forceLogin failed"); return; } } else { System.out.println("----login failed"); return; } //Need to add guid to http request for Authentication after log in Map<String, String> headers = new HashMap<String, String>(); headers.put("guid", guid); //After log in,when agent reset skills, agent can receive call from customer request resultMap = test.resetSkill(WORKNO, true, "", headers); if (resultMap == null) { System.out.println("Send http request to agentgateway failed"); return; } agwResultString = resultMap.get("result"); agwResult = JSON.parseObject(agwResultString, HashMap.class); if (agwResult == null) { System.out.println("Parse json to map failed"); return; } if ("0".equals(agwResult.get("retcode"))) { //Reset skills successfully System.out.println("----resetSkill ok"); } else { System.out.println("----resetSkill failed"); return; } /** *After log in and reset skill successfully. We need to start a thread to get the agent's event by interval. */ Map<String, String> event = null; while (true) { event = null; resultMap = test.getAgentEvent(WORKNO, headers); if (resultMap == null) { System.out.println("Send http request to agentgateway failed"); return; } //if agentgateway uses dynamic authentication mode, the guid will be updated by interval. //You can get the guid from the reponse of get the agent's event request guid = resultMap.get("guid"); if (guid != null && guid != "") { headers = new HashMap<String, String>(); headers.put("guid", guid); } agwResultString = resultMap.get("result"); agwResult = JSON.parseObject(agwResultString, HashMap.class); if (agwResult == null) { System.out.println("Parse json to map failed"); return; } if ("0".equals(agwResult.get("retcode"))) { //Get the agent's event successfully event = (Map<String, String>) agwResult.get("event"); if (event != null) { System.out.println("----getAgentEvent ok:" + agwResultString); } else { try { Thread.sleep(500); } catch (InterruptedException e) { System.out.println("getAgentEvent InterruptedException "); } } } else if ("000-003".equals(agwResult.get("retcode")) || "100-006".equals(agwResult.get("retcode"))) { //No right to visit the interface break; } else { System.out.println("----getAgentEvent failed"); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block System.out.println("getAgentEvent InterruptedException "); } } } } private static TrustManager[] trustManagers = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } }; static { InputStream inStream = null; InputStream crlInputStream = null; SSLContext context = null; try { context = SSLContext.getInstance("TLSv1.2"); if (IF_TRUST_ALL) { context.init(null, trustManagers, getSecurityRandomInstance()); } else { CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); inStream = MainTest.class.getResourceAsStream("truststore.jks"); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(inStream, TRUSTSTORE_PASSWORD.toCharArray()); String crlFile = ""; if (!crlFile.isEmpty()) { crlInputStream = new FileInputStream(crlFile); } loadTrustCertificate(context, certificateFactory, keyStore, crlInputStream); } sslsf = new SSLConnectionSocketFactory(context, new String[]{"TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE); httpClient = createHttpClient(); } catch (Exception e) { System.out.println("init occur Exception: " + e.getMessage()); } finally { IOUtils.closeQuietly(inStream, null); IOUtils.closeQuietly(crlInputStream, null); } } public static SecureRandom getSecurityRandomInstance() { try { SecureRandom secureRandom = FAST_SECURE_RANDOM.getSecureRandom(); secureRandom.setSeed(secureRandom.generateSeed(64)); return secureRandom; } catch (Exception e) { System.out.println("get SecureRandom instance failed" + e); throw e; } } private static void loadTrustCertificate(SSLContext context, CertificateFactory certificateFactory, KeyStore keyStore, InputStream crlInputStream) { try { Collection<CRL> crls = null; if (null != crlInputStream) { crls = new HashSet(); crls.add(certificateFactory.generateCRL(crlInputStream)); } TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX"); PKIXParameters pkixParams = new PKIXBuilderParameters(keyStore, new X509CertSelector()); if (null != crls) { List<CertStore> certStores = new ArrayList(); certStores.add(CertStore.getInstance("Collection", new CollectionCertStoreParameters(crls))); CertPathBuilder certPathBuilder = CertPathBuilder.getInstance("PKIX", new Sun()); PKIXRevocationChecker revocateChecker = (PKIXRevocationChecker) certPathBuilder.getRevocationChecker(); revocateChecker.setOptions(EnumSet.of(PKIXRevocationChecker.Option.PREFER_CRLS, PKIXRevocationChecker.Option.NO_FALLBACK)); pkixParams.setRevocationEnabled(true); pkixParams.setCertStores(certStores); pkixParams.addCertPathChecker(revocateChecker); } else { pkixParams.setRevocationEnabled(false); } tmf.init(new CertPathTrustManagerParameters(pkixParams)); context.init(null, tmf.getTrustManagers(), getSecurityRandomInstance()); } catch (Exception e) { System.out.println("loadTrustCertificate occur exception: " + e.getMessage()); } } /** * createHttpClient * * @return CloseableHttpClient * @throws Exception Exception */ private static CloseableHttpClient createHttpClient() { Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register( HTTP, new PlainConnectionSocketFactory()).register(HTTPS, sslsf).build(); cm = new PoolingHttpClientConnectionManager(registry); int maxConnect; int maxPerRouteConnect; String maxConnectNum = "10"; String maxPreConnectNum = "100"; try { maxConnect = Integer.parseInt(maxConnectNum); } catch (NumberFormatException e) { maxConnect = HTTPCLIENT_CM_MAXCONNECTION; } try { maxPerRouteConnect = Integer.parseInt(maxPreConnectNum); } catch (NumberFormatException e) { maxPerRouteConnect = HTTPCLIENT_CM_MAXPERROUTECONNECTION; } cm.setMaxTotal(maxConnect); cm.setDefaultMaxPerRoute(maxPerRouteConnect); RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(CONNECT_TIMEOUT) .setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT) .setSocketTimeout(SOCKET_TIMEOUT) .build(); httpClient = HttpClients.custom() .setDefaultRequestConfig(requestConfig) .evictExpiredConnections() .evictIdleConnections(MAX_IDLE_TIME, TimeUnit.SECONDS) .disableAutomaticRetries() .setConnectionManager(cm) .build(); return httpClient; } /** * log in * * @param workNo the work no of the agent * @param password the password of the agent * @param phoneNumber the phone number of the agent * @return */ public Map<String, String> login(String workNo, String password, String phoneNumber) { String loginUrl = AGENTGATEWAY_URL + "/resource/onlineagent/" + workNo; Map<String, Object> loginParam = new HashMap<String, Object>(); loginParam.put("password", password); loginParam.put("phonenum", phoneNumber); return put(loginUrl, loginParam, null); } /** * When agent has logged in, call the interface to forcibly log in * * @param workNo the work no of the agent * @param password the password of the agent * @param phoneNumber the phone number of the agent * @return */ public Map<String, String> forceLogin(String workNo, String password, String phoneNumber) { String loginUrl = AGENTGATEWAY_URL + "/resource/onlineagent/" + workNo + "/forcelogin"; Map<String, Object> loginParam = new HashMap<String, Object>(); loginParam.put("password", password); loginParam.put("phonenum", phoneNumber); return put(loginUrl, loginParam, null); } /** * After log in, reset the skills * * @param workNo the work no of the agent * @param autoFlag Is automatically signed into the skill queue * @param skillId the id of the skill. if has more than one skill that need to be sign, it is split by ; * @param headers the field is used to set the header of http request * @return */ public Map<String, String> resetSkill(String workNo, boolean autoFlag, String skillId, Map<String, String> headers) { String url = AGENTGATEWAY_URL + "/resource/onlineagent/" + workNo + "/resetskill/" + autoFlag; if (skillId != null && skillId != "") { url = url + "?skillid=" + skillId; } return post(url, null, headers); } /** * Get the agent's event * * @param workNo workNo the work no of the agent * @param headers the field is used to set the header of http request * @return */ public Map<String, String> getAgentEvent(String workNo, Map<String, String> headers) { String url = AGENTGATEWAY_URL + "/resource/agentevent/" + workNo; return get(url, headers); } /** * Send http's PUT request * * @param url the address of the request * @param entityParams the paramters of entity * @param headers the field is used to set the header of http request * @return */ public Map<String, String> put(String url, Map<String, Object> entityParams, Map<String, String> headers) { CloseableHttpClient httpClient = null; Map<String, String> resultMap = null; try { httpClient = createHttpClient(); HttpPut httpPut = new HttpPut(url); if (entityParams != null) { String jsonString = JSON.toJSONString(entityParams); HttpEntity entity = new StringEntity(jsonString); httpPut.setEntity(entity); } if (headers != null) { Set<Entry<String, String>> headersSet = headers.entrySet(); for (Entry<String, String> entry : headersSet) { httpPut.setHeader(entry.getKey(), entry.getValue()); } } httpPut.setHeader("Content-Type", "application/json"); HttpResponse response = httpClient.execute(httpPut); int returnCode = response.getStatusLine().getStatusCode(); if (returnCode == HttpStatus.SC_OK) { InputStream is = response.getEntity().getContent(); BufferedReader in = new BufferedReader(new InputStreamReader(is)); StringBuffer buffer = new StringBuffer(); String line = ""; while ((line = in.readLine()) != null) { buffer.append(line); } Header[] allHeaders = response.getAllHeaders(); String guid = ""; if (allHeaders != null && allHeaders.length > 0) { for (Header header : allHeaders) { if (header.getName().equals("Set-GUID")) { String setGuid = header.getValue(); if (setGuid != null) { guid = setGuid.replace("JSESSIONID=", ""); } break; } } } resultMap = new HashMap<String, String>(); resultMap.put("guid", guid); resultMap.put("result", buffer.toString()); } else { System.out.println(returnCode); } return resultMap; } catch (ClientProtocolException e) { System.out.println("HttpPut ClientProtocolException "); } catch (IOException e) { System.out.println("HttpPut IOException "); } catch (Exception e) { System.out.println("HttpPut Exception "); } finally { httpClient.getConnectionManager().shutdown(); } return resultMap; } /** * Send http's POST request * * @param url the address of the request * @param entityParams the paramters of entity * @param headers the field is used to set the header of http request * @return */ public Map<String, String> post(String url, Map<String, Object> entityParams, Map<String, String> headers) { CloseableHttpClient httpClient = null; Map<String, String> resultMap = null; try { httpClient = createHttpClient(); HttpPost httpPost = new HttpPost(url); if (entityParams != null) { String jsonString = JSON.toJSONString(entityParams); HttpEntity entity = new StringEntity(jsonString); httpPost.setEntity(entity); } if (headers != null) { Set<Entry<String, String>> headersSet = headers.entrySet(); for (Entry<String, String> entry : headersSet) { httpPost.setHeader(entry.getKey(), entry.getValue()); } } httpPost.setHeader("Content-Type", "application/json"); HttpResponse response = httpClient.execute(httpPost); int returnCode = response.getStatusLine().getStatusCode(); if (returnCode == HttpStatus.SC_OK) { InputStream is = response.getEntity().getContent(); BufferedReader in = new BufferedReader(new InputStreamReader(is)); StringBuffer buffer = new StringBuffer(); String line = ""; while ((line = in.readLine()) != null) { buffer.append(line); } resultMap = new HashMap<String, String>(); resultMap.put("result", buffer.toString()); } else { System.out.println(returnCode); } return resultMap; } catch (ClientProtocolException e) { System.out.println("HttpPost ClientProtocolException"); } catch (IOException e) { System.out.println("HttpPost IOException"); } catch (Exception e) { System.out.println("HttpPost Exception"); } finally { httpClient.getConnectionManager().shutdown(); } return resultMap; } /** * Send http's GET request * * @param url the address of the request * @param headers the field is used to set the header of http request * @return */ public Map<String, String> get(String url, Map<String, String> headers) { CloseableHttpClient httpClient = null; Map<String, String> resultMap = null; try { httpClient = createHttpClient(); HttpGet httpGet = new HttpGet(url); if (headers != null) { Set<Entry<String, String>> headersSet = headers.entrySet(); for (Entry<String, String> entry : headersSet) { httpGet.setHeader(entry.getKey(), entry.getValue()); } } httpGet.setHeader("Content-Type", "application/json"); HttpResponse response = httpClient.execute(httpGet); int returnCode = response.getStatusLine().getStatusCode(); if (returnCode == HttpStatus.SC_OK) { InputStream is = response.getEntity().getContent(); BufferedReader in = new BufferedReader(new InputStreamReader(is)); StringBuffer buffer = new StringBuffer(); String line = ""; while ((line = in.readLine()) != null) { buffer.append(line); } Header[] allHeaders = response.getAllHeaders(); String guid = ""; if (allHeaders != null && allHeaders.length > 0) { for (Header header : allHeaders) { if (header.getName().equals("Set-GUID")) { String setGuid = header.getValue(); if (setGuid != null) { guid = setGuid.replace("JSESSIONID=", ""); } break; } } } resultMap = new HashMap<String, String>(); resultMap.put("guid", guid); resultMap.put("result", buffer.toString()); } else { System.out.println(returnCode); } return resultMap; } catch (ClientProtocolException e) { System.out.println("HttpGet ClientProtocolException"); } catch (IOException e) { System.out.println("HttpGet IOException"); } catch (Exception e) { System.out.println("HttpGet Exception"); } finally { httpClient.getConnectionManager().shutdown(); } return resultMap; } } package com.huawei.example; import lombok.extern.log4j.Log4j2; import org.bouncycastle.crypto.BlockCipher; import org.bouncycastle.crypto.engines.AESEngine; import org.bouncycastle.crypto.prng.SP800SecureRandomBuilder; import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.Security; @Log4j2 public class FastSecureRandomUtil { private static final int AES_KEY_BIT_LENGTH = 256; private static final int ENTROPY_SOURCE_BIT_LENGTH = 384; private static final boolean FORCE_RESEED = false; private static final boolean PREDICTION_RESISTANT = false; static { if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { Security.addProvider(new BouncyCastleProvider()); } } private final SecureRandom fastRandom; public FastSecureRandomUtil() throws Exception { SecureRandom source = null; try { source = SecureRandom.getInstanceStrong(); } catch (NoSuchAlgorithmException e) { log.error("FastSecureRandom NoSuchAlgorithmException: {}.", e.getMessage()); throw new Exception("FastSecureRandom NoSuchAlgorithmException.", e); } BlockCipher cipher = new AESEngine(); byte[] nonce = new byte[ENTROPY_SOURCE_BIT_LENGTH / Byte.SIZE]; source.nextBytes(nonce); fastRandom = new SP800SecureRandomBuilder(source, PREDICTION_RESISTANT).setEntropyBitsRequired( ENTROPY_SOURCE_BIT_LENGTH).buildCTR(cipher, AES_KEY_BIT_LENGTH, nonce, FORCE_RESEED); } public byte[] getRandomBytes(int byteSize) { byte[] randomBytes = new byte[byteSize]; fastRandom.nextBytes(randomBytes); return randomBytes; } public SecureRandom getSecureRandom() { return fastRandom; } }
父主题: 第一次应用开发