개발

커널 드라이버 전자 서명 (디지털 서명, 코드 사인)

MoongStory 2024. 12. 12. 23:32
반응형

드라이버 포함 dll 같은 파일들을 서명하기 위한 방법임.

웹에서 사용되는 SSL 서명과는 다른 것이니 참고 바람.

일단 결론부터 말하자면 서명에 필요한 것은 3가지임.

1. 인증서 (구매 필요.)

2. Root CA 인증서 (구매처에서 제공함. 구매하지 않아도 다운로드 가능.)

3. Microsoft 교차 인증서.

일단 인증서는 SHA1 방식과 SHA2(SHA256) 방식이 있는데 SHA2 방식은 EV(Extended Validation) 인증서라고도 함.

Windows 10의 경우, Windows 10이 처음 발표된 2015년 7월 29일로부터 90일이 경과한 후부터는

기존에 발급받은 SHA1 인증서와 EV 인증서로 서명된 파일들만 인정해 준다고 함.

2016년 이후로는 SHA1 인증서로 서명한 파일은 아예 인식이 안될거라고 들었는데 이미 발급 받아놓은 SHA1 인증서로 서명해도 잘 됨.

그리고 인증서 발급 기관에서 더 이상 SHA1 인증서를 발급하지 않는 것으로 알고 있음. (맞나? 정확하지 않음.)

따라서 설명은 SHA2 기반으로 함. 그리고 내가 사용중인 인증서가 Symantec에서 구입한 인증서 이므로 Symantec이 기준임.

(다른 인증 기관은 설명해주고 싶어도 제가 몰라서... 아마 대동소이하지 않을까 생각됨.)

1. 인증서 (구매 필요)

일단 인증서를 구매해야 함. 어떻게 꼼수로 할 수 있는 방법이 내가 알기로는 전혀 없음.

테스트 서명을 해서 하는 방법이 있긴 하나 PC를 테스트 서명한 파일을 사용할 수 있도록 설정을 해줘야 함.

인증서 가격은 Symantec 기준으로 1년 $499, 2년 $873, 3년 $1248임.

(1년 기준으로 2년짜리를 사면 $100, 3년짜리는 $200 달러를 절약할 수 있음)

돈도 돈이거니와(어차피 회사 돈이니...) 어차피 인증서 만료기간이 지나면 또 구매해야 하므로, 처음부터 3년짜리를 사는게 정신건강에 좋음.

EV 인증서(SHA2)는 토큰(USB)형식이라서 구매하면 토큰을 보내줌. (아닌것도 있는듯)

(토큰 방식이 보안적으로는 더 안전할지 모르나 매번 서명 시 암호를 입력해줘야 해서 자동화 하는데 문제가 많고,

서명 작업을 담당하는 사람이 정해져 있어 그 담당자가 모든 서명을 하지 않으면 토큰을 여러개 구매해야 하거나

돌려가면서 써야 하는데 이게 여간 귀찮은게 아님. 따라서 구매시 신중하게 고려해야 함.)

이 토큰을 컴퓨터에 연결해 놓은 상태여야지만 서명이 가능함. (암호 입력 필요, 암호는 사용자가 설정)

(토큰이 컴퓨터에 연결되어 있어야지 인증서 관리자(실행창에서 certmgr.msc)에서 '개인용' 폴더에 인증서가 나타남.)

(윈도우 원격으로 붙었을 때 서명이 불가능하지만 RAdmin이라는 원격 프로그램으로는 원격으로 전자 서명이 가능하다. (2021.06.25 기준))

Symantec의 경우 SafeNet Authentication Client라고 토큰 관리 프로그램이 있는데, 이 툴로 토큰 관리가 가능.

(비번 변경, Root CA 인증서도 이 프로그래을 통해 설치 가능.)

2. Root CA 인증서 (구매처에서 제공함. 구매하지 않아도 다운로드 가능.)

