ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 전자정부프레임워크 3.8 + 행정전자서명 표준API로 행정정보 공동이용 연동하기
    일상다반사/일 이야기 2021. 1. 13. 10:30
    하단 광고는 티스토리가 임의 삽입하여 노출되고 있습니다
    728x90

    불규칙하게 가끔식 들고오는 '하고있는 일' 이야기.

    뭘 적을까- 하다가, 최근에 작업하면서 자료가 많이 안나오고 특이한 구조 덕분에 고생한 이 이야기를 하기로 했습니다.

     

    최근에 작업하고 있는 프로젝트가 행정안전부의 행정정보 공동이용을 사용하게 되었습니다. 정확히는 비대면 자격확인.

    이를 위해서는 역시 행정안전부 산하에 있는 행정전자서명 인증관리센터에서 배포하고 있는 '표준API' 를 통해 암호화/복호화를 해야 합니다.

     

    이번 글에서는 아래 구성요소를 사용해서 행정정보 공동이용(비대면 자격확인) 연동을 진행한 과정을 남겨 보려 합니다.

     

    - 환경: 전자정부프레임워크 3.8 [다운로드 페이지. 개발자용 개발환경 Version 3.8.0 (64Bit) + All in one 템플릿 프로젝트]

    - JDK: 1.8.0_202

    - 행정전자서명 표준API 1.5.1.0 (Windows, Linux) for JAVA (gpkiapiJava_~~)

    - 행정안전부 행정정보 공동이용 (비대면 자격확인 서비스) + 인터넷망

     

    아래에는 기기 캡쳐 이미지 13장이 쓰였으니 참고하시고,

     

    더보기

     

     

    -- 목  차 --

    누르시면 바로 이동합니다.

     

    1. 사전 준비

    2. 전자정부프레임워크 3.8 환경 준비(간단 버전)

    3. 표준API 작동환경 설정(운영체제 및 WAS) - Windows

    4. 표준API 작동환경 설정(운영체제 및 WAS) - Linux

    5. 수정한 소스 및 암호화/복호화 참고 코드

     

     

    1. 사전 준비

    이 글에서는 행정적인 부분이나, 행정전자서명 표준API 개발 이외 부분은 다루지 않습니다.

    다만, 제가 작업을 위해 보고들은 내용이나 필요하다고 생각하는 부분을 적겠습니다.

     

    행정정보 공동이용을 신규로 시작하기 위해서는 업무담당 공무원이 직접 신청해야 하는 것으로 알고 있습니다.

    공무원이 행정정보 공동이용을 신청하고, 이에 필요한 서버용 GPKI 인증서도 발급받아야 하며(인증서 비밀번호도 필요)

    행정전자서명 표준API도 이를 신청한 공무원을 경유해서 전달됩니다.

    그리고 이런저런 안내문을 보다 보면 등장하는 표준API보급관리시스템(https://api.gpki.go.kr) 도 몇번 시도해보니 행정망 밖에서는 접속이 제대로 안되는것 같습니다. (ActiveX 설치되고 나면 에러뜸)

    여기에서 GPKI로 로그인하면 클라이언트를 다운로드받거나 행정정보 공동이용 전자신청 등이 가능한것 같던데..

    아무튼 이 부분은 딱 이정도, 제가 보고들은건 여기까지입니다.

     

    다만, 이 부분을 위해서 이 1번을 넣었습니다. 꼭 담당 공무원이 신청할 때 확인해서 같이 처리할 수 있게 해 두세요.

    제 경우는 운영서버가 Linux(CentOS)라서 행정전자서명 표준API 클라이언트가 리눅스용만 전달이 됐는데,

    표준API에서 C 라이브러리를 사용하기에 윈도우용 클라이언트가 별도로 있어야 합니다.

    행정전자서명 표준API 개발환경과 운영환경의 OS가 다르다면 두 OS 모두 클라이언트를 받아두세요. 32/64bit 양쪽 다.

    jar 파일을 쓰길래 대수롭지 않게 생각했는데, CLASSPATH에 C 라이브러리(윈도우에서는 .dll, 리눅스에서는 .so) 가 없으면 작동이 안됩니다.

     

    개인적으로 사전 준비에서 고생한건 이 부분 외엔 없던것 같습니다.

    행정정보 공동이용 고객센터의 전화 담당자는(무슨 사원이던데) 재직중인 회사 안에서도 소문난 불친절맨이던데

    나중에 필요한게 없으면 이런 사람들이랑 통화하고 싸워야 합니다.

    최대한 받아둘 수 있을때 확인해서 미리 받아두세요.

    결국 행정정보 공동이용센터는 행정전자서명 표준API 관리 소관이 아니던데, 이거 이야기하는데 얼마나 말을 툭툭 던져대던지..

    바빠 죽겠는데 기분은 기분대로 나쁘고 받는데 시간은 시간대로 걸립니다.

     

     

    ..여기까지 준비가 되었다면, 이런것들을 가지고 계실 겁니다.

     

    - JAVA 버전의 행정전자서명 표준API 클라이언트 (윈도우, 리눅스.. 등. OS별 32, 64Bit는 한번에 주긴 하더군요)

    - 라이센스 파일(테스트 전이라면 아마도 임시 라이센스)

    - 행정정보 공동이용 관련 개발 참고용 샘플 소스(Java)와 요청/응답 전문 스펙(한글문서)

     

    한두개 빠져 있을수...도 있나? 모르겠지만 없으면 없을수록 손해일거고. 아마 다 한번에 전달이 되리라 생각합니다.

     

    그럼 여기까지 하고 잠시, 먼저 언급한 전자정부프레임워크 3.8 개발환경을 어떻게 셋팅했는지도 살짝 언급하겠습니다.

     

     

    2. 전자정부프레임워크 3.8 환경 준비(간단 버전)

    먼저, 전자정부프레임워크 개발환경 64Bit 버전을 준비합니다. [3.x 다운로드 페이지]

    다운로드 받고, 적당한 위치에 풉니다.

     

    JDK는 1.8 이상 버전을 준비하고, 환경변수를 설정하시거나 eclipse.ini 파일에 -vm 옵션을 지정하거나 합니다.

    일단 OpenJDK로는 테스트해보지 못했습니다.

     

    실행되고 나면 Perspective를 eGovFrame 으로 변경하고,

     

    Template Project를 생성합니다.

     

    제 경우는 모든 구성요소가 다 포함된 Common All-in-one 을 선택하였습니다.

    경로나 이름, Group Id는 임의로 입력하시면 되고, Dynamic Web Module 버전은 3.1로 선택했습니다.

     

    웹에서 구성요소를 다운로드 받아 Workspace를 구성하므로 인터넷 대역폭과 작업PC 성능에 따라 시간이 좀 걸립니다.

     

    Workspace가 생성된 뒤, 컴포넌트를 확인해 보면 아마 다 설치되어 있을 겁니다.

    이 중에서 이번 글과 관련된 구성요소 '인증서 로그인' 이 선택되어 있는 것을 확인합니다.

    이 모듈이 gpkiapi_jni jar 파일이며, 여기에 필요한 C라이브러리는 아까 전달받은 윈도우 혹은 리눅스 JAVA 클라이언트 압축을 풀면 라이브러리 폴더에 있습니다.

     

    이 이외 DB 구성, WAS 설정 등의 부분은 따로 언급하지 않겠습니다.

    globals.properties 파일에서 DB정보를 셋팅하신 뒤, 프로젝트 폴더 바로 아래의 scrip 폴더에 들어있는 DDL, DML, DB코멘트 문장을 설정한 DB에 맞게 선택해서 쭉 실행하시면 필요한 테이블과 샘플 데이터가 입력됩니다.

     

    WAS는 tomcat 8.5 를 사용했습니다.

     

    ..그럼 환경이 구성되었고, 이 안에 있는 소스에서 일부를 수정하고 사용할 예정입니다.

     

     

    3. 표준API 작동환경 설정(운영체제 및 WAS) - Windows

    행정전자서명 표준API를 전달받으실 경우 거기에 환경설정에 대한 안내문이 들어있긴 합니다만,

    윈도우와 리눅스 모두에서 환경설정을 해본지라 그 내용을 다시 적어봅니다.

     

    먼저 윈도우.

     

    윈도우에서는 CLASSPATH에 jar 파일을, PATH에 라이브러리 폴더를 등록해야 된다고 안내하고 있습니다.

    그래서 일단 환경변수를 등록합니다.

     

    이렇게 CLASSPATH와 PATH를 등록합니다.

    참고로 PATH의 경우는, 파일을 임의로 옮겨놓고 지정하면 되어서 폴더명은 아무 관계 없습니다.

    그 안에 들어있는 파일이 중요합니다.

     

    그럼 저 라이브러리 폴더 안에는 뭘 넣냐 하면, 아까 1번에서 담당 공무원에게 받은 압축파일 중 윈도우용을 각각 풀어 봅니다. (32, 64bit 각각)

     

    그럼 위와 같이 32bit, 64bit 용 라이브러리 폴더에 .dll 파일이 들어있을 겁니다.

    이걸 아까 PATH에 등록한 폴더에 넣어주시면 됩니다.

     

    라이브러리 넣는 기준은 운영체제의 bit 와 JDK의 bit 로 결정합니다.

    일부러 32bit JDK, 32bit OS 설치하신거 아니면 일단 64bit로 넣고 테스트해 보시길.

     

    jar파일은 lib32/64 폴더 대신 jar 폴더를 보시면 libgpkiapi_jni.jar 파일이 있을 겁니다. 그걸 쓰시면 됩니다.

    단, 전자정부프레임워크 3.8 내장 jni는 1.4.0.0 이라고 표시되어 있어서, 전달받은 클라이언트 안 jar로 교체할 겁니다.

    WEB-INF 아래의 라이브러리 폴더에 복사만 해 두시고, 이따 5번에서 소스 수정할 때 복사한 버전을 쓰도록 바꾸겠습니다.

     

     

    여기까지 하면 일단 표준API 메뉴얼 대로이고, 이클립스에서는 다른 옵션 추가해도 잘 안먹혀서 아래와 같이 WAS 부팅시 java classpath 를 추가로 설정했습니다.

     

    너무 많이 가려놓아서 감이 잘 안오실수도 있는데, VM arguments 맨 마지막에 -classpath "(경로)\libgpkiapi_jni.jar" 만 추가했습니다.

     

    이정도 설정하셨으면... 아마 작동할 겁니다.

    잘 안되면 환경변수 등 정리하신 뒤 이클립스를 완전히 껐다가 다시 켜고 해 보시길.

     

    다음은 개발 및 운영환경이었던 리눅스쪽 설정입니다.

     

    4. 표준API 작동환경 설정(운영체제 및 WAS) - Linux

    행정전자서명 표준API를 전달받으실 경우 거기에 환경설정에 대한 안내문이 들어있긴 합니다만,
    윈도우와 리눅스 모두에서 환경설정을 해본지라 그 내용 좀 다시 적어봅니다.

    다음은 리눅스.

    일단 CentOS 기준입니다만 다른 운영체제도 그렇게까지 차이는 없을 겁니다.

     

    리눅스에서도 CLASSPATH 까지는 설정이 동일한데, 라이브러리 폴더는 환경변수가 따로 있어서 그쪽에 설정합니다.

     

    개인적으론 아래와 같은 소스를 .bash_profile 혹은 .bashrc (둘 중 하나) 에 추가했습니다.

    이번 운영서버는 다른 환경변수를 .bash_profile 에 설정했기에 거기에 같이 넣었네요.

     

    그리고 . .bash_profile 명령으로 방금 등록한 위 환경변수를 현재의 shell에 반영시킬 수 있습니다.

    echo $LD_LIBRARY_PATH 명령 등으로 잘 등록됐는지 확인해 보시길.

     

    리눅스 환경에서의 환경변수 등록은 이정도면 끝인데... 문제는 라이브러리입니다.

    32bit 버전에는 라이브러리가 다 들어있던데, 64bit 버전에는 몇가지가 빠져있어서 일일히 뒤지러 다녔었네요;

     

    받은 폴더의 리눅스쪽 클라이언트 압축을 푸시면 각각의 라이브러리 폴더에 위와 같은 파일들이 들어있습니다.

    so 는 리눅스에서 읽을 수 있는 라이브러리 파일이고, 뒤에 숫자가 더 붙어있는 놈들도 같은 기능을 합니다.

    이걸 아까 GPKI_API_LIB_HOME 변수로 설정한 경로에 넣어줍니다.

     

    라이브러리 넣는 기준은 운영체제의 bit 와 JDK의 bit 로 결정합니다.

    일부러 32bit JDK, 32bit OS 설치하신거 아니면 일단 64bit로 넣고 테스트해 보시길.

    jar파일은 lib32/64 폴더 대신 jar 폴더를 보시면 libgpkiapi_jni.jar 파일이 있을 겁니다. 그걸 쓰시면 됩니다.

     

     

    음, 아무튼 딱 봐도 64bit 쪽이 뭔가 파일이 적습니다. 실제로 동작시켜 보니 아래의 라이브러리를 찾더군요.

    제가 손수 파일명 검색해서 관련있는 RPM 다운받아 라이브러리 파일만 추출해서 넣었습니다(....)

    아래 세 파일 넣으시면 됩니다.

     

    libsasl2.so.2 (64bit용)

    - 관련 RPM : cyrus-sasl-lib-2.1.23-15.el6_6.2.x86_64.rpm

    - 다운로드 링크 : 바로가기

    - rpm에서 추출한 라이브러리 파일

    libsasl2.so(64bit).zip
    0.05MB

    이게.. CentOS 6.x 버전용이라 현재 대부분의 공식 배포파일은 사라진 상태입니다.

    링크한 곳도 아마 구버전 아카이브 미러인듯 한데, 위 라이브러리를 따로 다운로드 받는 것이 찝찝하시면

    rpm 다운로드 받아서 아래 명령어로 rpm 해체하시면 거기서 라이브러리 파일이 나옵니다.

    앞부분이 똑같고 뒤에 버전이 확장자처럼 더 쓰여있는 so 파일을 가져다가 이름 바꿔서 쓰시면 됩니다.

     

     

    libcrypto.so.4 (64bit용)

    libssl.so.4 (64bit용)

    - 관련 RPM : openssl097a-0.9.7a-9.i686.rpm

    - 다운로드 링크 : 바로가기

    - rpm에서 추출한 라이브러리 파일

    libcrypto,libssl(64bit).zip
    0.58MB

    이쪽도 역시 머나먼 구버전이라 대부분의 공식 배포판이 사라졌습니다.

    링크한 곳은 서드파티 레포지토리라 페이지에서는 서드파티라는 빨간색 안내문구가 보입니다만, 없으니 어쩔 수 없죠(...)

    역시 위의 압축파일 다운로드 받기가 찝찝하신 분들은 RPM 다운로드 후 아래 명령어로 해체 가능합니다.

     

     

    참고로, 위에서 공통적으로 사용한 RPM에서 라이브러리 추출하는 명령어는 아래 사이트를 참고하였습니다.

     

    How To: Extract an RPM Package Files Without Installing It 

     

     

     

    여기까지 하시면 아마 문제 없을...거고, JEUS 등 WAS에 따라서 추가 설정을 해 줘야 하는 경우도 있습니다.

     

    경험상 JEUS는 adminServer 가 아닌 MS 에서는 기본적으론 JEUS 라이브러리만을 import 하게 되어있습니다.

    그렇다고 부팅 스크립트 등을 손대면 리스크가 크기에, $JEUS_HOME\bin 경로에 (서버명).properties 로 외부 라이브러리 임포트 가능하게 쉘을 넣어주시길.

    일단 제가 작업하면서 적용한 소스 남겨둬봅니다.

     

    규칙에 맞는 파일이 있으면, 부팅시 해당 properties 파일을 자동으로 읽어들여 실행합니다.

    이게 Tmax에서도 권장하는 방법으로 알고 있으니 참고 되셨길.

     

    추가로 JEUS Web Admin에서 아래 항목을 통해서도 jar파일을 CLASSPATH로 등록할 수 있습니다.

    위 소스 써도 안되면 이것도 등록해보시길.

     

    JEUS WebAdmin

    servers > (서버명) > Basic > Basic Info > Jeus Classloader Append Class Path -> jar파일 절대경로

    [관련설명 - Tmax technet (로그인 필요)]

     

    5. 수정한 소스 및 암호화/복호화 참고 코드

    일단 환경변수나 라이브러리 설정은 여기까지였고, 전자정부프레임워크 3.8에 내장된 GPKI API 관련 소스를 수정해 보겠습니다.

    전체를 다 올릴 것이 아니라, 3.8 All-in-one 이 셋팅되어 있다는 가정 하에 수정한 부분만을 언급합니다.

     

     

    우선 EgovGPKIServiceImpl.java 입니다.

     

     

     

    다음은 pom.xml 입니다. jar파일명 변경

     

     

     

    끝으로 gpki.properties 도 현 설정에 맞게 고쳐줍니다.

     

     

    참고로 이 gpki.properties 파일은 globals.properties 에 파일명이 명시되어 있고, 내부적으로 이를 읽게 되어있습니다.

    로컬, 개발, 운영 적용시 파일명 등으로 구분해서 설정해 두시면 되겠습니다.

     

     

     

    이제 암호화, 복호화시 사용한 코드를 참고삼아 올려두겠습니다.

     

    각각의 과정은..

     

    암호화:

    요청을 받을 서비스의 GPKI를 LDAP 정부 디렉터리에서 가져와 암호화 ->

    요청을 하게 되는 우리 서버의 GPKI와 Key, 비밀번호를 사용해서 전자서명 -> Base64 인코딩 -> 완성!

     

    복호화:

    Base64 디코딩 -> 전자서명 검증 -> 우리 서버의 GPKI와 Key로 복호화 -> 완성!

     

    ..입니다.

     

    요청 보낼 때 우리 서버의 GPKI id값을 공통 헤더에 셋팅하게 되어있는데,

    요청을 받는 행정정보 공동이용 서버에서는 이 정보로 우리가 볼 수 있게 결과를 암호화해서 전달하게 됩니다.

    그래서 이걸 받으면 이쪽에서는 우리가 가지고 있는 인증서들로 암호화를 풀 수 있게 되구요.

     

    그래서 대략 이런 코드가 한번에 묶여 다니게 됩니다.

     

     

    이번 글은 여기까지.

     

    관련해서 개발한다고 한 1-2주 정도 신경써보니, 뭔가 급하거나 할때 찾아볼 자료가 없어서 답답함을 느낍니다.

     

    전자정부프레임워크 같은 경우는 질문답변 게시판이 있어서 왠만한건 그 게시판을 뒤져보면 해답이 나올 만큼 자료가 쌓여있습니다.

    하지만 행정전자서명 인증관리센터는 기본적으로 GPKI를 쓰는 공무원이 대상이라 그런가

    게시판 들어가도 글도 거의 안나오고(일단 공인인증서-NPKI-로 로그인하니 뜨긴 하더군요) 올라와있는 글도 거의 '전화도 안받고 이메일 답변도 없다' 는 내용들.

    실제 제가 해 봐도 이메일 문의 답변없어, 전화 고객센터는 2-30초마다 '기다리시겠습니까?' 를 물으며 노골적으로 전화 끊는걸 유도하는데 연락받을 번호 남겨놔도 전화한통 없고.

    좀 물어볼만한 고객센터인 행정정보 공동이용센터 담당자는 불친절의 극치를 달렸고. 무슨 사원이던데.

    아니 이사람도 이렇게 전화받기 싫어하는데, 좀 게시판이라도 만드셔서 참고할만한 문의답변이라도 있었으면 좋겠다 싶었습니다.

     

    프로젝트 난이도랑은 별개로, 한번 해봤으니 다음부턴 난이도가 줄긴 하겠지만 별로 다시 하고싶진 않네요.

    이번에 잘 되서 다행이랄지(...)

     

    혹시 참고될 부분이 있는 분들은 참고 되셨길 빕니다.

     

    그럼 다음 글은 또 며칠 뒤에 들고 오겠습니다. 다음 글에서 뵙지요.

    댓글

Designed by Tistory.