OpenSSL 연동
    • PDF

    OpenSSL 연동

    • PDF

    기사 요약

    OpenSSL 암호화 키를 안전하게 저장하기 위해 네이버 클라우드 플랫폼 HSM과 OpenSSL을 연동하는 방법을 설명합니다.

    참고

    OpenSSL 연동은 Thales 공식 문서를 기반으로 작성했습니다. 사용 가이드에서 안내하는 내용 외에 더 많은 내용을 살펴보려면 Luna HSM OpenSSL 연동 가이드를 참고해 주십시오.

    지원 환경

    HSM 클라이언트와 OpenSSL을 연동하기 위한 환경은 다음과 같습니다.

    전제 조건

    OpenSSL 연동을 시작하기 전, 다음의 전제 조건을 준수해 주십시오.

    • HSM 클라이언트 서버는 VPC 상에 위치
    • HSM 클라이언트 서버 인스턴스와 HSM 파티션 간에 연결 생성 완료
    • HSM 클라이언트 서버에 OpenSSL 툴킷이 설치되어 있거나 설치 가능한 환경이어야 함(지원 운영체제 참고)

    지원 운영체제

    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: Linux에 설치된 기존 OpenSSL과 사전 구축된 동적 엔진 통합
    • 시나리오 B: 동적 엔진 컴파일 및 기존 OpenSSL과의 통합
    • 시나리오 C: OpenSSL 소스와 GemEngine의 컴파일 및 설치
    • 시나리오 D: 기본적으로 GemEngine을 사용하도록 OpenSSL 구성

    시나리오 A

    Linux 서버에 설치된 기존 OpenSSL과 사전 구축된 동적 엔진을 통합하는 방법은 다음과 같습니다.

    1. GemEngine을 다운로드하여 home 폴더 하위에 압축 해제해 주십시오.
      # cd /home/gemengine-1.2
      
    2. gembuild 스크립트를 이용해서 OpenSSL 엔진 디렉터리 위치를 검색해 주십시오.
      • 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. GemEngine이 참고하는 라이브러리 파일(libgem.so)을 OpenSSL 엔진 디렉터리로 복사해 주십시오.
      cd builds/linux/<distributor>/<bit_version>/<OpenSSL_version>
      
      # 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 소스를 다운로드하여 압축을 해제해 주십시오.
      • 다운로드 방법: OpenSSL 웹사이트에서 'openssl-x.xx.xx.tar.gz' 형식의 파일 다운로드
      [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 소스를 다운로드해야 합니다.

    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 소스를 다운로드하여 압축을 해제해 주십시오.
      • 다운로드 방법: OpenSSL 웹사이트에서 'openssl-x.xx.xx.tar.gz' 형식의 파일 다운로드
      [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
      
    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 엔진 디렉터리 위치를 검색해 주십시오.
      • 검색 결과 locate-engines 경로에 'libgem.so' 파일이 있어야 합니다.
      # openssl version -d
      # ./gembuild locate-engines
      
    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 설정을 따라 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 = <slot_id>:10:11;
      }
      
    2. sautil을 실행하여 영구 sautil 세션을 실행해 주십시오.
      • 이 명령을 실행하려면 암호화 관리자(Cryptro Officer) 권한이 있어야 합니다.
      • 암호를 요구하는 프롬프트에서 암호화 관리자 암호를 입력해 주십시오.
      # /usr/local/sautil/bin/sautil -v -s <slot_id> -i 10:11 -o –q
      

    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 명령어로 생성된 키를 확인해 주십시오.
      • 이 명령을 실행하려면 암호화 관리자(Cryptro Officer) 권한이 있어야 합니다.
      • 암호를 요구하는 프롬프트에서 암호화 관리자 암호를 입력해 주십시오.
      # /usr/safenet/lunaclient/bin/cmu list
      
      ex)
      handle=53 label=rsa-private-e6f79de116c0cb59f76a474e8598df9560edde7b 
      
    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 암호화 개체 생성을 따라 생성한 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
      

    이 문서가 도움이 되었습니까?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.