var args = new Array();
args[0] = selectCertNum.toString() ;
args[1] = '1';
args[2] = stringToSign;
WizSignPG.doSignature(args, function(result) {
var signedData = result['signedData']; // 서명데이터
}, function(error) {
alert(error['errMsg']); // 에러메시지
});
== getCertificates ==
* 저장된 인증서목록을 가져와 반환한다.
- 파라메터 : N/A \\
- 반환값(해시 테이블) \\
'Certificates' : 인증서 목록
'errMsg' : 에러 발생시 에러메시지
WizSignPG.getCertificates("", function(result) {
var certList = result['Certificates'];
for(var i=0 ; i
인증서 정보 해시테이블
^해시테이블^설명^
|NUM|인증서 번호|
|버전|인증서 버전|
|일련번호|인증서 시리얼번호|
|서명알고리즘|인증서 서명알고리즘|
|발급자|인증서의 발급자 정보|
|효력발생일|인증서의 효력 발생일|
|만료일|인증서 만료일|
|주체자|인증서 주체자 정보|
|공개키알고리즘|인증서 공개키 알고리즘|
|발급자시리얼번호|발급자시리얼번호|
|공개키|공개키값|
|기관키식별자|기관키식별자|
|주체자식별자|주체자식별자|
|정책|정책|
|주체대체이름|주체대체이름|
|CRL분배지점|CRL분배지점|
|기관정보액세스|기관정보액세스(OCSP)|
|키사용|키사용용도|
|서명|인증서 서명값|
== verifyCertPassword ==
* 선택한 인증서의 비밀번호를 검증한다.
- 파라메터 : 인증서 번호, 인증서 비밀번호 \\
- 반환값(해시 테이블) \\
'result' : 인증서 비밀번호 검증결과(성공시 'OK')
'errMsg' : 에러 발생시 에러메시지
var args = new Array();
args[0] = certNum.toString();
args[1] = certPass;
WizSignPG.verifyCertPassword(args, function(result) {
var runResult = result['result'];
if(runResult == 'OK') {
alert('인증서 비밀번호가 일치합니다.');
}
}, function(error) {
alert(error['errMsg']);
});
==== Server Application ====
=== 관련 소스 ===
^유형^대상소스명^비고^
|Controller|egovframework.hyb.add.pki.web.EgovPKIAndroidAPIController.java|NPKIAPI 가이드 프로그램 Controller Class|
|Service|egovframework.hyb.add.pki.service.EgovPKIAndroidAPIService.java|NPKIAPI 가이드 프로그램 Service Class|
|ServiceIimpl|egovframework.hyb.add.pki.service.impl.EgovPKIAndroidAPIServiceImpl.java|NPKIAPI 가이드 프로그램 ServiceImpl Class|
|VO|egovframework.hyb.add.pki.service.PKIAndroidAPIDefaultVO.java|NPKIAPI 가이드 프로그램 VO Class|
|VO|egovframework.hyb.add.pki.service.PKIAndroidAPIVO.java|NPKIAPI 가이드 프로그램 VO Class|
|VO|egovframework.hyb.add.pki.service.PKIAndroidAPIXmlVO.java|NPKIAPI 가이드 프로그램 XML 관련 VO Class|
|DAO|egovframework.hyb.add.pki.service.impl.PKIAndroidAPIDAO.java|NPKIAPI 가이드 프로그램 Dao Class|
|QUERY XML|resources/egovframework/sqlmap/hyb/add/pki/EgovPKIAndroidAPIGuide_SQL_XXX.xml|NPKIAPI 가이드 프로그램 QUERY XML|
|Idgen XML|resources/egovframework/spring/context-idgen.xml|NPKIAPI 가이드 프로그램 Id생성 Idgen XML|
=== 관련 테이블 ===
^테이블명^테이블명(영문)^비고^
|PKI|PKI|인증서 인증 로그 관리|
=== 테이블 명세서 ===
* PKI
^No.^컬럼^컬럼명^타입^길이^Null^KEY^
|1|SN|일련번호|NUMERIC|6|NotNull|pk|
|2|UUID|UUID|VARCHAR|50|NotNull|pk|
|3|DM|DM|VARCHAR|255|Null| |
|4|CRTFC_DT|인증일시|DATE| |Null| |
|5|ENTRPRS_SE_CODE|이메일|DATE| |Null| |
=== ERD ===
{{:egovframework:hyb:guide:ios:erd.jpg|}}
=== 표준 보안 API ===
public String verifyCert(PKIAndroidAPIVO pkiVo) throws Exception {
// API 초기화
GpkiApi.init("C:/libgpkiapi_jni/conf");
String sign;
sign = pkiVo.getSign();
return verify(Base64.decode(sign));
}
private String verify(final byte[] bSignedData) {
String sClientName = "";
try {
// 서명값을 검증
SignedData signedData = null;
signedData = new SignedData();
signedData.verify(bSignedData);
// 서명자의 인증서 검증을 위해서 서버의 서명용 인증서 획득
X509Certificate clientCert = null;
clientCert = signedData.getSignerCert(0);
// 인증서 검증
CertPathValidator certPathValiditor = null;
certPathValiditor = new CertPathValidator("C:/libgpkiapi_jni/conf/gpkiapi.conf");
// 신뢰하는 최상위 인증서 추가
X509Certificate rootCertRsa = null;
rootCertRsa = Disk.readCert("C:/libgpkiapi_jni/conf/root-rsa2.der");
X509Certificate rootCertRsaSha = null;
rootCertRsaSha = Disk.readCert("C:/libgpkiapi_jni/conf/root-rsa-sha2.der");
certPathValiditor.addTrustedRootCert(rootCertRsa);
certPathValiditor.addTrustedRootCert(rootCertRsaSha);
// 클라이언트의 인증서 검증 범위 설정
certPathValiditor.setVerifyRange(CertPathValidator.CERT_VERIFY_FULL_PATH);
// 클라이언트의 인증서 폐지여부 확인 설정 (CRL/ARL 검증 설정함)
certPathValiditor.setRevokationCheck(CertPathValidator.REVOKE_CHECK_ARL | CertPathValidator.REVOKE_CHECK_CRL);
// 인증서 검증 요청
certPathValiditor.validate(CertPathValidator.CERT_SIGN, clientCert);
sClientName = clientCert.getSubjectDN();
} catch (Exception e) {
sClientName = "";
}
return sClientName;
}
===== 환경설정 =====
NPKI 디바이스API 가이드 프로그램에서 제공하는 모바일 디바이스의 NPKI 관련 기능을 활용하기 위하여 필요한 항목 및 그 환경 설정은 다음과 같다.
==== Device Application ====
=== res/xml/config.xml ===
=== res/values/serverinfo.xml ===
http://192.168.100.222:8080/DeviceAPIGuideTotal_Web_V1.7.1
=== AndroidManifest.xml ===
==== Server Application ====
=== pom.xml ===
egovframework.com.cmm.uat
libgpkiapi_jni
1.4.0.0
=== resource/egovframework/sqlmap/sql-map-config_[DB명].xml ===
* 표준 보안 API 설정
^구분^설정방법^
|Class 경로 설정|방법 1. java 옵션 이용 : java -classpath jar_directory\libgpkiapi_jni.jar \\ 방법 2. 환경 변수 등록 : "내컴퓨터->속성->고급->환경변수" 에서 새로 만들기를 클릭하여 classpath 변수를 등록|
{{:egovframework:hyb3.6:guide:add:magicxsign:npkiclasspath.png}}
^구분^설정방법^
|라이브러리 경로 설정|1. JNI를 비롯한 C/C++용 표준보안API와 LDAP 라이브러리가 위치해 있는 경로를 환경 변수에 등록한다. \\ 2. "내컴퓨터->속성->고급->환경변수" 에서 기존 "path" 변수에 "라이브러리가 설치된 디렉토리"를 추가한다.|
{{:egovframework:hyb3.6:guide:add:magicxsign:npkipath.png}}
===== 관련기능 =====
NPKI 디바이스 API 가이드는 크게 ** 모바일 기기 인증서 선택/인증하기 **, ** 인증 로그 정보 보기 ** 기능으로 구성되어있다.
==== 모바일 기기 인증서 선택/인증하기 ====
=== 비즈니스 규칙 ===
디바이스 API를 통해 모바일 기기에 저장된 인증서 리스트를 조회하고, 리스트에서 선택 한 인증서로 인증서 인증을 한다.
=== 관련코드 ===
디바이스 API 내의 인증서 리스트 조회 함수를 사용하는 JavaScript 코드를 통해 인증서 리스트를 조회 하고, 서명 데이터를 만드는 JavaScript 함수를 사용하여 서명 한다.
// 인증서 리스트 조회
function fn_egov_go_certlist() {
console.log('DeviceAPIGuide fn_egov_go_certlist');
WizSignPG.getCertificates(fn_egov_getcertlistSuccess,fn_egov_getcertlistFail);
}
// 인증서 비밀번호 확인
function fn_egov_confirm_password() {
console.log('DeviceAPIGuide fn_egov_confirm_password');
var args = new Array();
args[0] = Number(document.getElementById("xsigncertindex").value) + 1
args[1] = $("#loginPasswd").val();
WizSignPG.verifyCertPassword(args, function(result) {
console.log('DeviceAPIGuide fn_egov_confirm_password Success');
//Certificates
var runResult = result['result'];
var error = result['errMsg'];
if(error!=null){
alert(error);
alert(runResult);
}
if(runResult == 'OK') {
alert('인증서 비밀번호가 일치합니다.');
fn_egov_make_sign();
}
}, function(error) {
console.log('DeviceAPIGuide fn_egov_confirm_password Fail');
alert("Error: \r\n" + error['errMsg']);
});
}
// 인증서 서명
function fn_egov_make_sign()
{
console.log('DeviceAPIGuide fn_egov_make_sign');
var args = new Array();
args[0] = Number(document.getElementById("xsigncertindex").value) + 1
args[1] = $("#loginPasswd").val();
args[2] = "usrId=&password=&name=";
WizSignPG.doSignature(args, fn_egov_makesign_ok, fn_egov_makesign_fail);
}
// 인증서 서명 데이터 서버로 인증 요청
function fn_egov_makesign_ok(arg)
{
console.log('DeviceAPIGuide fn_egov_makesign_ok Success');
var jsonobj = JSON.parse(arg);
// jsonobj.sign에서 서면 값, jsonobj.vidRandom에서 본인확인을 위한 VID Random값을 가져올 수 있다.
var signedData = jsonobj.sign;
var url = "/pki/xml/addPKIInfo.do";
var acceptType = "xml";
var params = {uuid : device.uuid,
sign: signedData,
entrprsSeCode: 'PKI02'};
alert('Http Method:POST\nacceptType:'+ acceptType + '\n요청데이터:' + JSON.stringify(params));
// get the data from server
window.plugins.EgovInterface.post(url,acceptType, params, function(xmldata) {
console.log('DeviceAPIGuide fn_egov_makesign_ok request Complete');
alert('응답데이터:' + xmldata)
if($(xmldata).find("resultState").text() == "OK"){
window.history.go(-2);
}else{
jAlert($(xmldata).find("resultMessage").text(), '오류', 'c');
}
});
}
=== 관련화면 및 수행매뉴얼 ===
^Action^URL^Controller method^QueryID^
|인증서 인증|/pki/xml/addPKIInfo.do|addPKIInfoXml|"PKIAndroidAPIDAO.insertPKIInfo"|
^인증서 리스트^인증서 인증^
|{{:egovframework:hyb:guide:add:NPKI인증서리스트(WizSign).png?320}}|{{:egovframework:hyb:guide:add:NPKI인증로그(WizSign).png?320}}|
인증서 리스트 화면에서 인증 할 인증서를 선택하고 인증서 인증 화면에서 PASSWD 항목에 패스워드를 입력 후 "인증 확인" 버튼을 클릭한다. \\
단, PASSWD 항목에서 validation을 확인하고, 조건이 불충분 할 경우 오류 메시지가 출력된다.
인증 확인 : 인증서 인증을 하기 위해서 PASSWD 항목에 인증서 패스워드를 입력 후 "인증 확인" 버튼을 클릭한다. \\
Back 버튼 : **NPKI 디바이스 API 가이드 프로그램 메뉴** 화면 또는 **인증서 리스트** 화면으로 이동한다. \\
==== 인증 로그 정보 보기 ====
=== 비즈니스 규칙 ===
웹 서버 어플리케이션으로 부터 인증서 인증 결과 로그를 조회한다. \\
=== 관련코드 ===
function fn_egov_go_loginInfoList() {
console.log('DeviceAPIGuide fn_egov_go_loginInfoList');
//3G 사용시 과금이 발생 할 수 있다는 경고 메시지 표시
if(!fn_egov_network_check(false)) {
return;
}
$.mobile.changePage("#loginInfoList", "slide", false, false);
var url = "/pki/xml/pkiInfoList.do";
var accept_type = "xml";
// get the data from server
window.plugins.EgovInterface.post(url,accept_type, null, function(xmldata) {
console.log('DeviceAPIGuide fn_egov_go_loginInfoList request Complete');
var list_html = "";
$(xmldata).find("pkiInfoList").each(function(){
var dn = $(this).find("dn").text();
var date = $(this).find("crtfcDt").text();
var entrprsSeCode = $(this).find("entrprsSeCode").text().replace(/\s+$/, "");
var entrprsSe = "NONE";
if(entrprsSeCode == 'PKI01')
entrprsSe = "MagicXSign";
else if(entrprsSeCode == 'PKI02')
entrprsSe = "WizSign";
else if(entrprsSeCode == 'PKI03')
entrprsSe = "XecureSmart";
list_html += "subjdn : " + dn + "
";
list_html += "Date : " + date + "
";
list_html += "NPKI : " + entrprsSe + "
";
});
var theList = $('#theLogList');
theList.html(list_html);
theList.listview("refresh");
setTimeout(loadiScrollList, 1000);
});
}
=== 관련화면 및 수행매뉴얼 ===
^기능^URL^Controller^method^QueryID^
|인증서 인증 결과 로그 조회|/pki/xml/pkiInfoList.do|EgovPKIAndroidAPIController|selectPKIInfoListXml|PKIAndroidAPIDAO.selectPKIInfoList|
{{:egovframework:hyb:guide:add:NPKI인증로그(WizSign).png?320|}}
===== 컴파일 디버깅 배포 =====
==== 컴파일 ====
=== Device Applicaton 컴파일 방법 ===
* 프로젝트 선택 > 오른쪽 클릭 > Run As > Android Application
{{:egovframework:hyb:guide:add:카메라_컴파일1.png?740|}}
* 상단의 메뉴 > Run As > Android Application
{{:egovframework:hyb:guide:add:카메라_컴파일2.png?740|}}
* 실행할 타겟 선택 > 에뮬레이터, 디바이스(디버깅모드)
{{:egovframework:hyb:guide:add:디바이스컴파일.png?740|}}
* 디바이스를 이용한 실행 화면
{{:egovframework:hyb3.6:guide:add:wizsign:wizsign_run.png?320|}}
=== Server Applicaton 컴파일 방법 ===
* 서버사이드 가이드 프로그램의 실행은 프로젝트를 마우스 오른쪽 버튼을 클릭 한후 Run As>Run On Server 버튼을 통해 실행 할 수 있다.
{{:egovframework:hyb:guide:ios:서버실행.png?640|}}
* 빌드가 성공적으로 수행 되면 이클립스의 콘솔 창에서 'Server Startup in xxx ms' 메시지를 확인 할 수 있다.
{{:egovframework:hyb:guide:add:서버실행결과_콘솔.png?840|}}
==== 디버깅 ====
디바이스 어플리케이션에서 발생한 오류 내용 확인 및 디버깅을 위해서는 폰갭 프레임워크에서 제공하는 console.log를 이용할 수 있다. console.log 함수는 자바스크립트 구문에서 사용할 수 있는 디버그 코드로 이클립스에서 확인 할 수 있다.
console.log의 작성 방법은 다음과 같다.
function fn_egov_getcertlistSuccess(result)
{
console.log('DeviceAPIGuide fn_egov_getcertlistSuccess Success');
g_certList = result['Certificates'];
var list_html = "";
....
}
디버깅 코드가 실행 되면 아래와 같은 메시지를 개발도구의 콘솔 메시지 창에서 볼 수 있다.
{{:egovframework:hyb:guide:add:FileReadWriteconsolelog.png?700|}}
NPKI 디바이스 API 가이드 프로그램 에서는 디버깅을 위하여 다음과 같이 콘솔 정보를 출력한다. \\
^디버그 코드^디버깅 내용^
|DeviceAPIGuide fn_egov_getcertlistSuccess Success | 인증서 리스트 조회 성공 시|
|DeviceAPIGuide fn_egov_getcertlistFail Fail | 인증서 리스트 조회 실패 시|
|DeviceAPIGuide fn_egov_confirm_password Success | 인증서 비밀번호 확인 성공 시|
|DeviceAPIGuide fn_egov_confirm_password Fail | 인증서 비밀번호 확인 실패 시|
|DeviceAPIGuide fn_egov_makesign_ok Success | 인증서 서명 성공 시|
|DeviceAPIGuide fn_egov_makesign_fail Fail | 인증서 서명 실패 시|
|DeviceAPIGuide fn_egov_makesign_ok request Complete | 웹 서버 어플리케이션으로 부터 인증서 인증 성공 시|
|DeviceAPIGuide fn_egov_go_loginInfoList request Complete | 인증서 인증 로그 정보 조회 성공 시|
==== 배포 ====
NPKI(WizSign) 디바이스 API 가이드 다운로드 : [[http://www.egovframe.go.kr/cop/bbs/selectBoardArticle.do?bbsId=BBSMSTR_000000000161&nttId=1271&menu=3&submenu=9|Click]] \\
===== 참고자료 =====
* Cordova : [[https://cordova.apache.org|Click]] \\
* UX/UI 라이브러리 : jQuery Mobile[[http://jquerymobile.com/demos/1.4.5/|Click]] \\
* 표준보안API : [[http://www.gpki.go.kr/|Click]] \\
* NPKIAPI : (주)케이사인 [[http://www.ksign.com|Click]] \\