Symantec 기준으로... 뭘 받아야 하는지 모르겠음. ;;

Symantec에서 제공하는 토큰 관리 툴에 Root CA 인증서가 있어서 그걸로 설치함.

SafeNet Authentication Client Tools를 사용해 CA 인증서를 설치하는 방법은 아래와 같음.

처음 실행하면 아래 이미지에서 빨간 네모로 표시한 톱니바퀴 모양의 설정 아이콘을 클릭.

왼쪽 트리 목록에서 'CA 인증서'를 클릭하면 오른쪽에 CA 인증서가 나옴. 이를 더블 클릭. (둘 다 설치해야 함.)

더블 클릭하면 이런 창이 뜨는데 '인증서 설치' 버튼을 눌러 설치하면 됨.

주의 할 점은 기존에 설치 되어 있는 동일한 인증 기관에서 발급한 이전 버전 인증서들은 모두 지워줘야 함.

아래 이미지 보면 'VeriSign Class 3 Public Primary Certification Autiority - G5' 라고 되어 있는데

이전 버전은 G4, G3 이런식으로 되어 있음.

아무튼 이런 식으로 2개의 CA 인증서를 모두 설치해주면 됨.

3. Microsoft 교차 인증서

이 인증서는 Microsoft에서 제공함.

교차 인증서는 아래 링크에서 다운로드 가능.

https://msdn.microsoft.com/windows/hardware/drivers/install/cross-certificates-for-kernel-mode-code-signing

 

나 같은 경우는 Symantec 인증서를 구입해서 VeriSign 인증서를 받음.

(VeriSign Class 3 Public Primary Certification Authority – G5)

다운 받은 인증서는 마음대로 파일명을 변경하여 사용 가능.

교차 인증서를 새로 받아야 되는 이유는 1996년부터 발급된 전자서명 인증서(Verisign 기준 - 현재 Symantec에 인수됨.)가 1024비트 서명키를 사용하고 있었기 때문인데,

2006년부터 공인 CA 루트 인증서가 모두 2048비트 기반으로 업데이트 되었고, 이후 발급받은 인증서들은 모두 해당 루트 인증서를 기반으로 하고 있음.

하지만, Microsoft 코드 사인 교차 인증서(Cross Certificate)는 아직 예전 발급된 CA에 대해서 교차 서명하고 있기 때문에 이를 처리하지 못함.

위 3가지의 설정이 모두 끝났으면 이제 서명이 가능함.

예를 들면,

signtool.exe sign /fd SHA256 /v /ac "MS 교차 인증서.cer" /s my /n "회사 이름 Co., Ltd" /d "프로그램 이름" /du "http://www.회사홈페이지.co.kr" /t http://timestamp.verisign.com/scripts/timestamp.dll "서명할 파일 명.sys"

위 명령어로 서명을 하면 됨.

'/fd SHA256'은 SHA256 알고리즘을 사용하여 서명을 하겠다는 옵션이고 빼먹을 경우 SHA1이 디폴트 값임.

(signtool 최신 버전은 SHA256이 default 값인 것 같음. 하지만 좀더 명확하게 확인이 가능하고 혹시나 있을 실수를 줄이기 위해서도 옵션을 명시해 놓는게 좋을 것 같음.)

'MS 교차 인증서.cer'는 위에서 설명한 '3. Microsoft 교차 인증서'에서 다운 받은 파일의 경로를 입력해주면 됨.

'회사 이름 Co., Ltd'와 '프로그램 이름' 부분은 서명한 파일을 실행할 때(.exe 파일이라면) 뜨는 UAC 창에서 '게시자'와 '프로그램' 이었나... 암튼 UAC 창에서 보여지는 항목임.

'서명할 파일 명.sys'는 실제 서명할 파일의 경로를 넣어주면 됨.

SignTool은 Windows SDK를 설치하면 되는데 SignTool의 버전이 낮을 경우 SHA2 옵션이 없으니 낮은 버전은 받지 말도록 하자.

