<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="com.dreamsecurity.magicline.JCaosCheckCert"%> <%@ page import="com.dreamsecurity.jcaos.x509.X509Certificate"%> <%@ page import="com.dreamsecurity.jcaos.x509.X509GeneralName"%> <%@ page import="com.dreamsecurity.jcaos.x509.X509OtherName"%> <%@ page import="com.dreamsecurity.jcaos.util.encoders.Base64"%> <%@ page import="com.dreamsecurity.jcaos.util.encoders.Hex"%> <%@ page import="com.dreamsecurity.jcaos.vid.VID"%> <%@ page import="com.dreamsecurity.jcaos.cms.SignedData"%> <%@ page import="com.dreamsecurity.jcaos.cms.SignerInfo"%> <%@ page import="com.dreamsecurity.magice2e.MagicE2E" %> <%@ page import="java.math.BigInteger"%> <%@ page import="java.net.URLDecoder"%> <%@ page import="java.util.Properties"%> <%@ page import="java.util.ArrayList"%> <%@ page import="java.util.HashMap" %> <%@ page import="java.text.SimpleDateFormat" %> <% // 18.07.10 : 결과 확인을 위해 서명 원문 데이터르 가져옴 String signOrigin = request.getParameter("signOrigin"); if(signOrigin != null){ signOrigin = new String(signOrigin.getBytes("8859_1"), "utf-8"); } String sSignData = URLDecoder.decode(request.getParameter("sign"), "utf-8"); String sVIDRandom = URLDecoder.decode(request.getParameter("vidRandom"), "utf-8"); String sResult = ""; String sSourceText = ""; String textCheck = ""; String sSignerDn = ""; String sIssuerDn = ""; String sSerialNumber = ""; String sCertificatePolicies = ""; String sPolicy = ""; String sVidCheck = ""; String sIdentifyData = ""; String sSignDate = ""; sResult = sResult+"- SignData ["+sSignData+"]
\n"+"- VIDData ["+sVIDRandom+"]
\n"; // 서명 데이타가 있을때 서명 검증 if (sSignData != null && sSignData.length() > 0){ try { // 개인정보 복호화 시작 MagicE2E ml = (MagicE2E)session.getAttribute("Magie2e"); String sEncData = request.getParameter("encData").replaceAll("&quot;", "\"").replaceAll(""", "\""); // 암호화 데이터 HashMap map = new HashMap(); StringBuffer sbPlain = new StringBuffer(); // 출력 버퍼 System.out.println("- Encrypt Result ["+ sEncData +"]"); // 암호 스트링이 있을때만 복호화 if (sEncData != null && sEncData.length() > 0 && ml != null){ int sDecryptResult = ml.decrypt(sEncData, sbPlain); // 복호화 상태값(0일 경우 정상) System.out.println("- sDecryptResult ["+ sDecryptResult +"]"); System.out.println("- Decrypt Result ["+ java.net.URLDecoder.decode((String)sbPlain.toString(),"utf-8") +"]"); // 복호화 데이터 String[] parts = java.net.URLDecoder.decode((String)sbPlain.toString(),"utf-8").split("&"); if( parts.length > 1){ for (String pair : parts) { String[] kv = pair.split("="); map.put(kv[0], kv[1]); } }else{ String temp = java.net.URLDecoder.decode((String)sbPlain.toString(),"utf-8"); String[] kv = temp.split("="); map.put( kv[0], kv[1] ); } } // 개인정보 복호화 끝 JCaosCheckCert jcaosCheck = new JCaosCheckCert(); // 서버가 알고 잇는 주민등록 번호를 등록한다 jcaosCheck.setVIDRandom(map.get("encIdn"), sVIDRandom); sResult = sResult+"
\n- 인증서 검증 시작
\n"; // 서명 검증 // 검증후 원문이 리턴됨 int iResult = jcaosCheck.checkCert(sSignData); /* - JCaosCheckCert.checkCert 의 에러코드는 하기와 같습니다. JCaosCheckCert.STAT_OK // 성공 JCaosCheckCert.STAT_ERR_WRONGCERT // 정상적인 인증서가 아님 JCaosCheckCert.STAT_ERR_ETC // 기타 오류 JCaosCheckCert.STAT_ERR_VerifyException // 서명 검증 실패 JCaosCheckCert.STAT_ERR_CertificateNotYetValidException // 인증서 유효기간 검증 오류 JCaosCheckCert.STAT_ERR_CertificateExpiredException // 인증서 만료 JCaosCheckCert.STAT_ERR_ObtainCertPathException // 인증서 경로 구축 실패 JCaosCheckCert.STAT_ERR_BuildCertPathException // 인증서 경로 구축 실패 JCaosCheckCert.STAT_ERR_TrustRootException // 신뢰할수 없는 최상위 인증서 JCaosCheckCert.STAT_ERR_ValidateCertPathException // 인증서 경로 검증 실패 JCaosCheckCert.STAT_ERR_RevokedCertException // 폐지된 인증서 JCaosCheckCert.STAT_ERR_RevocationCheckException // CRL 검증 실패 JCaosCheckCert.STAT_ERR_NotExistSignerCertException // 서명자 인증서 누락 JCaosCheckCert.STAT_ERR_IOException // IOException JCaosCheckCert.STAT_ERR_FileNotFoundException // FileNotFoundException JCaosCheckCert.STAT_ERR_NoSuchAlgorithmException // NoSuchAlgorithmException JCaosCheckCert.STAT_ERR_NoSuchProviderException // NoSuchProviderException JCaosCheckCert.STAT_ERR_ParsingException // ParsingException JCaosCheckCert.STAT_ERR_IdentifyException // 본인확인 실패 */ if( iResult == 0 ){ sResult = sResult+ "- 인증서 검증 성공
\n"; }else if( iResult == 3000 ){ sResult = sResult+ "- 인증서 검증 하지않음
\n"; }else if ( iResult != 0 ){ // 오류 발생시 오류를 구분 String sCertResult = null; switch(iResult){ case JCaosCheckCert.STAT_ERR_WRONGCERT : // 정상적인 인증서가 아님 sCertResult = "서명에 사용된 인증서가 정상적인 인증서가 아닙니다."; break; case JCaosCheckCert.STAT_ERR_RevocationCheckException : // CRL 검증 실패 case JCaosCheckCert.STAT_ERR_NotExistSignerCertException : // 서명자 인증서 누락 case JCaosCheckCert.STAT_ERR_IOException : // IOException case JCaosCheckCert.STAT_ERR_FileNotFoundException : // FileNotFoundException case JCaosCheckCert.STAT_ERR_ETC : // 기타 오류 case JCaosCheckCert.STAT_ERR_BuildCertPathException : // 인증서 경로 구축 실패 case JCaosCheckCert.STAT_ERR_ObtainCertPathException : // 인증서 경로 구축 실패 case JCaosCheckCert.STAT_ERR_ValidateCertPathException : // 인증서 경로 검증 실패 case JCaosCheckCert.STAT_ERR_TrustRootException : // 신뢰할수 없는 최상위 인증서 sCertResult = "서명 인증서 검증 오류 ["+iResult+"]."; break; case JCaosCheckCert.STAT_ERR_VerifyException : // 서명 검증 실패 sCertResult = "서명 검증 실패"; break; case JCaosCheckCert.STAT_ERR_CertificateNotYetValidException : // 인증서 유효기간 검증 오류 sCertResult = "서명 인증서 유효기간 검증 오류"; break; case JCaosCheckCert.STAT_ERR_CertificateExpiredException : // 인증서 만료 sCertResult = "만료된 인증서 "; break; case JCaosCheckCert.STAT_ERR_RevokedCertException : // 폐지된 인증서 sCertResult = "폐지된 인증서"; break; default: sCertResult = "기타오류 ["+iResult+"]"; break; } sResult = "
\n- "+sCertResult+" \n[" + jcaosCheck.getLastErr() +"]
\n\n"; } if( iResult == 0 || iResult == 3000 ){ // 서명에 사용된 인증서를 가져온다 X509Certificate cert = jcaosCheck.getUserCert(); String signerDN = cert.getSubjectDN().getName(); // 인증서 DN BigInteger serialNumber = cert.getSerialNumber(); // 인증서 시리얼 // 본인확인 switch (jcaosCheck.getVIDCheck()){ case JCaosCheckCert.STAT_VID_NOTCHECK: sResult = sResult+"- 본인 확인 하지 않음
\n"; break; case JCaosCheckCert.STAT_VID_CHECK_OK: sResult = sResult+"- 본인 확인 성공
\n"; break; case JCaosCheckCert.STAT_VID_CHECK_FAIL: sResult = sResult+"- 본인 확인 실패
\n"; break; } // 서명 값 (Base64) String base64SignData = sSignData; // 서명 원문을 가져온다 //sSourceText = jcaosCheck.getSrcStr("UTF-8"); // 원문의 인코딩을 알고 있어어야 한다 생략시 UTF-8 로 인코딩한다 //byte[] textByte = Base64.decode(textCheck); sSourceText = new String( jcaosCheck.getSrcByte(), "utf-8" ); //System.out.println("[TRACE] sSourceText :: " + sSourceText); // URL 형식 문자열을 잘라서 서명원문을 가져온다 // ex) sign=&signOrigin=1234&vidRandom=&vidType=client&encData=&signData=1234&idn= //String sSourceTextVal = sSourceText.substring(sSourceText.indexOf("signData=")); //sSourceText = sSourceTextVal.substring(sSourceTextVal.indexOf("=")+1, sSourceTextVal.indexOf("&idn=")); //byte[] textByte = Base64.decode(textCheck); //sSourceText = new String(textByte, "utf-8"); Properties props = new Properties(); props.load(getServletContext().getResourceAsStream("/MagicLine4Web/ML4Web/js/message/Messages.properties")); sPolicy = props.getProperty("OID_" + cert.getCertificatePolicies().getPolicyIdentifier(0).replace(".", "_")); ArrayList generalNames = cert.getSubjectAlternativeName(); if (generalNames != null && generalNames.size() > 0) { X509GeneralName genName; for (int i=0; i\n- 사용자 DN ["+signerDN+"]
\n"+"
\n"; sResult = sResult+ "- 발급자 DN ["+cert.getIssuerDN().getName()+"]
\n"+"
\n"; sResult = sResult+ "- 인증서 SN ["+cert.getSerialNumber().toString(16)+"]
\n"+"
\n"; sResult = sResult+ "- 인증서 정책 ["+cert.getCertificatePolicies().getPolicyIdentifier(0)+"]
\n"+"
\n"; sResult = sResult+ "- 인증서 구분 ["+sPolicy+"]
\n"+"
\n"; sResult = sResult+ "- 본인확인 식별값 ["+sIdentifyData+"]
\n"+"
\n"; } }catch(Exception e){ // 인증서 검증중 오류가 난 경우 // 처리를 편하게 하기 위해 // 상용중에는 사용자의 인증서의 유효성의 문제가 잇는 경우가 대부분 입니다. // e.printStackTrace(); sResult = "서명 검증에 실패 하였습니다.\n [" + e.getMessage()+"]\");"; } }else{ sResult=" - 서명 데이타가 존재하지 않습니다..
\n"; } //out.print(sResult); //System.out.println(sResult); %>

MagicLine Digital Signature Result

Digital Signature Result
 
description : 사용자가 선택한 인증서를 이용하여 원문데이터에 전자서명값을 추출하여 서버에서 전자서명 검증을 실행하며
서버는 사용자 인증서의 유효성 여부를 확인한다.

 

Client Digital Signature Request Data
서명원문 <%=signOrigin%>
서명결과 <%=sSourceText %>
일치여부

 

Client Certificate Information
sResult: <%=sResult%>