로컬 PC에서 Self Signed Certificate를 만들어보고 해당 인증서로 바이너리에 코드 사이닝을 해보는 시간을 갖는다.

어떤 작업을 시작하는데 있어서 인증서 관련 비교 분석 할일이 생겨 이것저것 읽어보던 중 Self Signed Certificate 라는게 있어서 한번 알아보았다.


1. cer, pvk 파일 만들기

makecert -r -n "CN=EZBEAT CA" -sv cert.pvk cert.cer


makecert 는 인증서를 생성한다.

-r : self signed certificate 생성

-n : 인증서 이름 설정, 앞에 "CN=" 이라는 prefix를 붙혀야한다.

-sv : private key를 생성해 파일로 저장한다. 확장자는 .pvk

그리고 주어진 인증서 이름으로 인증서를 생성한다. 확장자는 .cer


명령어를 치면 위와 같이 창이 뜨는데 이는 해당 루트 인증서로 서명된 또다른 인증서를 만들 때 필요한 암호를 입력하는 것이다. 만약 필요 없다면 "없음"을 눌르면 된다.


Succeeded라는 메시지가 뜨면서 cert.pvk 파일과 cert.cer 파일이 생성된다.



2. .pfx 파일 만들기

pvk2pfx.exe -pvk cert.pvk -spc cert.cer -pfx cert.pfx


pvk2pfx는 개인키와 인증서에 대한 공개정보를 결합해 .pfx 파일을 만든다.

-pvk : 개인키를 가지고 있는 pvk 파일을 지정

-spc : 인증서에 대한 공개정보를 가지고 있는 .spc파일, 이전 단계에서 생성한 .cer 파일을 지정하면 된다.

-pfx : 생성될 pfx 파일


pfx 파일은 인증서 저장소에 로드될 수 있거나 코드에서 X509Certificate2(string filename) 생성자를 사용해 직접적으로 사용할 수 있다.


아무튼 위 명령어를 입력해주면 아래와 같이 .pfx 파일이 생성되게 된다.


※ 주의할 점은 .pvk와 .pfx 파일은 인증서에 대한 개인키를 가지고 있다. 그렇기 때문에 이 파일이 누군가의 손에 들어가게 된다면 인증서 식별을 스푸핑할 수 있게 된다.

다른 사람들에게 인증서에 대한 정보를 보여주려면, 개인키를 제외한 모든 정보가 포함되어 있는 .cer 파일을 보여주면 된다.


3. 인증서 저장소에 등록

실행창에서 certmgr.msc 를 치면 아래와 같이 창이 뜬다.



개인용이라는 되어 있는 부분에 등록을 하면 인증서를 사용할 수 있다. 

등록하는 방법은 여러가지가 있지만 .pfx 파일을 더블클릭에 나오는 인증서 가져오기 마법사를 사용해 간단히 등록할 수 있다.

이 때 중간에 개인키에 대한 암호를 입력하라는 부분이 나오는데 그냥 입력하지 않고 다음을 눌러주면 된다.



이렇게하고 다음 다음 눌러서 완료하면 끝이난다.


4. 바이너리에 코드 사이닝하기

signtool.exe sign /v /ac cert.cer /s my /n "EZBEAT CA" /t http://timestamp.verisign.com/scripts/timestamp.dll [Target Binary Path]


signtool을 사용해 서명을 진행하면 된다.

sign : 파일 서명

/v : 성공 그리고 상태 메시지를 자세하게 출력한다. 에러에 대한 자세한 정보를 알 수 있다.

/ac : 시그니쳐 블럭에 추가할 인증서를 지정한다.

/s : 인증서를 찾을 때 열 저장소를 지정한다. 디폴트는 "MY" 저장소이다.

/n : 인증서의 subject 이름을 지정한다. (makecert로 인증서 생성할 때 등록한 "CN=" 다음 문자열)

/t : 타임스템프 서버의 URL을 지정한다. (지정하지 않아도 상관은 없지만, 타임스템프가 포함되어 있지 않으면 인증서 유효기간이 만료되면 사용할 수 없다)