'Microsoft Windows SDK for Windows 7 and .NET Framework 4' 이상을 받으면 된다. (/fd 옵션이 있는 것 확인함.)

구글에서 'signtool' 또는 'signtool download' 로 검색하면 SignTool에 관련된 문서가 나오는데 해당 문서에 다운로드 링크가 있다.

https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa387764(v=vs.85).aspx

아니면 바로 'Microsoft Windows SDK for Windows 7 and .NET Framework 4'를 검색해도 된다.

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

위와 같이 서명을 했는데도 Windows 7에서 서명이 안되어 있다고 나올수가 있는데,

이는 Windows 7에서 SHA256 알고리즘을 인식하지 못해서이다.

이럴경우 Microsoft Windows 보안 업데이트 KB3033929를 업데이트한 이후에 다시 시도해 보자.

https://www.microsoft.com/ko-kr/download/details.aspx?id=46148

그래도 안된다면... 나도 모르겠다;;

그리고 Windows XP는 SHA256 알고리즘을 아예 인식하지 못한다. VISTA도 마찬가지.

(XP의 경우 SP3에 한해 SHA256을 부분적으로 지원된다고 한다. 그러나 지원하지 않는다고 생각하는 편이 나을 것 같다.)

https://support.globalsign.com/customer/portal/articles/1499561-sha-256-compatibility

VISTA의 경우 Windows 7과 마찬가지로 윈도우 업데이트를 통해 SHA256 알고리즘을 인식할 수는 있는데

https://support.microsoft.com/en-us/kb/2763674

VISTA 또는 Windows 7 이하는 SHA1 알고리즘을 사용한 서명 파일을 사용하는 것이 좋다.

(VISTA의 경우 서비스팩을 설치해야 되는 것 같은데 설치를 거부하는 고객들이 있다.)

문제는 발급 기관에서 SHA1 인증서를 더 이상 발급해주지 않는다는 것인데... (정확하진 않음.)

기존에 발급받은 SHA1 인증서의 유효 기간이 지나버린다면... XP는 더 이상 지원이 불가능하다는 얘기가 된다.

Windows 10 부터는 드라이버 파일을 서명할 때 Windows Hardware Developer Center Dashboard portal 을 통해서

인증을 받은 서명만 인정을 해준다고 하니 Windows 10에서 사용될 드라이버 파일은 반드시 이 과정을 거쳐야 함.

Dirver 인증과 관련하여 Windows 10 에서부터 변경된 사항은 다음 문서 참조 바람. (Driver Signing changes in Windows 10)

https://blogs.msdn.microsoft.com/windows_hardware_certification/2015/04/01/driver-signing-changes-in-windows-10/

근데 이 과정이 더럽게 복잡함. 그래서 좀 더 간결한 방법을 제공하는데 'Attestation Signing' 라는 방법임.

(Attestation Signing a Kernel Driver for Public Release)

https://msdn.microsoft.com/windows/hardware/drivers/develop/attestation-signing-a-kernel-driver-for-public-release

그리고 Microsoft 대쉬보드를 통해서 인증을 받으려면 반드시 cab 파일의 형태여야 하는데, cab 파일을 만들기 위해서는 inf 파일이 반드시 필요함.

기존에 사용하는 inf 파일이 있다면 그 inf 파일을 사용하면 되고, 만약 inf 파일 없이 sys 파일만 사용하고 있었다면 최소 양식의 inf 파일을 사용하여 cab 파일을 만들면 됨.

양식은 아래 링크 참조

https://moong-story.tistory.com/entry/inf-%ED%8C%8C%EC%9D%BC-%EC%96%91%EC%8B%9D

 

드라이버 파일 인증 관련 문제가 있을 경우엔 sysdev@microsoft.com 으로 문의를 하면 됨. 물론 망할 영어로.

반응형