You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
VMIS-interface/참고자료/gpki 암호화 원시소스/N0000001589_차세대교통안전공단_시군구연계...

317 lines
10 KiB
Java

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import util.NewGpkiUtil;
import util.ShareGpki;
public class N0000001589____SignguCarBassMatterInqireService {
/**
* IF-LI-AC1-FD11-01-GSR0
* 자동차기본사항
*/
// 이용기관의 네트워크망에 따라서 호출 host 정보가 다름. (네트워크망과 개발 or 운영의 용도에 따라서 해당하는 host로 설정)
// 이용기관 : 행정망
static String host = "10.188.225.94:29001"; // 개발(DEV)
// static String host = "10.188.225.25:29001"; // 운영(OP)
// 이용기관 : 인터넷
// static String host = "116.67.73.153:39011"; // 개발(DEV)
// static String host = "116.67.73.153:29001"; // 운영(OP)
static String targetUrl = "http://"+host+"/piss/api/molit/SignguCarBassMatterInqireService";
static String method = "POST";
//--------------Client Setting---------------
//http Header Setting
static String requestType = "json";
static String apiKey = "행정정보공동이용센터 API KEY"; // 행정정보공동이용센터에서 발급
static String cvmis_apikey = "교통안전공단 cvmis_apikey"; // 교통안전공단에서 발급
static boolean useMockResponse = true; // true false
//http Body Setting
static String charset = "UTF-8";
//Gpki Setting
static boolean useGpki = true;
static boolean useSign = true;
static String gpkiCharset = "UTF-8";
static String certServerId = "이용기관 인증서"; // 이용기관 인증서 ID
static String targetServerId = "SVR1611000006"; // 보유기관 인증서 ID(교통안전공단)
public static void main(String[] args) {
N0000001589____SignguCarBassMatterInqireService.executeClient();
}
public static void executeClient(){
String requestBody = makeBody();
String tx_id = getTx_Id();
Map<String, String> requestHeader = new LinkedHashMap<String, String>();
try {
requestHeader.put("Host", InetAddress.getLocalHost().toString());
requestHeader.put("User-Agent", "java-net-httpclient");
} catch (Exception e) {
e.printStackTrace();
}
requestHeader.put("Content-Type", "application/"+requestType);
requestHeader.put("Accept", "application/"+requestType);
requestHeader.put("gpki_yn",useGpki ? "Y":"N");
// requestHeader.put("mock_yn",useMockResponse ? "Y":"N");
requestHeader.put("tx_id", tx_id);
requestHeader.put("cert_server_id",certServerId);
requestHeader.put("api_key", apiKey);
requestHeader.put("cvmis_apikey", cvmis_apikey);
System.out.println("-------- Request Header -----------");
for(Map.Entry<String, String> entry : requestHeader.entrySet()){
System.out.println(entry.getKey() + " : " + entry.getValue());
}
System.out.println("--------- Request Body ------------");
System.out.println(requestBody);
// body 암호화
if(useGpki) {
System.out.println("----- Request Body Encrypt --------");
String bodyEncryptTarget = requestBody;
String bodyEncrypt = "";
try {
bodyEncrypt = gpkiEncrypt(bodyEncryptTarget.toString());
requestBody = requestBody.replace(bodyEncryptTarget, bodyEncrypt);
System.out.println("Encrypt Body : " + requestBody);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("------------ Response -------------");
N0000001589____SignguCarBassMatterInqireService.Response response = sendRequest(targetUrl, method, requestHeader, requestBody, charset);
int responseCode = response.getResponseCode();
Map<String, Object> responseHeader = response.getHeaderMap();
String responseBody = response.getBody();
System.out.println("-> response : " + response);
System.out.println("-> responseCode : " + responseCode);
System.out.println("-> responseHeader : " + responseHeader);
System.out.println("-> responseBody : " + responseBody);
// Body 복호화
if(useGpki && responseCode == HttpURLConnection.HTTP_OK) {
System.out.println("----- Response Body Decrypt --------");
try {
String bodyDecryptTarget = responseBody;
String bodyDecrypt = "";
bodyDecrypt = gpkiDecrypt(bodyDecryptTarget);
responseBody = responseBody.replace(bodyDecryptTarget, bodyDecrypt);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("-------- Response Message ---------");
System.out.println(responseBody);
}
private static Response sendRequest(String targetUrl, String method,
Map<String, String> requestHeader, String body, String charset) {
Response response = new Response();
HttpURLConnection con = null;
try {
URL url = new URL(targetUrl);
con = (HttpURLConnection) url.openConnection();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
try {
for(Map.Entry<String, String> entry : requestHeader.entrySet()){
con.setRequestProperty(entry.getKey(), entry.getValue());
}
con.setRequestMethod(method);
con.setDefaultUseCaches(false);
con.setAllowUserInteraction(false);
con.setReadTimeout(15000);
con.setConnectTimeout(3000);
con.setDoInput(true);
con.setDoOutput(true);
con.connect();
OutputStream os = null;
OutputStreamWriter osw = null;
StringBuffer responseBodyBuffer = new StringBuffer("");
Map<String, Object> headerMap = response.getHeaderMap();
os = con.getOutputStream();
osw = new OutputStreamWriter(os, Charset.forName(charset));
osw.write(body);
osw.flush();
int code = con.getResponseCode();
response.setResponseCode(code);
InputStream is = null;
InputStreamReader isr = null;
if(code == HttpURLConnection.HTTP_OK){
is = con.getInputStream();
}else{
is = con.getErrorStream();
}
Map<String, List<String>> headerFields = con.getHeaderFields();
for(Map.Entry<String, List<String>> headerEntry : headerFields.entrySet()){
String key = headerEntry.getKey();
List<String> values = headerEntry.getValue();
if(values.size()<=1){
headerMap.put(key, values.get(0));
}else{
headerMap.put(key, values);
}
}
try {
isr = new InputStreamReader(is, Charset.forName(charset));
int len = -1;
char[] ch = new char[32];
while((len = isr.read(ch, 0, ch.length))!= -1){
responseBodyBuffer.append(new String(ch, 0, len));
}
response.setBody(responseBodyBuffer.toString());
} catch (IOException e) {
e.printStackTrace();
}finally{
isr.close();
is.close();
os.close();
osw.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally{
if(con != null){
con.disconnect();
}
}
return response;
}
private static String makeBody() {
StringBuffer sb = new StringBuffer();
// request data
sb.append("{\n");
sb.append(" \"data\": [\n");
sb.append(" {\n");
sb.append(" \"CNTC_INFO_CODE\": \"\",\n");
sb.append(" \"ONES_INFORMATION_OPEN\": \"\",\n");
sb.append(" \"VHRNO\": \"\",\n");
sb.append(" \"CPTTR_NM\": \"\",\n");
sb.append(" \"CPTTR_IHIDNUM\": \"\",\n");
sb.append(" \"CPTTR_LEGALDONG_CODE\": \"\",\n");
sb.append(" \"ROUTE_SE_CODE\": \"\",\n");
sb.append(" \"DETAIL_EXPRESSION\": \"\",\n");
sb.append(" \"INQIRE_SE_CODE\": \"\"\n");
sb.append(" }\n");
sb.append(" ]\n");
sb.append("}\n");
return sb.toString();
}
// 암호화
private static String gpkiEncrypt(String str) throws Exception {
NewGpkiUtil g = ShareGpki.getGpkiUtil(targetServerId);
byte[] encrypted = g.encrypt(str.getBytes(gpkiCharset), targetServerId); // 암호화
byte[] signed = encrypted;
if(useSign) {
signed = g.sign(encrypted); // digital sign
}
String encoded = g.encode(signed); // base64 encode
return encoded;
}
// 복호화
public static String gpkiDecrypt(String str) throws Exception {
NewGpkiUtil g = ShareGpki.getGpkiUtil(targetServerId);
byte[] decode = g.decode(str); // base64 decode
byte[] validate = decode;
if(useSign) {
validate = g.validate(decode);
}
byte[] decrypt = g.decrypt(validate); // 복호화
String decrypted = new String(decrypt,gpkiCharset);
// System.out.println("body(encrypted) : " + str); // Testing log
// System.out.println("body(decrypt) : " + decrypted); // Testing log
return decrypted;
}
private static String getTx_Id() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS",Locale.KOREA);
String cur = sdf.format(new Date());
String transactionUniqueId = cur + keyGen(8);
return transactionUniqueId;
}
private static Random r = new Random(System.currentTimeMillis());
public static String keyGen(int length) {
char[] key = new char[length];
int tmp = 0;
for (int i = 0; i < length; i++) {
tmp = r.nextInt(3);
if (tmp == 0)
key[i] = (char) (r.nextInt(26) + 65);
else if (tmp == 1)
key[i] = (char) (r.nextInt(10) + 48);
else if (tmp == 2)
key[i] = (char) (r.nextInt(26) + 97);
else {
key[i] = (char) r.nextInt(256);
}
}
return String.valueOf(key);
}
/*
* Response
*/
public static class Response {
int responseCode;
String body;
Map<String, Object> headerMap = new LinkedHashMap<String, Object>();
public int getResponseCode() {
return responseCode;
}
public void setResponseCode(int responseCode) {
this.responseCode = responseCode;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public Map<String, Object> getHeaderMap() {
return headerMap;
}
public void setHeaderMap(Map<String, Object> headerMap) {
this.headerMap = headerMap;
}
}
}