개발한 소프트웨어를 웹에 배포하여 사용자가 다운받아 설치하게 하거나, 백신 프로그램에 오탐지 되는 경우들을 위해, 소프트웨어에 코드사인(인증서로 서명)을 진행한다.

코드사인이란?

software에 디지털 서명(전자 서명)을 해서, 제작자 확인 및 프로그램이 변조되지 않았다는 것을 보장하는 것.

코드사인 인증서란, 설치하려는 프로그램이 신뢰할 수 있고 안전하다는 사실을 공인된 인증기관으로부터 입증받은 디지털 서명

코드사인을 하는 이유

  1. 윈도우의 스마트스크린 필터에서 자유로워지기 위해
    • 웹에서 다운받은 프로그램을 실행 시, 명성치가 쌓이기 전까지 스마트 스크린 필터에 걸린다. (블루스크린이 뜨면서 위험한 파일이라고 실행하지 말라는 경고가 나온다.)
      => 프로그램이 바뀌면 매번 명성치를 다시 쌓아주어야 한다.
      => 경험상 약 30회정도 다운로드를 하고 개발자 센터에 신고를 하면 바로 명성치 반영이 되어 필터에 안걸리는 듯 하다. (평균 약 1일 소요)
    • 코드사인을 하면, 해당 서명에 기반해 명성치가 쌓이게 되어 프로그램이 바뀌어도 명성치를 이어받을 수 있게 된다. (프로그램이 바뀔때마다 매번 명성치를 다시 쌓기 위해 다운로드 할 필요가 없음)
      => 경험상 서명에 기반한 명성치를 쌓아 필터에 안걸리게 되는 데 까지는 약 200회 정도 다운로드가 필요한 것이 아닌가 추측한다. (30회로는 안되었음.. 개별 파일보다 명성치를 쌓는 기준이 더 높은듯 싶다.)
  2. 백신 프로그램에 오탐지되는 경우를 위해
    • 신규 소프트웨어가 백신 프로그램에 오탐지 되는 경우, 백신회사에 연락하여 탐지 제외 처리를 해주어야 한다.
    • 이 역시 매번 프로그램이 바뀔때마다 다시 해주어야 하는데..
      코드사인을 하면 인증서 기반으로 탐지 제외 처리가 되어 한번만 처리 해주면 이후 같은 인증서로 서명한 프로그램은 오탐지 되지 않는다. 

알면 간단한데, 처음 하는 경우 이것저것 찾아 헤맬 수 있어서 정리글을 올려본다.

코드사인 하는 전체 과정

1. 인증서 구매

  • 인증서는 공인된 인증기관에서 구매하여 사용한다.
  • Sectigo(Comobo), digicert, ssl.com, VeriSign, Symantec 등.. 업체들이 굉장히 많다. 그 중 한군데를 선택하면 된다.
    • Warranty 등의 조건에 따라 가격이 달라지는데.. warranty 필요 없으면 저렴한 것을 구매해도 될 듯 싶다.
    • Windows 스마트 스크린 필터를 바로 해제해 준다고 EV 인증서라는 걸 팔기도 하는데.. 가격이 그냥 코드사인 인증서의 거의 3배다... 너무 상술이 심한듯...
    • 일반 코드사인 인증서 구매해서 약 200회정도 다운로드 하니 명성치가 쌓여 스마트 스크린 필터에 안걸리더라.. (물론 추정치라 정확하진 않음.. 두 번 할게 아니라 검증을 해보지 못했음..)
      급하지 않다면 일반 인증서 구매해서 명성 쌓아도 될듯 하다.
  • 나는 개인적으로 Sectigo 인증서를 발급받았다. 국내에는 한국정보인증이라는 곳에서 구매 대행을 하는 듯 한데, 해외 대행 사이트를 이용하면 훨씬 저렴하다. (영어가 되면 채팅상담을 통해 도움을 많이 받을 수 있다.)
    • 국내 대행업체 통하면 165,000/년 이었는데, 해외 대행 사이트를 이용해 $85/년 에 구매했다.(구매 시점 기준)
    • 구매 신청을 하고 필요 서류들을 전송하면, 심사를 거치고 verification call을 받고 나서 인증서를 발급받을 수 있다. (약 1~2주 소요되는 듯)
    • 구매한 곳 링크(홍보 아님.. 필요하신 분만 참고): https://comodosslstore.com/codesigning.aspx

2. 인증서 발급

  • 인증기관마다 발급 방식이 조금 다른 것 같은데.. 메일로 보내주는 곳도 있는 듯 하고.
  • 내가 구매했던 곳은 링크를 타고 들어가 브라우저를 통해 인증서를 발급받았다.(윈도우 운영체제에서는 IE만 사용 가능했음)
  • 발급 과정은 안내가 자세히 나오니 따라하면 된다.

3. 프로그램에 코드사인 적용하기

  • Signcode.exe 라는 프로그램을 사용해 코드사인을 한다. (GUI / Command line 방식 둘 다 지원)
    • Signcode.exe는 Microsoft Windows SDK (7 또는 8.1 또는 10)를 설치하면 같이 설치된다.
    • 코드사인 인증서 구매한 곳에서 제공 하거나, 아니면 아래 링크를 통해 구할 수 있다.
    • https://www.comodokorea.co.kr/support/guide02

