Crosscert.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. package kr.co.udapsoft.common.util;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.UnsupportedEncodingException;
  8. import java.net.URLDecoder;
  9. import java.util.Properties;
  10. import crosscert.Base64;
  11. import crosscert.Certificate;
  12. import crosscert.Decrypt;
  13. import crosscert.PrivateKey;
  14. import crosscert.Signer;
  15. import crosscert.Verifier;
  16. import kr.co.hsnc.common.base.WAFLogger;
  17. import kr.co.hsnc.common.config.WAFConfig;
  18. public class Crosscert {
  19. private String sOrgData = ""; // 데이타 원문
  20. private String sDn = ""; // 인증서DN값
  21. /**
  22. * 암호화 하기 위한 인증키값 리턴
  23. * @param sDerFileNm 키값
  24. * @return
  25. * @throws Exception
  26. */
  27. public String getBase64EncodeCert(String sDerFileNm)
  28. {
  29. String sBase64EncodeCert = "";
  30. FileInputStream inCert = null;
  31. try {
  32. //서버인증서를 읽는다. : 원문을 암호화 하기 위함
  33. int nCertlen = 0;
  34. int nRet = 0;
  35. byte[] Certfilebuf = null;
  36. String path = WAFConfig.get("waf.key.file.path");
  37. inCert = new FileInputStream(new File(path+sDerFileNm));
  38. nCertlen = inCert.available();
  39. Certfilebuf = new byte[nCertlen];
  40. nRet = inCert.read(Certfilebuf);
  41. Base64 base64 = new Base64();
  42. nRet = base64.Encode(Certfilebuf, nCertlen);
  43. if (nRet != 0)
  44. {
  45. WAFLogger.debug("base인코드 에러내용 : " + base64.errmessage);
  46. WAFLogger.debug("base인코드에러코드 : " + base64.errcode);
  47. }
  48. sBase64EncodeCert = new String(base64.contentbuf);
  49. } catch (FileNotFoundException e) {
  50. WAFLogger.error("[ERROR "+this.getClass().getName() + ".getBase64EncodeCert()] :" + e.toString());
  51. } catch (IOException e) {
  52. WAFLogger.error("[ERROR "+this.getClass().getName() + ".getBase64EncodeCert()] :" + e.toString());
  53. }finally
  54. {
  55. try {
  56. if(inCert != null) inCert.close();
  57. } catch (IOException e) {
  58. WAFLogger.error("[ERROR "+this.getClass().getName() + ".getBase64EncodeCert()] :" + e.toString());
  59. }
  60. }
  61. return sBase64EncodeCert;
  62. }
  63. /**
  64. * 전자서명 검증
  65. * @param sSignData 서명데이타
  66. * @return
  67. * @throws UnsupportedEncodingException
  68. */
  69. public String chkSignVerify(String sSignData) throws UnsupportedEncodingException
  70. {
  71. String sMsg = "SIGN_SUCCESS";
  72. try {
  73. int nRet = 0;
  74. Base64 CBase64 = new Base64();
  75. nRet = CBase64.Decode(sSignData.getBytes("KSC5601"), sSignData.getBytes("KSC5601").length);
  76. if(nRet==0)
  77. {
  78. WAFLogger.debug("서명값 Base64 Decode 결과 : 성공") ;
  79. }
  80. else
  81. {
  82. WAFLogger.debug("서명값 Base64 Decode 결과 : 실패") ;
  83. WAFLogger.debug("에러내용 : " + CBase64.errmessage);
  84. WAFLogger.debug("에러코드 : " + CBase64.errcode);
  85. sMsg = "SIGN_ERROR";
  86. }
  87. Verifier CVerifier = new Verifier();
  88. nRet=CVerifier.VerSignedData(CBase64.contentbuf, CBase64.contentlen);
  89. if(nRet==0)
  90. {
  91. this.setOrgData(CVerifier);
  92. WAFLogger.debug("전자서명 검증 결과 : 성공") ;
  93. WAFLogger.debug("원문 : " + this.getOrgData());
  94. }
  95. else
  96. {
  97. WAFLogger.debug("전자서명 검증 결과 : 실패") ;
  98. WAFLogger.debug("에러내용 : " + CVerifier.errmessage);
  99. WAFLogger.debug("에러코드 : " + CVerifier.errcode);
  100. sMsg = "SIGN_ERROR";
  101. }
  102. //인증서 정보 추출 결과
  103. Certificate CCertificate = new Certificate();
  104. nRet=CCertificate.ExtractCertInfo(CVerifier.certbuf, CVerifier.certlen);
  105. if (nRet ==0)
  106. {
  107. this.setDn(CCertificate);
  108. WAFLogger.debug("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
  109. WAFLogger.debug("serial; "+ CCertificate.serial);
  110. WAFLogger.debug("issuer; "+ CCertificate.issuer);
  111. WAFLogger.debug("subject; "+ CCertificate.subject);
  112. WAFLogger.debug("from; "+ CCertificate.from);
  113. WAFLogger.debug("to; "+ CCertificate.to);
  114. WAFLogger.debug("policy; "+ CCertificate.policy);
  115. /**
  116. WAFLogger.debug("version; "+ CCertificate.version);
  117. WAFLogger.debug("serial; "+ CCertificate.serial);
  118. WAFLogger.debug("issuer; "+ CCertificate.issuer);
  119. WAFLogger.debug("subject; "+ CCertificate.subject);
  120. WAFLogger.debug("subjectAlgId; "+ CCertificate.subjectAlgId);
  121. WAFLogger.debug("from; "+ CCertificate.from);
  122. WAFLogger.debug("to; "+ CCertificate.to);
  123. WAFLogger.debug("signatureAlgId; "+ CCertificate.signatureAlgId);
  124. WAFLogger.debug("pubkey; "+ CCertificate.pubkey);
  125. WAFLogger.debug("signature; "+ CCertificate.signature);
  126. WAFLogger.debug("issuerAltName; "+ CCertificate.issuerAltName);
  127. WAFLogger.debug("subjectAltName; "+ CCertificate.subjectAltName);
  128. WAFLogger.debug("keyusage; "+ CCertificate.keyusage);
  129. WAFLogger.debug("policy; "+ CCertificate.policy);
  130. WAFLogger.debug("basicConstraint; "+ CCertificate.basicConstraint);
  131. WAFLogger.debug("policyConstraint; "+ CCertificate.policyConstraint);
  132. WAFLogger.debug("distributionPoint;"+ CCertificate.distributionPoint);
  133. WAFLogger.debug("authorityKeyId; "+ CCertificate.authorityKeyId);
  134. WAFLogger.debug("subjectKeyId; "+ CCertificate.subjectKeyId);
  135. **/
  136. }else
  137. {
  138. WAFLogger.debug("인증서 검증 결과 : 실패") ;
  139. WAFLogger.debug("에러내용 : " + CCertificate.errmessage);
  140. WAFLogger.debug("에러코드 : " + CCertificate.errcode);
  141. sMsg = "SIGN_ERROR";
  142. }
  143. // 인증서 검증
  144. String Policies = "1.2.410.200004.5.2.1.1|" + // 한국정보인증 법인
  145. "1.2.410.200004.5.1.1.7|" + // 한국증권전산 법인, 단체, 개인사업자
  146. "1.2.410.200005.1.1.5|" + // 금융결제원 법인, 임의단체, 개인사업자
  147. "1.2.410.200004.5.3.1.1|" + // 한국전산원 기관(국가기관 및 비영리기관)
  148. "1.2.410.200004.5.3.1.2|" + // 한국전산원 법인(국가기관 및 비영리기관을 제외한 공공기관, 법인)
  149. "1.2.410.200004.5.4.1.2|" + // 한국전자인증 법인, 단체, 개인사업자
  150. "1.2.410.200012.1.1.3|" + // 한국무역정보통신 법인
  151. "1.2.410.200004.5.4.2.369|" + // 나이스디앤비전용 법인
  152. "1.2.410.200004.5.4.1.3|" + // 서버인증서
  153. "1.2.410.200004.5.4.2.424|" + // SGC이앤씨 전용 인증서
  154. "1.2.410.200004.5.2.1.2|" + // 한국정보인증 개인
  155. "1.2.410.200004.5.1.1.5|" + // 한국증권전산 개인
  156. "1.2.410.200005.1.1.1|" + // 금융결제원 개인
  157. "1.2.410.200004.5.3.1.9|" + // 한국전산원 개인
  158. "1.2.410.200004.5.4.1.1|" + // 한국전자인증 개인
  159. "1.2.410.200012.1.1.1|" + // 한국무역정보통신 개인
  160. "1.2.410.200005.1.1.4|" + // 은행용 실서버에스는 제거필 개인
  161. "";
  162. CCertificate.errmessage = "";
  163. nRet=CCertificate.ValidateCert(CVerifier.certbuf, CVerifier.certlen, Policies, 1);
  164. if(nRet==0)
  165. {
  166. WAFLogger.debug("인증서 검증 결과 : 성공") ;
  167. }
  168. else
  169. {
  170. WAFLogger.debug("인증서 검증 결과 : 실패 ㅜㅜ") ;
  171. WAFLogger.debug("에러내용 : " + CCertificate.errmessage);
  172. WAFLogger.debug("에러코드 : " + CCertificate.errcode);
  173. WAFLogger.debug("에러코드 : " + Integer.toHexString(CCertificate.errcode));
  174. WAFLogger.debug("에러내용 : " + CCertificate.errdetailmessage);
  175. sMsg = "SIGN_ERROR";
  176. }
  177. } catch (UnsupportedEncodingException e) {
  178. sMsg = "SIGN_ERROR";
  179. WAFLogger.debug("[ERROR "+this.getClass().getName() + ".getBase64EncodeCert()] :" + e.toString());
  180. throw new UnsupportedEncodingException("[ERROR "+this.getClass().getName() + ".getBase64EncodeCert()] :" + e.toString());
  181. }
  182. return sMsg;
  183. }
  184. /**
  185. * 데이타 복호화
  186. * @param sSignData 암호화데이타
  187. * @return
  188. * @throws IOException
  189. */
  190. public String decryptData(String sSignData) throws IOException
  191. {
  192. String sOrgData = "";
  193. try {
  194. int nRet = 0;
  195. InputStream inPri = null;
  196. InputStream inCert = null;
  197. byte[] Prifilebuf;
  198. byte[] Certfilebuf;
  199. //복호화용 개인키 읽기 start
  200. int nPrilen;
  201. int nCertlen;
  202. String sDerFullPath = "";
  203. String sKeyFullPath = "";
  204. String path = WAFConfig.get("waf.key.file.path");
  205. sDerFullPath = path + "signCert.der";
  206. sKeyFullPath = path + "signPri.key";
  207. inPri = new FileInputStream(new File(sKeyFullPath));
  208. inCert = new FileInputStream(new File(sDerFullPath));
  209. nPrilen = inPri.available();
  210. Prifilebuf = new byte[nPrilen];
  211. nRet = inPri.read(Prifilebuf);
  212. nCertlen = inCert.available();
  213. Certfilebuf = new byte[nCertlen];
  214. nRet = inCert.read(Certfilebuf);
  215. //복호화용 개인키 읽기 end
  216. //인증서 정책
  217. String policies = "";
  218. // 법인상호연동용(범용)
  219. policies +="1.2.410.200004.5.2.1.1" + "|"; // 한국정보인증 법인
  220. policies +="1.2.410.200004.5.1.1.7" + "|"; // 한국증권전산 법인, 단체, 개인사업자
  221. policies +="1.2.410.200005.1.1.5" + "|"; // 금융결제원 법인, 임의단체, 개인사업자
  222. policies +="1.2.410.200004.5.3.1.1" + "|"; // 한국전산원 기관(국가기관 및 비영리기관)
  223. policies +="1.2.410.200004.5.3.1.2" + "|"; // 한국전산원 법인(국가기관 및 비영리기관을 제외한 공공기관, 법인)
  224. policies +="1.2.410.200004.5.4.1.2" + "|"; // 한국전자인증 법인, 단체, 개인사업자
  225. policies +="1.2.410.200012.1.1.3" + "|"; // 한국무역정보통신 법인
  226. policies +="1.2.410.200004.5.4.2.369" + "|"; // 나이스디앤비 법인
  227. //서버에서 개인키 읽어오기
  228. PrivateKey CPrivateKey = new PrivateKey(); //개인키 추출 클래스
  229. Base64 CBase64 = new Base64(); //base64 인코딩 디코딩
  230. Decrypt decrypt = new Decrypt(); //복호화 클래스
  231. //Certificate CCertificate = new Certificate(); //인증서 추출 및 검증
  232. Verifier CVerifier = new Verifier(); // 서명검증을 위한 클래스
  233. //String sSignPwd = Startup.conf.getString("servercert.pwd");
  234. String sSignPwd = WAFConfig.get("waf.key.pwd");
  235. WAFLogger.debug("sSignPwd["+sSignPwd+"]");
  236. // 개인키 추출
  237. nRet = CPrivateKey.DecryptPriKey(sSignPwd, Prifilebuf, nPrilen);
  238. if (nRet != 0)
  239. {
  240. WAFLogger.debug("에러내용 : " + CPrivateKey.errmessage);
  241. WAFLogger.debug("에러코드 : " + CPrivateKey.errcode);
  242. sOrgData = "";
  243. }
  244. // 서명값 base64 디코딩
  245. nRet = CBase64.Decode(sSignData.getBytes(), sSignData.getBytes().length);
  246. if (nRet != 0)
  247. {
  248. WAFLogger.debug("base64디코드 에러내용(서명값) : " + CBase64.errmessage);
  249. WAFLogger.debug("base64디코드 에러코드 : " + CBase64.errcode);
  250. sOrgData = "";
  251. }
  252. // 전자서명 검증
  253. nRet=CVerifier.VerSignedData(CBase64.contentbuf, CBase64.contentlen);
  254. if(nRet != 0)
  255. {
  256. WAFLogger.debug("전자서명 검증 결과 : 실패") ;
  257. WAFLogger.debug("에러내용 : " + CVerifier.errmessage);
  258. WAFLogger.debug("에러코드 : " + CVerifier.errcode);
  259. sOrgData = "";
  260. }
  261. // 원문 암호화값 base64 디코딩
  262. nRet = CBase64.Decode(CVerifier.contentbuf, CVerifier.contentlen);
  263. if (nRet != 0)
  264. {
  265. WAFLogger.debug("base64디코드 에러내용(원문 암호화값) : " + CBase64.errmessage);
  266. WAFLogger.debug("base64디코드 에러코드 : " + CBase64.errcode);
  267. sOrgData = "";
  268. }
  269. //인증서 복호화
  270. nRet = decrypt.DecEnvelopedData(CPrivateKey.prikeybuf, CPrivateKey.prikeylen, Certfilebuf, nCertlen, CBase64.contentbuf,
  271. CBase64.contentlen);
  272. if (nRet != 0)
  273. {
  274. WAFLogger.debug("복호화 에러내용 : " + decrypt.errmessage);
  275. WAFLogger.debug("복호화 에러코드 : " + decrypt.errcode);
  276. sOrgData = decrypt.errcode+"";
  277. }else{
  278. // sOrgData = new String(decrypt.contentbuf , "KSC5601");
  279. // sOrgData = URLDecoder.decode(sOrgData);
  280. try{
  281. sOrgData = new String(decrypt.contentbuf , "KSC5601");
  282. System.out.println("=============================================");
  283. System.out.println(sOrgData);
  284. System.out.println("=============================================");
  285. sOrgData = URLDecoder.decode(sOrgData);
  286. } catch( Exception e){
  287. sOrgData = new String(decrypt.contentbuf , "KSC5601");
  288. }
  289. }
  290. } catch (FileNotFoundException e) {
  291. WAFLogger.error("[ERROR Config.decryptData()] :" + e.toString());
  292. throw new FileNotFoundException("[ERROR Config.decryptData()] :" + e.toString());
  293. } catch (IOException e) {
  294. WAFLogger.error("[ERROR Config.decryptData()] :" + e.toString());
  295. throw new IOException("[ERROR Config.decryptData()] :" + e.toString());
  296. }
  297. return sOrgData;
  298. }
  299. /**
  300. * 데이타 복호화
  301. * @param sSignData 암호화데이타
  302. * @return
  303. * @throws IOException
  304. */
  305. public String decryptDataOld(String sSignData) throws IOException
  306. {
  307. String sOrgData = "";
  308. try {
  309. int nRet = 0;
  310. InputStream inPri = null;
  311. InputStream inCert = null;
  312. byte[] Prifilebuf;
  313. byte[] Certfilebuf;
  314. //복호화용 개인키 읽기 start
  315. int nPrilen;
  316. int nCertlen;
  317. String sDerFullPath = "";
  318. String sKeyFullPath = "";
  319. String path = WAFConfig.get("waf.key.file.path.old");
  320. sDerFullPath = path + "signCert.der";
  321. sKeyFullPath = path + "signPri.key";
  322. inPri = new FileInputStream(new File(sKeyFullPath));
  323. inCert = new FileInputStream(new File(sDerFullPath));
  324. nPrilen = inPri.available();
  325. Prifilebuf = new byte[nPrilen];
  326. nRet = inPri.read(Prifilebuf);
  327. nCertlen = inCert.available();
  328. Certfilebuf = new byte[nCertlen];
  329. nRet = inCert.read(Certfilebuf);
  330. //복호화용 개인키 읽기 end
  331. //인증서 정책
  332. String policies = "";
  333. // 법인상호연동용(범용)
  334. policies +="1.2.410.200004.5.2.1.1" + "|"; // 한국정보인증 법인
  335. policies +="1.2.410.200004.5.1.1.7" + "|"; // 한국증권전산 법인, 단체, 개인사업자
  336. policies +="1.2.410.200005.1.1.5" + "|"; // 금융결제원 법인, 임의단체, 개인사업자
  337. policies +="1.2.410.200004.5.3.1.1" + "|"; // 한국전산원 기관(국가기관 및 비영리기관)
  338. policies +="1.2.410.200004.5.3.1.2" + "|"; // 한국전산원 법인(국가기관 및 비영리기관을 제외한 공공기관, 법인)
  339. policies +="1.2.410.200004.5.4.1.2" + "|"; // 한국전자인증 법인, 단체, 개인사업자
  340. policies +="1.2.410.200012.1.1.3" + "|"; // 한국무역정보통신 법인
  341. policies +="1.2.410.200004.5.4.2.369" + "|"; // 나이스디앤비 법인
  342. //서버에서 개인키 읽어오기
  343. PrivateKey CPrivateKey = new PrivateKey(); //개인키 추출 클래스
  344. Base64 CBase64 = new Base64(); //base64 인코딩 디코딩
  345. Decrypt decrypt = new Decrypt(); //복호화 클래스
  346. //Certificate CCertificate = new Certificate(); //인증서 추출 및 검증
  347. Verifier CVerifier = new Verifier(); // 서명검증을 위한 클래스
  348. //String sSignPwd = Startup.conf.getString("servercert.pwd");
  349. String sSignPwd = WAFConfig.get("waf.key.pwd.old");
  350. WAFLogger.debug("sSignPwd["+sSignPwd+"]");
  351. // 개인키 추출
  352. nRet = CPrivateKey.DecryptPriKey(sSignPwd, Prifilebuf, nPrilen);
  353. if (nRet != 0)
  354. {
  355. WAFLogger.debug("에러내용 : " + CPrivateKey.errmessage);
  356. WAFLogger.debug("에러코드 : " + CPrivateKey.errcode);
  357. sOrgData = "";
  358. }
  359. // 서명값 base64 디코딩
  360. nRet = CBase64.Decode(sSignData.getBytes(), sSignData.getBytes().length);
  361. if (nRet != 0)
  362. {
  363. WAFLogger.debug("base64디코드 에러내용(서명값) : " + CBase64.errmessage);
  364. WAFLogger.debug("base64디코드 에러코드 : " + CBase64.errcode);
  365. sOrgData = "";
  366. }
  367. // 전자서명 검증
  368. nRet=CVerifier.VerSignedData(CBase64.contentbuf, CBase64.contentlen);
  369. if(nRet != 0)
  370. {
  371. WAFLogger.debug("전자서명 검증 결과 : 실패") ;
  372. WAFLogger.debug("에러내용 : " + CVerifier.errmessage);
  373. WAFLogger.debug("에러코드 : " + CVerifier.errcode);
  374. sOrgData = "";
  375. }
  376. // 원문 암호화값 base64 디코딩
  377. nRet = CBase64.Decode(CVerifier.contentbuf, CVerifier.contentlen);
  378. if (nRet != 0)
  379. {
  380. WAFLogger.debug("base64디코드 에러내용(원문 암호화값) : " + CBase64.errmessage);
  381. WAFLogger.debug("base64디코드 에러코드 : " + CBase64.errcode);
  382. sOrgData = "";
  383. }
  384. //인증서 복호화
  385. nRet = decrypt.DecEnvelopedData(CPrivateKey.prikeybuf, CPrivateKey.prikeylen, Certfilebuf, nCertlen, CBase64.contentbuf,
  386. CBase64.contentlen);
  387. if (nRet != 0)
  388. {
  389. WAFLogger.debug("복호화 에러내용 : " + decrypt.errmessage);
  390. WAFLogger.debug("복호화 에러코드 : " + decrypt.errcode);
  391. sOrgData = "";
  392. }else{
  393. // sOrgData = new String(decrypt.contentbuf , "KSC5601");
  394. // sOrgData = URLDecoder.decode(sOrgData);
  395. try{
  396. sOrgData = new String(decrypt.contentbuf , "KSC5601");
  397. System.out.println("=============================================");
  398. System.out.println(sOrgData);
  399. System.out.println("=============================================");
  400. sOrgData = URLDecoder.decode(sOrgData);
  401. } catch( Exception e){
  402. sOrgData = new String(decrypt.contentbuf , "KSC5601");
  403. }
  404. }
  405. } catch (FileNotFoundException e) {
  406. WAFLogger.error("[ERROR Config.decryptData()] :" + e.toString());
  407. throw new FileNotFoundException("[ERROR Config.decryptData()] :" + e.toString());
  408. } catch (IOException e) {
  409. WAFLogger.error("[ERROR Config.decryptData()] :" + e.toString());
  410. throw new IOException("[ERROR Config.decryptData()] :" + e.toString());
  411. }
  412. return sOrgData;
  413. }
  414. /**
  415. * 원문데이타 넣기
  416. * @param verifier
  417. */
  418. public void setOrgData(Verifier verifier)
  419. {
  420. try {
  421. this.sOrgData = new String(verifier.contentbuf, "KSC5601");
  422. } catch (UnsupportedEncodingException e) {
  423. // TODO Auto-generated catch block
  424. e.printStackTrace();
  425. }
  426. }
  427. /**
  428. * 원문데이타 가져오기
  429. * @return
  430. */
  431. public String getOrgData()
  432. {
  433. return this.sOrgData;
  434. }
  435. /**
  436. * DN값 가져오기
  437. * @param verifier
  438. */
  439. public void setDn(Certificate certificate)
  440. {
  441. this.sDn = certificate.subject;
  442. }
  443. /**
  444. * DN값 가져오기
  445. * @return
  446. */
  447. public String getDn()
  448. {
  449. return this.sDn;
  450. }
  451. /**
  452. * 서버 인증서 서명
  453. * @return
  454. */
  455. public String signCrosscert(String contHash) throws Exception {
  456. int nPrilen=0, nCertlen=0, nRet;
  457. InputStream inPri=null;
  458. InputStream inCert=null;
  459. //OutputStream out=null;
  460. byte[] Prifilebuf;
  461. byte[] Certfilebuf;
  462. Properties props = System.getProperties(); // get list of properties
  463. String file_separator = (String)(props.get("file.separator"));
  464. String current_dir = "";
  465. String CertPath = "";
  466. String Full_path = WAFConfig.get("waf.key.file.path"); //"D:\\project\\etec\\"; //storage.request.getRealPath(storage.request.getServletPath());
  467. WAFLogger.debug("키저장소 : " + Full_path + "<br>");
  468. /*
  469. if (file_separator.equals("\\"))
  470. {
  471. current_dir = Full_path.substring(0,Full_path.lastIndexOf("\\")+1);
  472. CertPath = current_dir;
  473. }
  474. else
  475. {
  476. current_dir = Full_path.substring(0,Full_path.lastIndexOf("/")+1);
  477. CertPath = current_dir ;
  478. }
  479. */
  480. CertPath = Full_path;
  481. //current_dir = request.getServletPath().substring(0,request.getServletPath().lastIndexOf("/")+1);
  482. String SignedData = ""; //전자서명값
  483. String sInput = contHash;
  484. WAFLogger.debug("키저장소 : " + current_dir + "<br>");
  485. WAFLogger.debug("원문길이 : " + sInput.length() + "<br>");
  486. try
  487. {
  488. inPri = new FileInputStream(new File(CertPath + "signPri.key"));
  489. inCert = new FileInputStream(new File(CertPath +"signCert.der"));
  490. }
  491. catch (FileNotFoundException e)
  492. {
  493. WAFLogger.error(e);
  494. return "FAIL";
  495. }
  496. catch (IOException e)
  497. {
  498. WAFLogger.error(e);
  499. return "FAIL";
  500. }
  501. try
  502. {
  503. nPrilen=inPri.available();
  504. Prifilebuf=new byte[nPrilen];
  505. nRet=inPri.read(Prifilebuf);
  506. System.out.print(nRet);
  507. // 개인키 추출
  508. PrivateKey privateKey = new PrivateKey();
  509. nRet=privateKey.DecryptPriKey(WAFConfig.get("waf.key.pwd"), Prifilebuf, nPrilen);
  510. if (nRet != 0)
  511. {
  512. System.out.print("에러메시지 : " + privateKey.errmessage + "<br>");
  513. return privateKey.errmessage;
  514. }
  515. else
  516. {
  517. WAFLogger.debug("개인키 길이 : " + privateKey.prikeylen + "<br>");
  518. //OutputStream out1 = null;
  519. //out1 = new FileOutputStream("C:\\pri.key.pri", true);
  520. //out1.write(privateKey.prikeybuf);
  521. //out1.close();
  522. nCertlen=inCert.available();
  523. Certfilebuf = new byte[nCertlen];
  524. nRet=inCert.read(Certfilebuf);
  525. // 전자서명
  526. Signer signer = new Signer();
  527. nRet=signer.GetSignedData(privateKey.prikeybuf, privateKey.prikeylen, Certfilebuf, nCertlen, sInput.getBytes("KSC5601"), sInput.getBytes("KSC5601").length);
  528. if (nRet != 0)
  529. {
  530. System.out.print("에러메시지 : " + signer.errmessage + "<br>");
  531. return signer.errmessage;
  532. }
  533. WAFLogger.debug("전자서명 성공(PKCS#7)<br>");
  534. WAFLogger.debug("전자서명(바이너리) 길이 : " + signer.signedlen + "<br>");
  535. // 바이너리 테이타 base64인코딩
  536. Base64 CBase64 = new Base64();
  537. //바이트 배열 //바이트 배열길이
  538. nRet = CBase64.Encode(signer.signedbuf, signer.signedlen);
  539. if(nRet==0)
  540. {
  541. WAFLogger.debug("서명값 Base64 Encode 결과 : 성공<br>") ;
  542. SignedData = new String(CBase64.contentbuf);
  543. WAFLogger.debug("서명값 Base64 Decode 값 : " + SignedData + "<br>") ;
  544. }
  545. else
  546. {
  547. WAFLogger.debug("서명값 Base64 Decode 결과 : 실패<br>") ;
  548. WAFLogger.debug("에러내용 : " + signer.errmessage + "<br>");
  549. WAFLogger.debug("에러코드 : " + CBase64.errcode + "<br>");
  550. }
  551. }
  552. return SignedData;
  553. }
  554. catch(IOException e1)
  555. {
  556. WAFLogger.error(e1);
  557. WAFLogger.debug("Exception : " + e1.getMessage());
  558. throw e1;
  559. }
  560. }
  561. }