--- title: "OpenSSL 연동" slug: "hsm-openssl" tags: ["Hardware Security Module ", "HSM", "SafeNet Luna Client", "OpenSSL"] updated: 2026-09-17T09:09:36Z published: 2026-09-17T09:09:36Z canonical: "guide-fin.ncloud-docs.com/hsm-openssl" --- > ## Documentation Index > Fetch the complete documentation index at: https://guide-fin.ncloud-docs.com/llms.txt > Use this file to discover all available pages before exploring further. # OpenSSL 연동 OpenSSL 암호화 키를 안전하게 저장하기 위해 네이버 클라우드 플랫폼 HSM과 OpenSSL을 연동하는 방법을 설명합니다. 참고 OpenSSL 연동은 Thales 공식 문서를 기반으로 작성했습니다. 사용 가이드에서 안내하는 내용 외에 더 많은 내용을 살펴보려면 [Luna HSM OpenSSL 연동 가이드](https://thalesdocs.com/gphsm/integrations/guides/openssl/index.html)를 참고해 주십시오. ## 지원 환경 HSM 클라이언트와 OpenSSL을 연동하기 위한 환경은 다음과 같습니다. ### 전제 조건 OpenSSL 연동을 시작하기 전, 다음의 전제 조건을 준수해 주십시오. - HSM 클라이언트 서버는 VPC 상에 위치 - HSM 클라이언트 서버 인스턴스와 HSM 파티션 간에 연결 생성 완료 - HSM 클라이언트 서버에 OpenSSL 툴킷이 설치되어 있거나 설치 가능한 환경이어야 함([지원 운영체제](/docs/hsm-openssl#%EC%A7%80%EC%9B%90%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C) 참고) ### 지원 운영체제 OpenSSL 툴킷(GemEngine)을 지원하는 운영체제를 확인해 주십시오. | OpenSSL Toolkit | 운영체제 | | --- | --- | | GemEngine 1.2 GemEngine 1.3 | Windows Server 2016 Windows Server 2012 R2 RHEL 7 | ## OpenSSL 설정 OpenSSL은 GemEngine과 연동함으로써 네이버 클라우드 플랫폼 HSM 리소스를 사용할 수 있습니다. OpenSSL과 GemEngine 간 연동 설정에 대한 안내는 다음과 같이 네 가지 시나리오로 제공됩니다. 서버 환경에 맞는 시나리오를 선택해서 수행해 주십시오. - [시나리오 A](/docs/hsm-openssl#%EC%8B%9C%EB%82%98%EB%A6%AC%EC%98%A4A): Linux에 설치된 기존 OpenSSL과 사전 구축된 동적 엔진 통합 - [시나리오 B](/docs/hsm-openssl#%EC%8B%9C%EB%82%98%EB%A6%AC%EC%98%A4B): 동적 엔진 컴파일 및 기존 OpenSSL과의 통합 - [시나리오 C](/docs/hsm-openssl#%EC%8B%9C%EB%82%98%EB%A6%AC%EC%98%A4C): OpenSSL 소스와 GemEngine의 컴파일 및 설치 - [시나리오 D](/docs/hsm-openssl#%EC%8B%9C%EB%82%98%EB%A6%AC%EC%98%A4D): 기본적으로 GemEngine을 사용하도록 OpenSSL 구성 ### 시나리오 A Linux 서버에 설치된 기존 OpenSSL과 사전 구축된 동적 엔진을 통합하는 방법은 다음과 같습니다. 1. GemEngine을 다운로드하여 home 폴더 하위에 압축 해제해 주십시오. ``` # cd /home/gemengine-1.2 ``` - 다운로드 링크: [OpenSSL GemEngine 다운로드](https://cdn.document360.io/0406ed95-101f-4cde-8dd8-308d03444a94/Images/Documentation/gembuild.zip?sv=2026-02-06&spr=https&st=2026-11-07T17%3A33%3A10Z&se=2026-11-07T18%3A33%3A10Z&sr=c&sp=r&sig=cDXKLEbkwL5IuEi0FDc%2B4oeIxOwyoi%2BBPf1gtOksBgk%3D) 2. `gembuild` 스크립트를 이용해서 OpenSSL 엔진 디렉터리 위치를 검색해 주십시오. ``` # ./gembuild locate-engines [root@intg-server gemengine-1.2]# ./gembuild locate-engines The OpenSSL engines directory is located at: /usr/lib64/openssl/engines ``` - gembuild 스크립트는 OpenSSL 툴킷에 포함되어 있습니다. 3. GemEngine이 참고하는 라이브러리 파일(libgem.so)을 OpenSSL 엔진 디렉터리로 복사해 주십시오. ``` cd builds/linux/// # ex cd /home/gemengine-1.2/builds/linux/rhel/64/1.0.2 # cp builds/linux/rhel/64/1.0.2/libgem.so /usr/lib64/openssl/engines/ ``` 4. GemEngine이 설치되어 있고 OpenSSL에서 지원되는지 확인해 주십시오. ``` # openssl engine gem –v (gem) Gem engine support enginearg, openSession, closeSession, login, logout, engineinit, CONF_PATH, ENGINE_INIT, ENGINE2_INIT, engine2init, DisableCheckFinalize, SO_PATH, GET_HA_STATE, SET_FINALIZE_PENDING, SKIP_C_INITIALIZE, IntermediateProcesses ``` 5. GemEngine의 sautil을 /usr/local/bin 폴더로 복사해 주십시오. ``` # cp builds/linux/rhel/64/1.0.1/sautil /usr/local/bin ``` ### 시나리오 B 동적 엔진 컴파일 후 기존 OpenSSL과 통합하는 방법은 다음과 같습니다. 참고 시스템에 C 컴파일러와 make 유틸리티에 대한 접근 권한이 있는지 확인해 주십시오. 접근 권한이 있는 경우에만 해당 시나리오를 수행할 수 있습니다. 1. OpenSSL 소스를 다운로드하여 압축을 해제해 주십시오. ``` [root@intg-server ~]# wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2.tar.gz --2021-02-22 14:51:27-- https://www.openssl.org/source/old/1.0.2/openssl-1.0.2.tar.gz Resolving www.openssl.org (www.openssl.org)... 202.43.54.197, 2600:140b:ac00:282::c1e, 2600:140b:ac00:2a1::c1e Connecting to www.openssl.org (www.openssl.org)|202.43.54.197|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 5265809 (5.0M) [application/x-gzip] Saving to: ‘openssl-1.0.2.tar.gz’ 100%[=====================================================================================================================>] 5,265,809 --.-K/s in 0.05s 2021-02-22 14:51:29 (92.0 MB/s) - ‘openssl-1.0.2.tar.gz’ saved [5265809/5265809] [root@intg-server ~]# tar xvfz openssl-1.0.2.tar.gz ``` 참고 기존 OpenSSL 버전과 같은 버전의 OpenSSL 소스를 다운로드해야 합니다. - 다운로드 방법: [OpenSSL 웹사이트](https://www.openssl.org/source/)에서 'openssl-x.xx.xx.tar.gz' 형식의 파일 다운로드 2. `gembuild` 스크립트를 이용해서 OpenSSL 엔진 디렉터리 위치를 검색해 주십시오. ``` # ./gembuild locate-engines [root@intg-server gemengine-1.2]# ./gembuild locate-engines The OpenSSL engines directory is located at: /usr/lib64/openssl/engines ``` 3. `gembuild > config` 명령을 실행해 OpenSSL 소스 위치와 엔진 위치를 설정해 주십시오. ``` # ./gembuild config --openssl-source=/root/openssl-1.0.2 --openssl-engines=/usr/lib64/openssl/engines --config-bits=64 ``` 4. EC 헤더 파일을 설치해 주십시오. ``` # ./gembuild openssl-ec-headers ``` 5. `gembuild`로 OpenSSL 동적 엔진을 컴파일해 주십시오. ``` # ./gembuild engine-build ``` 6. `gembuild`로 OpenSSL 동적 엔진을 설치해 주십시오. ``` # ./gembuild engine-install ``` 7. 정상적으로 설치되었는지 확인해 주십시오. ``` # openssl engine gem -v ``` 8. sautil을 컴파일하고 설치해 주십시오. ``` # ./gembuild sautil-build # ./gembuild sautil-install ``` ### 시나리오 C OpenSSL 소스와 GemEngine을 컴파일하고 설치하는 방법은 다음과 같습니다. 1. OpenSSL 소스를 다운로드하여 압축을 해제해 주십시오. ``` [root@intg-server ~]# wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2.tar.gz --2021-02-22 14:51:27-- https://www.openssl.org/source/old/1.0.2/openssl-1.0.2.tar.gz Resolving www.openssl.org (www.openssl.org)... 202.43.54.197, 2600:140b:ac00:282::c1e, 2600:140b:ac00:2a1::c1e Connecting to www.openssl.org (www.openssl.org)|202.43.54.197|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 5265809 (5.0M) [application/x-gzip] Saving to: ‘openssl-1.0.2.tar.gz’ 100%[=====================================================================================================================>] 5,265,809 --.-K/s in 0.05s 2021-02-22 14:51:29 (92.0 MB/s) - ‘openssl-1.0.2.tar.gz’ saved [5265809/5265809] [root@intg-server ~]# tar xvfz openssl-1.0.2.tar.gz ``` - 다운로드 방법: [OpenSSL 웹사이트](https://www.openssl.org/source/)에서 'openssl-x.xx.xx.tar.gz' 형식의 파일 다운로드 2. OpenSSL FIPS module을 다운로드하고 압축을 해제해 주십시오. ``` [root@intg-server ~]# wget https://www.openssl.org/source/old/fips/openssl-fips-2.0.9.tar.gz --2021-02-22 14:59:11-- https://www.openssl.org/source/old/fips/openssl-fips-2.0.9.tar.gz Resolving www.openssl.org (www.openssl.org)... 202.43.54.197, 2600:140b:ac00:2a1::c1e, 2600:140b:ac00:282::c1e Connecting to www.openssl.org (www.openssl.org)|202.43.54.197|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1425056 (1.4M) [application/x-gzip] Saving to: ‘openssl-fips-2.0.9.tar.gz’ 100%[====================================================================================>] 1,425,056 1.12MB/s in 1.2s 2021-02-22 14:59:14 (1.12 MB/s) - ‘openssl-fips-2.0.9.tar.gz’ saved [1425056/1425056] [root@intg-server ~]# tar xvfz openssl-fips-2.0.9.tar.gz ``` 3. `gembuild`로 OpenSSL 엔진 디렉터리 위치를 검색해 주십시오. ``` # ./gembuild locate-engines [root@intg-server gemengine-1.2]# ./gembuild locate-engines The OpenSSL engines directory is located at: /usr/lib64/openssl/engines ``` 4. `gembuild > config` 명령을 실행해 OpenSSL을 설정해 주십시오. ``` # ./gembuild config --openssl-source=/root/openssl-1.0.2 --openssl-engines=/usr/lib64/openssl/engines --config-bits=64 --openssl-fips-source=/root/openssl-fips-2.0.9 ``` 5. FIPS module을 컴파일하고 설치해 주십시오. ``` # ./gembuild openssl-fips-build # ./gembuild openssl-fips-install ``` 6. gem dynamic engine을 컴파일 및 설치한 후에 정상적으로 설치되었는지 확인해 주십시오. ``` # ./gembuild engine-build # ./gembuild engine-install # /usr/local/ssl/bin/openssl engine gem -v ``` 7. sautil을 컴파일하고 설치해 주십시오. ``` # ./gembuild sautil-build # ./gembuild sautil-install ``` ### 시나리오 D OpenSSL이 기본으로 GemEngine을 사용하도록 OpenSSL을 구성하는 방법은 다음과 같습니다. 1. openssl.cnf 파일과 OpenSSL 엔진 디렉터리 위치를 검색해 주십시오. ``` # openssl version -d # ./gembuild locate-engines ``` - 검색 결과 `locate-engines` 경로에 'libgem.so' 파일이 있어야 합니다. 2. 다음과 같이 openssl.cnf 파일을 수정해 주십시오. ``` # Insert near top of file openssl.cnf: openssl_conf = openssl_init # Insert at bottom of file openssl.cnf: [ openssl_init ] engines = engine_section [ engine_section ] gem = gem_section [ gem_section ] dynamic_path = /usr/lib64/openssl/engines/libgem.so ``` 3. OpenSSL에 엔진을 지정하지 않은 상태에서 GemEngine이 로드되는지 확인해 주십시오. ``` # openssl engine -v ``` ## HSM-OpenSSL 연동 설정 [OpenSSL 설정](/docs/hsm-openssl#OpenSSL%EC%84%A4%EC%A0%95)을 따라 OpenSSL이 GemEngine을 사용하도록 구성한 후에는, GemEngine이 HSM을 사용하도록 설정하고 GemEngine이 사용할 개인 키와 인증서를 생성해 주십시오. ### HSM 클라이언트용 GemEngine 설정 HSM 클라이언트에서 클라이언트용 GemEngine을 설정하는 방법은 다음과 같습니다. 1. '/etc/Chrystoki.conf' 파일에 GemEngine 라이브러리 경로를 추가해 주십시오. ``` GemEngine = { LibPath = /usr/safenet/lunaclient/lib/libCryptoki2.so; LibPath64 = /usr/safenet/lunaclient/lib/libCryptoki2_64.so; EnableDsaGenKeyPair = 1; EnableRsaGenKeyPair = 1; DisablePublicCrypto = 1; EnableRsaSignVerify = 1; EnableLoadPubKey = 1; EnableLoadPrivKey = 1; DisableCheckFinalize = 1; DisableEcdsa = 1; DisableDsa = 0; DisableRand = 0; EngineInit = :10:11; } ``` 2. `sautil`을 실행하여 영구 sautil 세션을 실행해 주십시오. ``` # /usr/local/sautil/bin/sautil -v -s -i 10:11 -o –q ``` - 이 명령을 실행하려면 암호화 관리자(Cryptro Officer) 권한이 있어야 합니다. - 암호를 요구하는 프롬프트에서 암호화 관리자 암호를 입력해 주십시오. ### OpenSSL 암호화 개체 생성 HSM 클라이언트에서 OpenSSL CMS에 대한 암호화 개체를 생성합니다. 1. openssl.cnf 파일의 CA_default 섹션에 아래와 같이 작성해 주십시오. ``` # openssl version -d OPENSSLDIR: "/etc/pki/tls" # vim /etc/pki/tls/openssl.cnf dir = /usr/local/ssl new_certs_dir = $dir/certs ``` 2. openssl 폴더에 index.txt 파일과 serial 파일을 생성해 주십시오. - serial 파일 생성 후에는 파일을 열어 '01'을 입력해 주십시오. 3. GemEngine으로 2048 비트 개인 키를 생성해 주십시오. ``` # openssl genrsa -engine gem 2048 ``` 4. cmu list 명령어로 생성된 키를 확인해 주십시오. ``` # /usr/safenet/lunaclient/bin/cmu list ex) handle=53 label=rsa-private-e6f79de116c0cb59f76a474e8598df9560edde7b ``` - 이 명령을 실행하려면 암호화 관리자(Cryptro Officer) 권한이 있어야 합니다. - 암호를 요구하는 프롬프트에서 암호화 관리자 암호를 입력해 주십시오. 5. 생성된 2048 비트 개인 키를 사용하여 인증서를 생성해 주십시오. ``` # openssl req -engine gem -new -x509 -days 365 -key rsa-private-e6f79de116c0cb59f76a474e8598df9560edde7b -keyform engine -out /etc/pki/tls/certs/ca.cer ``` - 이때 생성하는 인증서는 검증에 필요한 인증서를 서명하는 데 사용됩니다. 6. CSR을 생성하기 위한 디렉터리를 생성해 주십시오. ``` # mkdir /etc/pki/tls/certs/sender # mkdir /etc/pki/tls/certs/receiver ``` 7. 송신자에 대한 CSR을 생성해 주십시오. ``` # openssl req -engine gem -newkey rsa:2048 -out /etc/pki/tls/certs/sender/sender.txt ``` 8. 수신자에 대한 CSR을 생성해 주십시오. ``` # openssl req -engine gem -newkey rsa:2048 -out /etc/pki/tls/certs/receiver/receiver.txt ``` 9. 송신자에 대한 인증서에 서명해 주십시오. ``` # openssl ca -engine gem -policy policy_anything -cert /etc/pki/tls/certs/ca.cer -in /etc/pki/tls/certs/sender/sender.txt -keyfile rsa-private-e6f79de116c0cb59f76a474e8598df9560edde7b -keyform engine -out /etc/pki/tls/certs/sender/sender.cer ``` 10. 수신자에 대한 인증서에 서명해 주십시오. ``` # openssl ca -engine gem -policy policy_anything -cert /etc/pki/tls/certs/ca.cer -in /etc/pki/tls/certs/receiver/receiver.txt -keyfile rsa-private-e6f79de116c0cb59f76a474e8598df9560edde7b -keyform engine -out /etc/pki/tls/certs/receiver/receiver.cer ``` 참고 작업 중 다음과 같이 serial 파일과 index.txt 파일이 없다는 문구가 출력되면 2번 절차를 다시 수행해 주십시오. ``` 140510153697168:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen('/etc/pki/CA/serial','r') 140510153697168:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404: 139921069164432:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen('/etc/pki/CA/index.txt','r') 139921069164432:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404: ``` ### HSM-OpenSSL 연동 확인 [OpenSSL 암호화 개체 생성](/docs/hsm-openssl#OpenSSL%EC%95%94%ED%98%B8%ED%99%94%EA%B0%9C%EC%B2%B4%EC%83%9D%EC%84%B1)을 따라 생성한 OpenSSL CMS 암호화 개체가 정상적으로 동작하는지 확인하여 HSM과 OpenSSL 간 연동이 정상적으로 설정되었는지 확인해 주십시오. - 테스트 시나리오 - 송신자는 자신의 개인 키로 메시지에 서명하고 수신자의 공개 키로 메시지를 암호화하여 수신자에게 메시지를 전송합니다. - 수신자는 자신의 개인 키를 사용하여 메시지의 암호를 해독하고 송신자의 공개 키를 사용하여 메시지를 확인합니다. 1. message.txt 파일을 생성해 주십시오. 2. message.txt 파일을 송신자의 개인 키로 서명해 주십시오. ``` # openssl cms -engine gem -sign -in message.txt -signer /etc/pki/tls/certs/sender/sender.cer -inkey rsa-private-940721199b330d49495b0701ef0f66ac66b44eab -keyform engine -out sendmail.msg ``` 참고 rsa-private-{private key} 라벨을 수정하려면 다음의 명령어를 사용해야 하며, 암호화 관리자 권한이 있어야 합니다. ``` # /usr/safenet/lunaclient/bin/cmu setattribute -handle=104 -label=sender_private_key ``` 3. 서명한 sendmail.msg를 확인해 주십시오. ``` # cat sendmail.msg ``` 4. 서명한 sendmail.msg를 암호화해 주십시오. ``` # openssl cms -engine gem -encrypt -in sendmail.msg -out sendmail_enc.msg /etc/pki/tls/certs/receiver/receiver.cer ``` 5. sendmail_enc.msg를 수신자의 개인 키를 이용하여 복호화해 주십시오. ``` # openssl cms -engine gem -decrypt -in sendmail_enc.msg -inkey rsa-private-8ccc01d4077988fce38722c2b76c3f07c7ac03a2 -keyform engine -out sendmail_dec.msg ``` 6. sendmail_dec.msg의 서명을 송신자의 인증서를 이용하여 검증해 주십시오. ``` # openssl cms -engine gem -verify -in sendmail_dec.msg -in sendmail_dec.msg -CAfile /etc/pki/tls/certs/ca.cer -out out.txt ``` 7. 5번 절차에서 생성한 out.txt와 1번 절차에서 생성한 message.txt가 동일한지 비교해 주십시오. - out.txt와 message.txt가 동일하면 HSM과 OpenSSL 연동이 정상적으로 설정된 것입니다. 8. 시나리오 테스트에 이용한 sautil 세션을 종료해 주십시오. ``` # sautil -c -s 0 -i 10:11 –q ```