성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
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'>지연 서명된 DLL과 서명된 DLL의 차이점</h1> <p> 간단하게 공개키만을 포함한 .snk 파일로 지연 서명된 프로젝트와 개인키까지 모두 포함한 .snk 파일로 서명된 프로젝트를 만들어 테스트해 보면 됩니다. 지난번 쓴 글에 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 닷넷의 어셈블리 서명 데이터 확인 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/10816'>http://www.sysnet.pe.kr/2/0/10816</a> </pre> <br /> 지연 서명된 어셈블리의 경우 COM_DESCRIPTOR의 "StrongNameSignatureRVA"가 가리키는 영역을 "StrongNameSignatureSize"만큼 0으로 채워져 있는 반면, 개인키로 서명된 어셈블리의 경우 그곳이 0이 아닌 다른 값으로 채워져 있습니다. 또한, "Flags" 값도 지연 서명된 경우 1이지만 서명된 경우에는 "CorFlags::StrongNameSigned = 0x08" 값이 더해져 9가 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [Flags] public enum CorFlags { ILOnly = 0x00000001, Requires32Bit = 0x00000002, ILLibrary = 0x00000004, <span style='color: blue; font-weight: bold'>StrongNameSigned = 0x00000008,</span> NativeEntryPoint = 0x00000010, TrackDebugData = 0x00010000, Prefers32Bit = 0x00020000, } </pre> <br /> 혹시, IL 코드 차원에서 다른 점이 있을까요? 다음과 같이 ildasm.exe를 이용해 실행해 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ildasm delay_signed.dll /out=delay_signed.il ildasm signed.dll /out=signed.il </pre> <br /> 오직 .corflags의 값만 차이가 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // 서명된 어셈블리의 .il 파일 .corflags 0x00000009 // ILONLY | StrongNameSigned // 지연 서명된 어셈블리의 .il 파일 .corflags 0x00000001 // ILONLY </pre> <br /> <hr style='width: 50%' /><br /> <br /> 빌드된 delay_signed.dll과 signed.dll을 참조해서 Console 프로그램을 실행하면 어떻게 될까요? 지난번에 설명한 bypassTrustedAppStrongNames 옵션에 의해,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > bypassTrustedAppStrongNames 옵션 설명 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11257'>http://www.sysnet.pe.kr/2/0/11257</a> </pre> <br /> .NET 3.5 SP1부터는 잘 실행될 것 같지만 의외로 delay_signed.dll 파일을 참조한 경우 "System.Security.SecurityException: Strong name validation failed." 예외가 발생합니다. 왜냐하면, 역시 위의 글에서 설명했던 bypassTrustedAppStrongNames 옵션이 적용되기 위한 4가지 조건 중에서 1번 항목인 "Fully signed (delay signed assemblies still require a skip verification entry)"의 괄호 안 설명에 해당하기 때문입니다. 즉, bypassTrustedAppStrongNames 조건은 지연 서명된 어셈블리에 대해서는 서명 작업을 제외하지 않습니다.<br /> <br /> 지연 서명된 어셈블리를 참조한 EXE를 실행하기 위해서는 <a target='tab' href='http://www.ryangerard.net/post/8768827919/assembly-verification-skipping-on-win7-64-bit-and'>sn.exe로 검증 작업을 생략하겠다고 명시적인 설정</a>을 해야 합니다. 가령, 위의 상황에서는 다음과 같이 (관리자 권한으로) 실행해 줘야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > sn.exe -Vr delay_signed.dll </pre> <br /> 이때 주의할 것은, sn.exe가 32비트인지, 64비트인지에 따라 레지스트리에 등록되는 위치가 다르기 때문에 지연 서명된 어셈블리를 사용하는 EXE 실행 파일의 32/64비트에 맞는 것을 실행해야 합니다.<br /> <br /> 가령, 제 컴퓨터는 sn.exe 파일이 다음과 같은 위치에 있고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\sn.exe" "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\sn.exe" </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'>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\</span>delay_signed,18ABA4DC2BC6D8E2 <span style='color: blue; font-weight: bold'>HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\StrongName\Verification\</span>delay_signed,18ABA4DC2BC6D8E2 </pre> <br /> 키 형식을 보면, "[assembly_name],[public_key_token]" 값인데 공통된 공개키 토큰 값을 가지는 모든 지연 서명된 어셈블리에 대해 서명 확인을 생략하고 싶다면 regedit.exe를 이용해 키값을 다음과 같이 '*' 문자로 바꾸면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\*,18ABA4DC2BC6D8E2 </pre> <br /> 이렇게 등록해 주고 실행하면 지연 서명된 어셈블리를 참조한 경우에도 문제없이 잘 실행되는 것을 볼 수 있습니다.<br /> <br /> (<a target='tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=1162&boardid=331301885'>첨부 파일은 이 글의 테스트용 프로젝트를 포함</a>합니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 지연 서명된 어셈블리의 목적이 궁금하신 분들이 계실 텐데요.<br /> <br /> 가령, 보안이 중요한 기업의 경우 개인키를 포함한 .snk 파일을 보호하고 싶을 텐데, 그런 기업에서 바로 이 '지연 서명된 어셈블리' 방식을 채택할 수 있습니다. 왜냐하면, 제품 개발팀에는 공개키만 있는 .snk 파일을 주어 지연 서명된 어셈블리로 만들어 테스트할 수 있게 하고, 마지막 릴리스 시에 개인 키를 갖고 있는 전담 팀에서 서명하는 방식으로 진행할 수 있기 때문입니다. 실제로, <a target='tab' href='https://blogs.msdn.microsoft.com/shawnfa/2004/03/17/delay-signing/'>마이크로소프트가 .NET BCL 라이브러리들에 대한 서명을 그런 식으로 처리</a>하고 있습니다.<br /> <br /> 국내에서는... 글쎄요, .snk 파일을 담당하는 전담 부서는 없을 거라고 봅니다. (있다면 덧글 좀! ^^)<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1926
(왼쪽의 숫자를 입력해야 합니다.)