eGovFrame GPKI 라이브러리 미발급 상태에서 개발 진행시
JSP & Spring 2015. 6. 23. 03:33pom.xml 파일에 주석처리
(pom.xml 파일 참조 : GPKI 관련 dependency 2종)
<!-- GPKI인증서 로그인처리 라이브러리 -->
<dependency>
<groupId>kr.go.gpki</groupId>
<artifactId>gpkisecureweb</artifactId>
<version>1.0.4.9</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gpkisecureweb-1.0.4.9.jar</systemPath>
</dependency>
<dependency>
<groupId>kr.go.gpki</groupId>
<artifactId>libgpkiapi_jni</artifactId>
<version>1.4.0.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/libgpkiapi_jni-1.4.0.0.jar</systemPath>
</dependency>
관련 파일 삭제
GPKI 인증서 관련 JAVA 파일
src/main/java/egovframework/com/sec/pki/service/impl/EgovGPKIServiceImpl.java src/main/java/egovframework/com/sec/pki/web/EgovGPKITestController.java(설명에 있으나 찾을 수 없음) src/main/java/egovframework/com/utl/sec/service/EgovCertInfoUtil.java src/main/java/egovframework/com/utl/sec/web/EgovCertLoginController.java
파일 소스 - ver3.2
src/main/java/egovframework/com/sec/pki/service/impl/EgovGPKIServiceImpl.java
package egovframework.com.sec.pki.service.impl;
import java.util.Enumeration;
import egovframework.com.cmm.service.EgovProperties;
import egovframework.com.sec.pki.service.EgovGPKIService;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import netscape.ldap.LDAPConnection;
import netscape.ldap.LDAPEntry;
import netscape.ldap.LDAPException;
import netscape.ldap.LDAPSearchConstraints;
import netscape.ldap.LDAPSearchResults;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.gpki.gpkiapi_jni;
/**
* GPKI(Goverment Public Key Infrastructure)를 위한 서비스 구현 클래스
* @author 공통컴포넌트개발팀 한성곤
* @since 2009.06.04
* @version 1.0
* @see
*
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2009.6.4 한성곤 최초 생성
*
* </pre>
*/
@Service("EgovGPKIService")
public class EgovGPKIServiceImpl extends EgovAbstractServiceImpl implements EgovGPKIService {
/** GPKI API JNI */
private gpkiapi_jni gpkiAPI = null;
/** 속성 파일 정보 */
private String config = null;
private static final Logger LOGGER = LoggerFactory.getLogger(EgovGPKIServiceImpl.class);
/*
// PostConstruct 사용 시 startup loading으로 인하여 gpkiapi_jni.dll이 없는 경우 servlet loading되지 못함
// setup(synchronized) 메소드 사용 방식으로 변경
@PostConstruct
public void init() {
//--------------------------------
// 속성 정보 얻기
//--------------------------------
config = EgovProperties.getProperty("Globals.GPKIConfPath");
//--------------------------------
// GPKI JNI 취득
//--------------------------------
// gpkiapki_jni.jar의 경우는 System Classpath에 추가되어야 함..
// 그렇지 않은 경우는 다음과 같은 오류가 reload시 발생됨
// Native Library C:\WINDOWS\system32\gpkiapi_jni.dll already loaded in another classloader
//--------------------------------
gpkiAPI = new gpkiapi_jni();
}
*/
public void setup() {
synchronized (this) {
if (config == null || gpkiAPI == null) {
//--------------------------------
// 속성 정보 얻기
//--------------------------------
config = EgovProperties.getPathProperty("Globals.GPKIConfPath");
//--------------------------------
// GPKI JNI 취득
//--------------------------------
// gpkiapki_jni.jar의 경우는 System Classpath에 추가되어야 함..
// 그렇지 않은 경우는 다음과 같은 오류가 reload시 발생됨
// Native Library C:\WINDOWS\system32\gpkiapi_jni.dll already loaded in another classloader
//--------------------------------
gpkiAPI = new gpkiapi_jni();
}
}
}
/**
* 현 서버의 ID를 얻는다.
*/
public String getServerId() throws Exception {
//-----------------------------------------
// @PostConstruct 미사용 방식
//-----------------------------------------
if (config == null || gpkiAPI == null) {
setup();
}
////---------------------------------------
return EgovProperties.getProperty(config, "gpki.certificate.server");
}
/**
* LDAP에서 인증서 얻기.
*
* @param code
* @return
* @throws Exception
*/
protected byte[] getCertFromLDAP(String code) throws Exception {
//-----------------------------------------
// @PostConstruct 미사용 방식
//-----------------------------------------
if (config == null || gpkiAPI == null) {
setup();
}
////---------------------------------------
//--------------------------------
// LDAP 관련 정보 얻기
//--------------------------------
String serverIp = EgovProperties.getProperty(config, "gpki.ldap.ip");
String serverPort = EgovProperties.getProperty(config, "gpki.ldap.port");
String basedn = EgovProperties.getProperty(config, "gpki.ldap.basedn");
String readEntry = "cn=SVR" + code;
String attribute = EgovProperties.getProperty(config, "gpki.ldap.attribute");
String pwd = null;
//--------------------------------
// LDAP 연결
//--------------------------------
byte[] cert = null;
LDAPEntry entry = null;
Enumeration> enumerator = null;
LDAPSearchConstraints cons = null;
LDAPSearchResults res = null;
LDAPConnection ld = null;
LDAPSearchConstraints constraints = null;
try {
ld = new LDAPConnection();
constraints = new LDAPSearchConstraints();
constraints.setTimeLimit(5000);
ld.setConnectTimeout(3);
ld.setConstraints(constraints);
ld.connect(serverIp, Integer.parseInt(serverPort), basedn, pwd);
cons = ld.getSearchConstraints();
cons.setBatchSize(1);
res = ld.search(basedn, 2, readEntry, null, false, cons);
entry = (LDAPEntry) res.nextElement();
enumerator = entry.getAttribute(attribute).getByteValues();
cert = (byte[]) enumerator.nextElement();
} finally {
if (ld != null) {
try {
ld.disconnect();
} catch (LDAPException ignore) {
LOGGER.debug("Ignored Exception (LDAP Disconnect)", ignore);
}
}
}
return cert;
}
/**
* 데이터 암호화 처리.
*
* @see egovframework.com.sec.pki.service.EgovGPKIService#encrypt(byte[], java.lang.String)
*/
public byte[] encrypt(byte[] message, String target) throws Exception {
//-----------------------------------------
// @PostConstruct 미사용 방식
//-----------------------------------------
if (config == null || gpkiAPI == null) {
setup();
}
////---------------------------------------
byte[] cert = getCertFromLDAP(target);
byte[] encryptedData = null;
try {
gpkiAPI.API_Init(".");
int returnCode = 0;
returnCode = gpkiAPI.API_SetOption(gpkiapi_jni.API_OPT_RSA_ENC_V20);
if (returnCode != 0) {
throw new IllegalAccessException((new StringBuffer(String.valueOf(returnCode))).toString() + " : " + gpkiAPI.sDetailErrorString);
}
returnCode = gpkiAPI.CMS_MakeEnvelopedData(cert, message, gpkiapi_jni.SYM_ALG_SEED_CBC);
if (returnCode != 0) {
throw new IllegalAccessException((new StringBuffer(String.valueOf(returnCode))).toString() + " : " + gpkiAPI.sDetailErrorString);
}
encryptedData = gpkiAPI.baReturnArray;
} finally {
if (gpkiAPI != null) {
gpkiAPI.API_Finish();
}
}
return encryptedData;
}
/**
* 복호화 처리.
*
* @see egovframework.com.sec.pki.service.EgovGPKIService#decrypt(byte[])
*/
public byte[] decrypt(byte[] data) throws Exception {
//-----------------------------------------
// @PostConstruct 미사용 방식
//-----------------------------------------
if (config == null || gpkiAPI == null) {
setup();
}
////---------------------------------------
//----------------------------------
// 설정 정보 (암호화용 인증서 정보 필요)
//----------------------------------
String path = EgovProperties.getProperty(config, "gpki.certificate.path");
String certForEnvFile = path + "/SVR" + EgovProperties.getProperty(config, "gpki.certificate.server") + "_env.cer";
String keyForEnvFile = path + "/SVR" + EgovProperties.getProperty(config, "gpki.certificate.server") + "_env.key";
String pinForEnv = EgovProperties.getProperty(config, "gpki.privatekey.password");
//----------------------------------
// 복호화 처리
//----------------------------------
byte[] plainData = null;
try {
gpkiAPI.API_Init(".");
int returnCode = 0;
byte[] baPriKey = null;
byte[] certificate = null;
returnCode = gpkiAPI.STORAGE_ReadPriKey(gpkiapi_jni.MEDIA_TYPE_FILE_PATH, keyForEnvFile, pinForEnv, gpkiapi_jni.DATA_TYPE_OTHER);
if (returnCode != 0) {
throw new IllegalAccessException((new StringBuffer(String.valueOf(returnCode))).toString() + " : " + gpkiAPI.sDetailErrorString);
}
baPriKey = gpkiAPI.baReturnArray;
returnCode = gpkiAPI.STORAGE_ReadCert(gpkiapi_jni.MEDIA_TYPE_FILE_PATH, certForEnvFile, gpkiapi_jni.DATA_TYPE_OTHER);
if (returnCode != 0) {
throw new IllegalAccessException((new StringBuffer(String.valueOf(returnCode))).toString() + " : " + gpkiAPI.sDetailErrorString);
}
certificate = gpkiAPI.baReturnArray;
returnCode = gpkiAPI.CMS_ProcessEnvelopedData(certificate, baPriKey, data);
if (returnCode != 0) {
throw new IllegalAccessException((new StringBuffer(String.valueOf(returnCode))).toString() + " : " + gpkiAPI.sDetailErrorString);
}
plainData = gpkiAPI.baReturnArray;
} finally {
if (gpkiAPI != null) {
gpkiAPI.API_Finish();
}
}
return plainData;
}
/**
* 전자서명 처리.
*
* @see egovframework.com.sec.pki.service.EgovGPKIService#sign(byte[])
*/
public byte[] sign(byte[] message) throws Exception {
//-----------------------------------------
// @PostConstruct 미사용 방식
//-----------------------------------------
if (config == null || gpkiAPI == null) {
setup();
}
////---------------------------------------
//----------------------------------
// 설정 정보 (전자서명용 인증서 정보 필요)
//----------------------------------
String path = EgovProperties.getProperty(config, "gpki.certificate.path");
String certForSignFile = path + "/SVR" + EgovProperties.getProperty(config, "gpki.certificate.server") + "_sig.cer";
String keyForSignFile = path + "/SVR" + EgovProperties.getProperty(config, "gpki.certificate.server") + "_sig.key";
String pinForSign = EgovProperties.getProperty(config, "gpki.privatekey.password");
//----------------------------------
// 전자서명 처리
//----------------------------------
byte[] signedData = null;
byte[] certificate = null;
byte[] key = null;
try {
gpkiAPI.API_Init(".");
int returnCode = 0;
returnCode = gpkiAPI.STORAGE_ReadCert(gpkiapi_jni.MEDIA_TYPE_FILE_PATH, certForSignFile, gpkiapi_jni.DATA_TYPE_OTHER);
if (returnCode != 0) {
throw new IllegalAccessException((new StringBuffer(String.valueOf(returnCode))).toString() + " : " + gpkiAPI.sDetailErrorString);
}
certificate = gpkiAPI.baReturnArray;
returnCode = gpkiAPI.STORAGE_ReadPriKey(gpkiapi_jni.MEDIA_TYPE_FILE_PATH, keyForSignFile, pinForSign, gpkiapi_jni.DATA_TYPE_OTHER);
if (returnCode != 0) {
throw new IllegalAccessException((new StringBuffer(String.valueOf(returnCode))).toString() + " : " + gpkiAPI.sDetailErrorString);
}
key = gpkiAPI.baReturnArray;
returnCode = gpkiAPI.CMS_MakeSignedData(certificate, key, message, "");
if (returnCode != 0) {
throw new IllegalAccessException((new StringBuffer(String.valueOf(returnCode))).toString() + " : " + gpkiAPI.sDetailErrorString);
}
signedData = gpkiAPI.baReturnArray;
} finally {
if (gpkiAPI != null) {
gpkiAPI.API_Finish();
}
}
return signedData;
}
/**
* 전자서명 검증.
*
* @see egovframework.com.sec.pki.service.EgovGPKIService#verifySign(byte[])
*/
public byte[] verifySign(byte[] signedData) throws Exception {
//-----------------------------------------
// @PostConstruct 미사용 방식
//-----------------------------------------
if (config == null || gpkiAPI == null) {
setup();
}
////---------------------------------------
//----------------------------------
// 전자서명 확인
//----------------------------------
byte[] plainData = null;
try {
gpkiAPI.API_Init(".");
int returnCode = 0;
returnCode = gpkiAPI.CMS_ProcessSignedData(signedData);
if (returnCode != 0) {
throw new IllegalAccessException((new StringBuffer(String.valueOf(returnCode))).toString() + " : " + gpkiAPI.sDetailErrorString);
}
plainData = gpkiAPI.baData;
} finally {
if (gpkiAPI != null) {
gpkiAPI.API_Finish();
}
}
return plainData;
}
/**
* BASE64 encoding 처리.
*
* @see egovframework.com.sec.pki.service.EgovGPKIService#getBASE64String(byte[])
*/
public String getBASE64String(byte[] data) throws Exception {
return new String(Base64.encodeBase64(data));
}
/**
* BASE64 decoding 처리.
*
* @see egovframework.com.sec.pki.service.EgovGPKIService#getDataFromBASE64(java.lang.String)
*/
public byte[] getDataFromBASE64(String base64) throws Exception {
return Base64.decodeBase64(base64.getBytes());
}
}
src/main/java/egovframework/com/sec/pki/web/EgovGPKITestController.java
No search file!
src/main/java/egovframework/com/utl/sec/service/EgovCertInfoUtil.java
package egovframework.com.utl.sec.service;
import javax.servlet.http.HttpServletRequest;
import com.dsjdf.jdf.Config;
import com.dsjdf.jdf.Configuration;
import com.dsjdf.jdf.ConfigurationException;
import com.gpki.gpkiapi.cert.X509Certificate;
import com.gpki.gpkiapi.exception.GpkiApiException;
import com.gpki.gpkiapi.storage.Disk;
import com.gpki.gpkiapi.util.Base64;
import com.gpki.servlet.GPKIHttpServletRequest;
/**
* GPKISecureWeb 인증서 로그인 서비스 유틸
* @author 공통컴포넌트개발팀 한성곤
* @since 2009.08.06
* @version 1.0
* @see
*
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2009.08.06 한성곤 최초 생성
*
* </pre>
*/
public class EgovCertInfoUtil {
/**
* 서버인증서에 대한 Base64 정보를 얻는다.
*
* @return
* @throws ConfigurationException
* @throws GpkiApiException
*/
public static String getBase64ServerCert() throws ConfigurationException, GpkiApiException {
/*
* Configuration를 사용하기 위해서는 다음과 같은 시스템 변수 지정이 필요함
*
* -Dcom.dsjdf.config.file="/product/jeus/egovProps/gpkisecureweb/conf/dsjdf.properties"
*/
Config dsjdf = new Configuration();
String certPath = dsjdf.get("GPKISecureWeb.CertFilePathName");
X509Certificate x509Cert = null;
byte[] cert = null;
String base64cert = null;
x509Cert = Disk.readCert(certPath);
cert = x509Cert.getCert();
Base64 base64 = new Base64();
base64cert = base64.encode(cert);
return base64cert;
}
/**
* 인증서에 대한 정보를 제공한다.
*
* @param request
* @return
* @throws Exception
*/
public static CertInfoVO getCertInfo(HttpServletRequest request) throws Exception {
CertInfoVO certInfo = new CertInfoVO();
GPKIHttpServletRequest gpkirequest = null;
//System.out.println(request.getParameter("encryptedData"));
gpkirequest = new GPKIHttpServletRequest(request);
X509Certificate cert = gpkirequest.getSignerCert();
certInfo.setSubjectDn(cert.getSubjectDN());
certInfo.setIssuerDn(cert.getIssuerDN());
return certInfo;
}
}
src/main/java/egovframework/com/utl/sec/web/EgovCertLoginController.java
package egovframework.com.utl.sec.web;
import egovframework.com.utl.sec.service.EgovCertInfoUtil;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
/**
* GPKISecureWeb 인증서 로그인 Controller
* @author 공통컴포넌트개발팀 한성곤
* @since 2009.08.06
* @version 1.0
* @see
*
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2009.08.06 한성곤 최초 생성
*
* </pre>
*/
@Controller
public class EgovCertLoginController {
/**
* 인증서 로그인에 관련된 환경변수를 설정한다.
*
* @param type
* @param model
* @return
* @throws Exception
*/
@RequestMapping("/utl/sec/certVar.do")
public String var(@RequestParam(value="type", required=false) String type, Model model) throws Exception {
String typeInfo = type;
//------------------------------------------------------------
// 서버 인증서 정보 처리
//------------------------------------------------------------
String serverCert = EgovCertInfoUtil.getBase64ServerCert();
model.addAttribute("serverCert", serverCert);
//------------------------------------------------------------
// install 후 이동될 페이지 지정 (프로젝트에 맞게 수정 필요)
//-----------------------------------------------------------
if (typeInfo == null) {
typeInfo = "";
}
String startPage = null;
if (typeInfo.equalsIgnoreCase("login")) {
startPage = "/utl/sec/certLogin.do";
} else if (typeInfo.equalsIgnoreCase("regist")) {
startPage = "/utl/sec/certInfoPopup.do";
} else {
startPage = "/utl/sec/certLogin.do";
}
model.addAttribute("startPage", startPage);
return "egovframework/com/utl/sec/EgovCertVar";
}
/**
* 인증서 관련 설치 페이지를 표시한다.
*
* @param type
* @param model
* @return
* @throws Exception
*/
@RequestMapping("/utl/sec/certInstall.do")
public String certInstall(@RequestParam(value="type", required=false) String type, Model model) throws Exception {
String typeInfo = type;
//------------------------------------------------------------
// install 후 이동될 페이지 지정 (프로젝트에 맞게 수정 필요)
//-----------------------------------------------------------
if (typeInfo == null || typeInfo.equals("")) {
typeInfo = "login";
}
model.addAttribute("type", typeInfo);
return "egovframework/com/utl/sec/EgovCertInstall";
}
/**
* 인증서 로그인 관련 설치 정보를 제공하는 설정 페이지를 표시한다.
*
* @return
* @throws Exception
*/
@RequestMapping("/utl/sec/certSetup.do")
public String certSetup() throws Exception {
return "egovframework/com/utl/sec/EgovCertSetup";
}
/**
* 인증서 로그인 관련 오류메시지 페이지를 표시한다.
*
* @param errMsg
* @param model
* @return
* @throws Exception
*/
@RequestMapping("/utl/sec/certGPKIError.do")
public String certGPKIError(@RequestParam("errmsg") String errMsg, Model model) throws Exception {
model.addAttribute("errmsg", errMsg);
return "egovframework/com/utl/sec/EgovCertGPKIError";
}
/**
* 인증서 DN 등록을 위한 팝업 페이지를 표시한다.
*
* @param model
* @return
* @throws Exception
*/
@RequestMapping(value="/utl/sec/certInfoPopup.do")
public String certInfoPopup(Model model) throws Exception {
return "egovframework/com/utl/sec/EgovCertInfoPopup";
}
/**
* 인증서 로그인 페이지(테스트)를 표시한다.
*
* @return
* @throws Exception
*/
@RequestMapping(value="/utl/sec/certLogin.do", method=RequestMethod.GET)
public String certLogin() throws Exception {
return "egovframework/com/utl/sec/EgovCertLogin";
}
/**
* 인증서 로그인 확인 페이지(테스트)를 표시한다.
*
* @param request
* @param model
* @return
* @throws Exception
*/
@RequestMapping(value="/utl/sec/certLogin.do", method=RequestMethod.POST)
public String certLoginConfirm(HttpServletRequest request, Model model) throws Exception {
// 인증서 정보
model.addAttribute("certInfo", EgovCertInfoUtil.getCertInfo(request));
return "egovframework/com/utl/sec/EgovCertLoginConfirm";
}
/**
* 인증서 등록을 위한 팝업 페이지(테스트)를 표시한다.
*
* @return
* @throws Exception
*/
@RequestMapping("/utl/sec/certLoginInfo.do")
public String certLoginPopup() throws Exception {
return "egovframework/com/utl/sec/EgovCertLoginInfo";
}
}
'JSP & Spring' 카테고리의 다른 글
| eGovFrame 테이블 정의서 (0) | 2015.06.23 |
|---|---|
| eGovFrame 3.2 쿼리 정리 (0) | 2015.06.23 |
| eGovFrame 아이디 제너레이트 설정 파일 (0) | 2015.06.23 |
| eGovFrame 실행전 처리할 에러 (0) | 2015.06.23 |
| eGovFrame 공통 컴포넌트 sql 수정 (0) | 2015.06.23 |