4. Command line 방식으로 코드사인 하기

매번 따라하기 귀찮으니.. 아래 명령을 배치 파일로 만들어놓으면 편하다.

코드사인 방법

1) 서명 프로그램 실행

SIGNCODE.EXE -spc [파일.spc] -v [파일.pvk] -n [프로그램이름] -i [부가설명 URL] -t [타임스탬프서버 URL] [사인할파일명]

// Example.bat
SIGNCODE.EXE -spc cert.spc -v my.pvk -n "MyProgram" -i https://www.myprogram.com -t http://timestamp.comodoca.com/ "D:\program\mypgoram.exe"

2) 개인키 패스워드 창이 나오면 암호 입력하면 됨

3) 서명 완료됨 (에러가 나는 경우는 '코드사인 에러 테이블' 참고)

 

순서는 간단한데.. spc 파일과 pvk 파일은 무엇이고 어디에 있는가?? 이걸 준비하는 과정이 아래와 같다..

코드사인에 필요한 파일 준비 과정

코드사인 인증서를 발급받았으면, 인증서로부터 SPC와 PVK 파일을 만들어 내야 한다. (인증기관에 따라서는 인증서와 함께 spc 파일을 보내주는 곳도 있는 듯 하다.)

  • SPC 파일이란?
    • OpenSSL 또는 Microsoft의 .NET Framework 파일 서명 도구 (Signcode.exe)와 같은 다양한 PKCS (공개 키 암호화 표준) 프로그램에서 생성 된 디지털 인증서. 개인 키를 사용하여 암호화 된 공개 키가 포함 된 디지털 서명이 포함되어 있다.
    • SPC 파일은 다운로드 된 파일 및 기타 웹 정보를 디지털로 서명하고 인증하는 데 사용된다.
  • PVK 파일이란?
    • 개인 키 파일이다. 소프트웨어 개발자가 디지털 서명 응용 프로그램에 사용되며, 키를 작은 파일에 암호화 된 데이터의 세그먼트로 저장하고, 최종 사용자가 애플리케이션 번들을 인증 할 수 있도록 한다.

아래는 인증서가 저장소에만 설치되어 있는 경우, SPC와 PVK를 만들어 내는 과정이다.

 

1) 브라우저를 이용해 인증서를 PFX 파일로 내보내기

  • IE 실행 > 설정 > 인터넷 옵션 > 내용 > [인증서] 클릭 > 코드사인 인증서 선택 > [내보내기] 클릭
  • [예, 개인키를 내보냅니다] 에 체크 > 다음 

  • 개인 정보 교환 - PKCS #12(.PFX) 선택 (옵션은 기본으로 두면 된다.)

  • [암호]에 체크 후, 암호를 입력 후 [다음] 클릭

  • 내보낼 파일을 저장할 경로와 이름을 입력 후 [다음] 클릭 > [마침] 클릭하면 인증서가 PFX 형식으로 저장된다.
  • 이제 pfx 에서 spc와 pvk를 만들어내면 된다. 
  • OpenSSL이 있어야 한다. 없는 사람은 미리 설치. 

2) PFX 에서 PVK 파일 만들어내기

PFX 파일에서 개인키를 PEM 포맷으로 추출한다. (패스워드를 물으면, 입력한다.)

openssl pkcs12 -in PFX_FILE -nocerts -nodes -out PEM_KEY_FILE​

PEM 개인키를 PVK 포맷으로 변환한다. (PEM passphrases를 물으면, 서명할때 사용할 패스워드를 입력한다.)

// OpenSSL 0.9.8 series:
pvk -in PEM_KEY_FILE -topvk -out PVK_FILE

// OpenSSL 1.x series:
openssl rsa -in PEM_KEY_FILE -outform PVK -pvk-strong -out PVK_FILE

 

3) Software Publisher’s Certificate (SPC) 파일 만들어내기

PFX 파일에서 인증서를 추출한다.

openssl pkcs12 -in PFX_FILE -nokeys -out CERT_PEM_FILE

인증서를 SPC 포맷으로 변환한다.

openssl crl2pkcs7 -nocrl -certfile CERT_PEM_FILE -outform DER -out SPC_FILE

 

변환 예

// PVK
openssl pkcs12 -in my_pfx_file.pfx -nocerts -nodes -out rsa.pem
openssl rsa -in rsa.pem -outform PVK -pvk-strong -out mykey.pvk

// SPC
openssl pkcs12 -in my_pfx_file.pfx -nokeys -nodes -out cert.pem
openssl crl2pkcs7 -nocrl -certfile cert.pem -outform DER -out cert.spc

참고 사이트 : http://www.pkipartner.support/codesign-converting-a-pfx-file-to-spc-and-pvk-files/

 

PVK, SPC 파일이 준비 되었으니, 이제 코드사인을 진행하면 된다.

SIGNCODE.EXE -spc [파일.spc] -v [파일.pvk] -n [프로그램이름] -i [부가설명 URL] -t [타임스탬프서버 URL] [사인할파일명]

 

길고 긴 코드사인 여정이 끝났다..

알고 나면 쉬운데, 모를 땐 한참 찾아보고 삽질을 해야 한다. 언제나 그렇듯...

나의 기록이 누군가에겐 도움이 되길 바란다.

+ Recent posts