본문 바로가기
개발 및 운영

Nitrokey HSM key import

by Joseph.Lee 2019. 6. 8.

처음부터 HSM을 사용하지 않다가 HSM을 사용하게 된다면 기존의 Key와 인증서들을 HSM으로 Import해야 하는 경우가 발생합니다.

하지만 이러한 것은 보안상의 문제로 많은 HSM에서 공식적으로 지원하지 않습니다.

(잘 생각은 안나는데.. 무슨 인증을 받으려면(CC였나?) 이러한 기능이 존재하면 안된다고 합니다.. 확실치는 않아요.. 지나가다 본거 같아서.. 정확히는 key import의 경우 안전한 random으로 만들어진 key가 아니라서 그랬다고 했나 쨋든...)

공식적으로 지원하지 않는 만큼.. 좋은 방법이 아닙니다. HSM내에서 안전한 Random generator를 통해서 생성한 Key를 외부에 노출하지 않고 HSM내부에만 저장하여 안전하게 보관하는 것이 좋습니다.

저 또한.. Key를 import해서 쓰려다가.. 혹시 추후에 문제가 생길까 하여 HSM에서 생성한 키를 사용하기로 했습니다.

하지만.. 누군가는 이러한 것이 필요할 수 있을수도 있기에.. 제가 삽질한 내용들을 공유합니다..^^

여기서 저는 Nitrokey HSM을 사용하였습니다. (가장 저렴한(그리고 느린..) USB형 HSM입니다.)

(근데 회사에서 쓰려면 가능한 FIPS140-2이상 인증받은걸 사용하시길..)

이 제품또한 Plain Key를 Import하는 기능을 지원하지 않습니다. 하지만 DKEK를 통해 암호화된 상태로 내부의 키를 Backup/Restore하는 기능은 존재합니다. 이 기능을 이용하여 기존의 Key를 Import할 수 있습니다.

해당 제품은 SmartCard HSM을 기반으로 만들어져 있습니다. 따라서 아래와 같은 준비물이 필요합니다.

추가적으로 2048bit초과(4096bit)의 RSA Key를 사용하는 경우 sc-hsm-workspace/scsh/sc-hsm/DKEK.js를 수정하고 BN.js 를 추가해야 합니다.

참고 : importing 4096 bit rsa keys from pkcs12 into Nitrokey HSM 2

아주 상세하게.. 하나하나 스탭스탭.. 빌드하는 과정 등.. 자세하게 설명하진 않겠습니다. 보안에 관한 것인 만큼 이정도를 수행할 능력이 되지 않으시다면 죄송합니다만 따라하지 마시거나 직접 해결해 보시면서 사용하십시오. 이 글에 대해서는 사소한 문제에 대해서 도움을 드리지 않을 것입니다. 개발과 보안에 대해 공부하십시오.

사실 아래 내용도 과하게 친절한 내용입니다... 처음 계획과는 다르게 많은 내용이 추가되었습니다.. DKEK오류나는거 수정한것도 안올리려고 했는데 올립니다..

  1. HSM을 초기화하고 복호화된 dkek키를 얻습니다.
    관련자료 : https://raymii.org/s/articles/Get_Started_With_The_Nitrokey_HSM.html

    # DKEK 생성 및 HSM 초기화. 이미하셨다면 PASS.
    $ sc-hsm-tool --create-dkek-share dkek-share-1.pbe # dkek 생성
    $ sc-hsm-tool --initialize --so-pin 3537363231383830 --pin (사용할 pin번호) --dkek-shares 1
    
    # DKEK 키 얻기
    $ sc-hsm-tool --print-dkek-share dkek-share-1.pbe
    # 여기서 DKEK키가 출력됩니다.
  2. Import할 키 및 인증서를 pkcs12으로 변환합니다.

    $ openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.p12
  3. Smart Card Shell을 실행하고 File -> Run Script에서 import_P12.js를 선택합니다.

  4. (1)에서 얻은 DKEK키를 입력하고, pin code입력하고, pkcs12파일 입력하고, 비번 입력하고, 이름 입력합니다..

  5. 끝...

반응형

댓글