Windows Digital Signature

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

응용 프로그램을 만들어 서버에 업로드 후 배포를 하게 되면 다운로드를 받거나 다운로드 받은 응용 프로그램을 다른 컴퓨터에서 실행할려고 하면 출처가 불명확한 게시자없음으로 인해 악성 프로그램으로 인식하게 된다.
그래서 이를 해결할려면 디지털 서명을 응용프로그램 안에 넣어야 한다.

사설 인증서를 생성하고 이를 PC내의 신뢰된 루트 인증 기관 리스트에 강제 추가한뒤, 이를 가지고 디지털 서명하는 절차를 정리한다.

  • Microsoft Windows SDK 사용하는 방법
  • Microsoft SignTool 사용하는 방법

확인해 보니 보통 openssl을 이용할 거나, MS Windows SDK, MS SignTool 등등 있었다. 여기서는 MS에서 제공한 Microsoft Windows SDK 툴을 기반으로 진행한다.

Microsoft Windows SDK 설치

다운로드:https://www.microsoft.com/en-us/download/details.aspx?id=8279

설치가 완료되면 설치파일 경로에서 C:\Program Files\Microsoft Platform SDK ... \Bin 경로에서 명령프롬프트를 관리자 권한으로 실행한다.

루트 인증서 진행 과정

XXXXXXXXX에 인증서 이름을 넣고 명령어를 실행한다. 앞선 “신뢰할 수 있는 루트 인증 기관” UI의 “발급 대상”에 해당된다고 보면 된다.

1
2
3
4
$ makecert -n "CN=XXXXXXXXX" -r -sv  ca.pvk ca.cer

// ex)
$ makecert -n "CN=woonyzzang Co." -r -sv ca.pvk ca.cer

그럼 아래와 같은 창이 뜨는데,
설치진행과정1
이는 해당 루트 인증서로 서명된 또다른 인증서를 만들때 필요한 암호를 입력하는 것입니다. 만일, 관여하지 않겠다면 “없음”해도 무방 하다.
여기서는 암호키를 입력하고 진행한다. (주의: 개인 키 암호를 임의로 입력 시 암호 기억)
그러면 해당 디렉토리에 .cer과 .pvk파일이 생성된다.
.cer 파일은 배포 가능한 인증서 파일이며, .pvk 파일은 개인키 파일이므로, 신중히 보관하시기 바란다.

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

1
$ cert2spc.exe ca.cer ca.spc

와 같이 구할 수 있습니다.

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

1
$ certmgr.exe -add ca.cer -s -r localMachine root

위와 같이 입력하면 ca.cer을 인증기관으로 등록절차가 완료된다.

이제 Internet Explorer > 도구 > 인터넷 옵션 > 내용 > 인증서에 들어가 보면, 아래와 같이 “신뢰할 수 있는 루트 인증 기관”에 woonyzzang Co.가 포함된것을 확인할 수 있다.
설치진행과정2

사설 인증서를 “신뢰”할 수 있도록 등록 된걸 확인 했다면, 다시 명령프롬프트로 돌아가서 아래 명령어를 입력한다.

1
$ signtool signwizard

그럼 다음과 같이 창이 생성된다.
설치진행과정3
다음 버튼을 선택한다.

설치진행과정4
디지털 서명 마법사에서 찾아보기를 클릭 후 디지털 파일 서명할 해당 파일을 선택 후 다음 버튼을 선택한다.

설치진행과정5
사용자 지정을 선택하고 다음을 선택한다.

설치진행과정6
오른쪽에 “파일에서 선택”을 선택한다.

설치진행과정7
오른쪽에 X.509인증서로 바꾼 후에 X.509 인증서(*.cer)을 선택한다.

설치진행과정8
이제 다음을 선택한다.

설치진행과정9
디스크의 개인 키 파일에서 ca.pvk 파일 경로를 찾아 선택 후 다음버튼을 선택한다.

설치진행과정10
처음에 입력한 암호를 입력한다.

설치진행과정11
sha1을 선택하고 다음버튼을 선택한다.

설치진행과정12
필요한 경우 설명을 입력할 수 있다. 여기서는 별다른 설정없이 다음버튼을 선택한다.

설치진행과정13
필요한 경우 설명을 입력 할 수 있다. 여기서는 역시 별다른 설명없이 다음버튼을 선택한다.

설치진행과정14
타임스탬프를 추가할 일이 없으면 다음버튼을 선택한다.

설치진행과정15
디지털 서명이 완료되었다. 마침을 눌러 암호를 한번 더 입력하고 나면 완료된다.

설치진행과정16
이제 디지털 서명이 등록되었습니다. 인터넷을 통해 배포할 때 악성코드로 인식되지 않게 된다.

설치진행과정17
디지털 서명이 잘 등록되었는지 확인 해 볼려면 디지털 서명 받은 실행파일에서 마우스 우측 컨텍스트 메뉴를 열어 속성 > 디지털서명 > 자세히보기 클릭 후 확인해 보면 인증서가 제대로 등록된것을 확인 할 수 있다.
만일, 신뢰된 루트 인증서에 추가하지 않았다면, 디지털 서명은 되어 변조 여부까지는 판단 가능하지만, 유효(즉, 안전한 출처)하지 않다고 오류가 발생할 것이다.

이슈

디지털 서명을 해도 테스트 해보니 여전히 익스플로러나 크롬브라우저에서 역시나 악성코드로 인식되는 것이 확인 되었다.
신뢰된 인증기관에서 발급된 것이 아니라 그런듯 해서 자료를 더 찾아보니 아래와 같은 명성치라는 이슈를 알게 되었다.

명성치

MS의 SmartScreen filter는 인증서들에 대한 자체적인 white list DB를 관리하며 해당 인증서가 안전한지 아닌지 판단합니다. 새로 등록된 인증서로 만들어진 파일이 일정 횟수 이상, 일정 기간 이상 동안, 일정 사용자들에게 다운로드 되고, 신고 건수가 없어야 안전한 파일로 white list에 등록한다(SmartScreen filter는 원래 IE에 존재하던 기능이었다가 Windows 8부터는 OS 자체 기능으로도 추가되었다). Google의 Chrome도 이와 비슷한 로직을 가지고 있다.
즉, 일정 수준을 명성을 쌓기 전까지는 위험한 프로그램 취급을 하여 사용자들에게 경고 메시지를 보여 준다. 하지만 여기서 답답한 부분은 필요한 ‘다운로드 수’, ‘다운로드 인원’, ‘처리되는 기간’ 등 중요한 정보들이 공개 되어있지 않다는 것이다.

Microsoft SignTool 설치

다운로드: https://msdn.microsoft.com/en-us/library/windows/desktop/aa387764(v=vs.85).aspx

1
2
3
4
5
$ Signtool.exe sign 
/a
/f "{인증서 경로}"
/p "{인증서 비밀번호}"
/t "{인증서에 따른 Timestamp 서버 주소 예) http://timestamp.verisign.com/scripts/timestamp.dll}"

참조

공유하기