성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>정식 인증서가 있는 경우 Device Driver 서명하는 방법</h1> <p> (여기서 말하는 인증서는 소프트웨어 서명용 인증서입니다. 쉽게 말해 ActiveX 서명 시에 사용했던 바로 그 인증서입니다.)<br /> <br /> 지난번에 만든 NT Legacy Driver를,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ZwTerminateProcess로 프로세스를 종료하는 Device Driver 프로그램 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/2904'>http://www.sysnet.pe.kr/2/0/2904</a> </pre> <a name='test_sign'></a> <br /> 테스트 인증서로 서명하는 경우 "bcdedit /set testsigning on" 옵션을 켜야 하는데요. 이로 인해 2가지 사소한 문제가 발생합니다. 하나는 바탕화면에 별로 원치 않는 문구가 뜬다는 것이지요. ^^ 이렇게! (달리 말하면, 테스트 인증서로 서명한 드라이버 사용을 허용하기 때문에 자칫 보안 허점으로 이어질수도 있습니다.)<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='kmcs_sign_0.png' src='/SysWebRes/bbs/kmcs_sign_0.png' /><br /> <br /> 나머지 하나는 요즘 들어 사용되고 있는 "SecureBoot" 옵션이 켜진 컴퓨터에서는 바이오스 단계부터 옵션을 해제해서 들어가는 등 불편한 점이 제법 있습니다.<br /> <br /> 따라서, 어느샌가 개발자 PC에서 테스트를 할 때조차도 정식 인증서가 있다면 그걸 사용하는 것이 더 나은 상황이 된 것입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그런데, 테스트 인증서로 드라이버를 서명하는 방법은 많이 공개되어 있는데 ("bcdedit /set testsigning <span style='color: blue; font-weight: bold'>off</span>" 환경에서도 잘 동작하도록) 정식 인증서로 서명하는 방법에 대한 설명은 (한글 자료로) 별로 볼 수가 없어서 이렇게 글을 작성하게 되었습니다. ^^ <br /> <br /> 사실, 방법은 마이크로소프트 사이트에 자세하게 공개되어 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Kernel-Mode Code Signing Walkthrough ; <a target='tab' href='https://learn.microsoft.com/en-us/previous-versions/windows/hardware/design/dn653569(v=vs.85)'>https://learn.microsoft.com/en-us/previous-versions/windows/hardware/design/dn653569(v=vs.85)</a> </pre> <br /> 위의 사이트에 공개된 "KMCS_Walkthrough.doc" 파일을 다운로드 받아 내용을 한번 살펴 보도록 하겠습니다.<br /> <br /> 우선, "Step 1: Prepare the Computer for Test-Signing", "Step 2: Create a Test Certificate by Using MakeCert"의 내용은 정식 인증서를 사용할 것이므로 넘어가도 됩니다. 그리고, "Step 3: Create a Catalog File for Test-Signing"의 내용을 보면 .cat 파일을 생성하는 방법이 나오는데... 음... 읽기 귀찮아지는군요. ^^<br /> <br /> 다행인 것은 "Step 6: Test-Sign a Driver Image File by Using an Embedded Signature"에서 .cat 서명이 아닌 .sys 파일 자체에 대한 "Embedded Signature" 방법도 있음을 알려주고 있습니다. 그리고 "Embedded Signature" 방식이 동작하기 위해서는 드라이버 유형이 다음에 속해야 한다고 합니다.<br /> <br /> <ol> <li>When the driver package contains a boot-start driver.</li> <li>When the driver is installed as part of an application and does not use a catalog file.</li> </ol> <br /> "<a target='tab' href='http://www.sysnet.pe.kr/2/0/2904'>ZwTerminateProcess로 프로세스를 종료하는 Device Driver 프로그램</a>" 글에서 만든 NT Legacy driver는 "Boot-Start" 드라이버는 아닙니다. 하지만, INF 파일을 이용해 설치되지 않고 응용 프로그램이 사용하는 유형이므로 2번째에는 해당합니다. 다시 말해, "<a target='tab' href='http://www.sysnet.pe.kr/2/0/2904'>ZwTerminateProcess로 프로세스를 종료하는 Device Driver 프로그램</a>"에서 만든 드라이버는 .cat 파일 없이 "Embedded Signature" 방식을 적용하면 되는 것입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 위에서 말한 "Embedded Signature" 방식은, 예전에 Appinit_Dlls를 서명했던 바로 그 방식입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Appinit_Dlls로 구현한 환경변수 설정 DLL ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/883'>http://www.sysnet.pe.kr/2/0/883</a> </pre> <br /> 즉, 다음의 2가지 절차를 따르면 되는데,<br /> <br /> <ol> <li>DLL 빌드 시에 "/integritycheck" 옵션을 준다.</li> <li>교차 인증서(cross-certificate)를 같이 사용해서 서명한다.</li> </ol> <br /> 1번은 <a target='tab' href='http://www.sysnet.pe.kr/2/0/883'>"Appinit_Dlls 로 구현한 환경변수 설정 DLL"</a> 글에서도 자세히 설명했으므로 2번을 좀 더 보겠습니다.<br /> <br /> 제가 테스트한 인증서는 "Synmantec Class 3 SHA256 Code Signing CA"를 거쳐 "VeriSign"이 루트입니다. 그리고 루트 인증서의 정보를 보면 "VeriSign Class 3 Public Primary Certification Authority - G5"라고 되어 있는 것을 속성창을 통해 확인할 수 있습니다. (이 문자열을 잘 봐두어야 합니다.)<br /> <br /> <img alt='kmcs_sign_1.png' src='/SysWebRes/bbs/kmcs_sign_1.png' /><br /> <br /> 이제 그 문자열로 다음의 사이트에서 해당하는 교차 인증서를 다운로드 받습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Cross-Certificates for Kernel Mode Code Signing ; <a target='tab' href='https://learn.microsoft.com/en-us/windows-hardware/drivers/install/cross-certificates-for-kernel-mode-code-signing'>https://learn.microsoft.com/en-us/windows-hardware/drivers/install/cross-certificates-for-kernel-mode-code-signing</a> </pre> <br /> 제 경우에는 다음의 인증서가 되는 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <span style='color: blue; font-weight: bold'>VeriSign Class 3 Public Primary Certification Authority - G5</span> Root certificate thumbprint: 57 53 4c cc 33 91 4c 41 f7 0e 2c bb 21 03 a1 db 18 81 7d 8b Download cross-certificate for VeriSign Class 3 Public Primary Certification Authority - G5 in a 2 KB zip file. 다운로드: <a target='tab' href='http://go.microsoft.com/fwlink/?LinkId=321787'>http://go.microsoft.com/fwlink/?LinkId=321787</a> </pre> <br /> 다운로드 받은 "VeriSign Class 3 Public Primary Certification Authority - G5.zip" 파일의 압축을 풀면 "VeriSign Class 3 Public Primary Certification Authority - G5.cer" 파일이 나옵니다. 이 인증서를 등록할 필요는 없고 다음과 같이 signtool.exe의 인자에 교차 인증서 파일명과 여러분의 소프트웨어 서명 인증서를 지정해 실행하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Signtool sign /v /ph <span style='color: blue; font-weight: bold'>/ac "VeriSign Class 3 Public Primary Certification Authority - G5.cer"</span> /sm /n "YourCertName" /t http://timestamp.verisign.com/scripts/timestamp.dll test.sys </pre> <br /> 이렇게 서명이 완료된 .sys 파일은 "<a target='tab' href='https://learn.microsoft.com/en-us/windows-hardware/drivers/install/the-testsigning-boot-configuration-option'>bcdedit /set testsigning on</a>" 옵션을 적용하지 않은 운영체제에서도 잘 동작합니다. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
8175
(왼쪽의 숫자를 입력해야 합니다.)