위와 같이 명령어를 치면 code signing이 완료된다.




서명이 완료된 바이러에는 위와 같이 디지털 서명이라는 부분이 생겨있다. 


5. 신뢰할 수 있는 루트 인증 기관 등록

4번까지만 해도 무방하지만 관리자 권한으로 실행시킬 때 뜨는 UAC 창까지 이쁘게 뜨게 하려면 해당 인증서는 기본적으로 로컬 PC 상에 등록되어 있는 신뢰할 수 있는 루트 인증 기관에 등록된 업체에서 발급받은 인증서로 사이닝을 한 것이 아니기 때문에 해당 바이너리를 관리자권한으로 실행할 때 뜨는 UAC 창이 다음과 같다. (인증서가 없는 바이너리도 아래와 같이 뜬다)



아까 생성한 .pfx를 가지고 개인용이 아닌 신뢰할 수 있는 루트 인증기관 쪽에도 등록을 해준다음 해당 파일을 관리자 권한으로 실행시키면 다음과 같이 UAC 창이 뜨게 된다.



이는 코드 사이닝 할 때 필요한게 아닌 바이너리가 실행되는 로컬 환경에 인증서가 등록되어 있어야한다.


6. Driver 적용 문제

그러면 kernel에 로드되는 드라이버 파일(.sys)에 위 생성한 인증서를 가지고 사이닝을 하게되면 x64 OS에서 로드가 될 수 있을까? 먼저 해당 인증서를 가지고 사이닝 후 드라이버가 로드될 PC(Windows 8.1 x64)에 인증서를 신뢰할 수 있는 루트 기관에 등록까지 한 후 로드를 해보았더니 다음과 같은 결과가 나왔다.


OSRLOADER를 가지고 했다.



결론은 로드를 할 수 없다.


Windows Vista 그리고 Windows Server 2008 부터는 로드를 할 수 없다. 왜냐하면 드라이버는 cross-signed를 적용해야야하기 때문이다. 위 과정대로 인증서를 생성하고 저장소에 저장해봤자 새롭게 생성된 인증서는 windows chain of trust에 의해 신뢰되지 않았기 때문에 로드가 될 수 없다.


Can I install self-signed drivers on 64-bit Windows without test mode if the self-signed CA root certificate is imported to the machine store?


위 글의 답변에서 마지막 답변 글을 읽어보면 어느정도 알 수 있다.


결론은 64-bit Windows에서 자체 생성한 인증서로는 커널에 드라이버를 로드할 수 없고 승인된 인증기관(CA)에서 발급받은 Software Publishing Certificate 를 사용해야한다.


승인된 인증기관 리스트는 아래 사이트에 나와있다.

(아래 사이트에 있는 리스트가 전부는 아니다.)

Cross-Certificates for Kernel Mode Code Signing


아무튼 그래도 위와 같이 자체 생성한 인증서로 드라이버 로드가 안된다니 천만다행이다 :p

(다른 우회방법이 있을 것 같기도.. 기회되면 해봐야겠다.)


7. 법적 문제

인증서라는게 이 프로그램을 누가 배포했다. 라는걸 나타내기 위함이기 때문에 자체 서명한 인증서로 배포한다고해서 법적으로 문제될 부분은 없다. 다만 승인된 인증기관에서 발급받은 인증서(CA-서명 인증서)가 아니다보니 경고창이 뜰수도 있고 스마트 필터 같은 곳에서 걸릴 수도 있을 것 같다.


8. 결론

종합적으로 봤을 때 SSC(Self Signed Certificate)는 테스트 인증서를 필요로하는 곳에서 테스트 용도로 사용하면 된다. 위에서 설명했듯이 드라이버에는 테스트 조차 불가능하다. 그 외 경우에는 보안 경고 같은게 한번 더 뜨긴 하지만 테스트를 하는데는 지장이 없을 것 같다.

Posted by Ezbeat