Research/Etc

사설 인증서로 실행 파일 전자서명(디지털서명, digital signature, 코드 사이닝, 코드 사인, code sign) 하기

초록생선 2014. 3. 12. 09:54

출처가 불명확한 SignMe.exe를 관리자 권한으로 실행하면 다음과 같은 UAC 창이 발생합니다.

"게시자를 알 수 없는 다음 프로그램이 이 컴퓨터를 변경할 수 있도록 허용하시겠습니까?"라는 것은 다음과 같이 디지털 서명이 안되어 있거나, 파일이 변조되어 디지털 서명이 깨진 경우일 듯 합니다. 즉, SignMe.exe는 아래와 같이 "디지털 서명" 부분이 없습니다.

이와 같이 실행 파일에 디지털 서명을 추가하는 것은 여러 장점이 있는데, 다만, 아래와 같은 "신뢰된 루트 인증 기관"으로 부터 인증을 받아야 하는데, 이는 비용이 발생합니다.

그래서 본 포스트에서는, 사설 인증서를 생성하고 이를 PC내의 신뢰된 루트 인증 기관  리스트에 강제 추가한뒤, 이를 가지고 디지털 서명하는 절차를 알려드리고자 합니다. 보통 openssl을 이용할 수 있으나, 이곳에서는 MS에서 제공한 툴을 기반으로 알려드립니다.


cert.zip


위 cert.zip은 certmgr.exe / cert2spc.exe / makecert.exe / signtool.exe를 포함하고 있는데, Microsoft Platform SDK를 설치하면 C:\Program Files\Microsoft Platform SDK ... \Bin에 있습니다. (단순 공유용으로, 저작권 문제시 삭제하겠습니다.)


아래와 같이 C:\에 압축을 풉니다. (SignMe.exe는 테스트용 파일입니다.)

우선, cmd.exe 관리자 권한으로 실행한뒤, 아래와 같이 진행합니다.


아래는 루트 인증서를 만드는 과정인데, XXXXXXXXX에 인증서 이름을 넣으면 됩니다. 앞선 "신뢰할 수 있는 루트 인증 기관" UI의 "발급 대상"에 해당된다고 보면 됩니다. 본 예에서는 "greenfish CA"를 사용했습니다.

Microsoft Windows [Version 6.1.7600]

Copyright (c) 2009 Microsoft Corporation. All rights reserved.


C:\Windows\system32>cd \


C:\>makecert -n "CN=XXXXXXXXX" -r -sv ca.pvk ca.cer

그럼 아래와 같은 창이 뜨는데,

이는 해당 루트 인증서로 서명된 또다른 인증서를 만들때 필요한 암호를 입력하는 것입니다. 만일, 관여하지 않겠다면 "없음"해도 무방합니다.

C:\>makecert -n "CN=XXXXXXXXX" -r -sv ca.pvk ca.cer

Succeeded


C:\>dir ca.*

 C 드라이브의 볼륨에는 이름이 없습니다.

 볼륨 일련 번호: 9851-1478


 C:\ 디렉터리


2014-03-11  오후 05:37               515 ca.cer

2014-03-11  오후 05:37               636 ca.pvk

               2개 파일               1,151 바이트

               0개 디렉터리  35,430,629,376 바이트 남음


C:\>

위와 같이 cer와 pvk 파일이 생성되었습니다. cer 파일은 배포 가능한 인증서 파일이며, pvk 파일은 개인키 파일이므로, 신중히 보관하시기 바랍니다.

만일 spc 파일이 필요한 경우라면,

cert2spc.exe ca.cer ca.spc

와 같이 구할 수 있습니다.

이제 아래와 같이 실행하여 ca.cer를 "신뢰할 수있는 루트 인증 기관"으로 등록할 수 있습니다.

C:\>certmgr.exe -add ca.cer -s -r localMachine root

CertMgr Succeeded


C:\>

이제 Internet Explorer -> 도구 -> 인터넷 옵션 -> 내용 -> 인증서에 들어가 보면, 아래와 같이 "신뢰할 수 있는 루트 인증 기관"에 greenfish CA가 포함된것을 확인할 수 있습니다.

이제 우리가 만든 사설 인증서를 "신뢰"할 수 있도록 했으니, SignMe.exe를 코드 사이닝을 아래와 같이 진행합니다.

C:\>signtool signwizard


다음을 선택합니다.

C:\SignMe.exe를 선택합니다.

와 같이 "다음"한뒤, "사용자 지정"을 선택합니다.

"파일에서 선택"을 실행하고, X.509 인증서(*.cer)로 C:\ca.cer 파일을 선택합니다.

다음을 누른뒤, 개인 키 파일로 C:\ca.pvk로 선택합니다.

앞서 인증서 생성시 암호를 입력하였다면, 다음과 같이 입력하세요.

아래와 같이 sha1을 선택합니다.

추가 인증서가 없는 경우 다음을 선택합니다.

필요한 경우 설명을 입력할 수 있습니다.

타임 스탬프 데이터를 추가하려면 선택하세요.

마침을 누릅니다.

필요한 경우, 아래와 같이 암호 입력이 발생할 수 있습니다.

그럼 아래와 같이 SignMe.exe는 유효한 디지털 서명을 받은 실행 파일로 됩니다.

만일, 신뢰된 루트 인증서에 추가하지 않았다면, 디지털 서명은 되어 변조 여부까지는 판단 가능하지만, 유효(즉, 안전한 출처)하지 않다고 오류가 발생할 것입니다.

그럼 이제 관리자 권한으로 실행해 볼까요?

아래와 같이 "게시자를 알 수 없는..." 오류 없이 안전한 파일로 인식되어 진행됨이 확인됩니다.