게임 개발자를 위한 Authenticode 서명
데이터 인증은 게임 개발자에게 점점 더 중요해지고 있습니다. Windows Vista 및 Windows 7에는 자녀 보호와 같은 다양한 기능이 있으며, 아무도 데이터를 변조하지 않도록 게임을 제대로 서명해야 합니다. Microsoft Authenticode를 사용하면 최종 사용자와 운영 체제에서 프로그램 코드가 정당한 소유자로부터 제공되고 악의적으로 변경되거나 실수로 손상되지 않았는지 확인할 수 있습니다. 이 문서에서는 게임 인증을 시작하는 방법과 인증을 일상적인 빌드 프로세스에 통합하는 방법을 설명합니다.
참고 항목
2016년 1월 1일부터 Windows 7 이상은 만료 날짜가 2016년 1월 1일 이상인 SHA-1 코드 서명 인증서를 더 이상 신뢰하지 않습니다. 자세한 내용은 Authenticode 코드 서명 및 타임스탬핑의 Windows 적용을 참조하세요.
배경
디지털 인증서는 작성자의 ID를 설정하는 데 사용됩니다. 디지털 인증서는 VeriSign 또는 Thawte와 같은 CA(인증 기관)라고 하는 신뢰할 수 있는 타사에서 발급합니다. CA는 소유자가 거짓 식별을 주장하지 않는지 확인할 책임이 있습니다. CA에 인증서를 적용한 후 상용 개발자는 2주 이내에 애플리케이션에 대한 응답을 기대할 수 있습니다.
CA는 정책 기준을 충족한다고 결정한 후 버전 3 확장을 사용하여 국제 통신 연합에서 만든 업계 표준 인증서 형식인 X.509를 준수하는 코드 서명 인증서를 생성합니다. 이 인증서는 귀하를 식별하고 공개 키를 포함합니다. 참조를 위해 CA에 의해 저장되며 복사본이 전자적으로 제공됩니다. 동시에 안전하게 유지해야 하며 CA와도 다른 사람과 공유해서는 안 되는 프라이빗 키를 만듭니다.
공개 및 프라이빗 키가 있으면 서명된 소프트웨어 배포를 시작할 수 있습니다. Microsoft는 Windows SDK에서 이 작업을 수행하는 도구를 제공합니다. 이 도구는 단방향 해시를 활용하고 고정 길이 다이제스트를 생성하며 프라이빗 키를 사용하여 암호화된 서명을 생성합니다. 그런 다음, 암호화된 서명을 인증서 및 자격 증명과 결합하여 서명 블록이라고 하는 구조로 결합하고 실행 파일의 파일 형식에 포함합니다. DLL, 실행 파일 및 캐비닛 파일을 포함하여 모든 형식의 실행 파일 이진 파일에 서명할 수 있습니다.
서명은 여러 가지 방법으로 확인할 수 있습니다. 프로그램은 CertVerifyCertificateChainPolicy 함수를 호출할 수 있으며 SignTool(signtool.exe)을 사용하여 명령줄 프롬프트에서 서명을 확인할 수 있습니다. Windows 탐색기에는 서명된 이진 파일의 각 인증서를 표시하는 파일 속성의 디지털 서명 탭도 있습니다. (디지털 서명 탭은 서명된 파일의 파일 속성에만 나타납니다.) 또한 CertVerifyCertificateChainPolicy를 사용하여 애플리케이션을 자체 확인할 수 있습니다.
Authenticode 서명은 최종 사용자의 데이터 인증에 유용할 뿐만 아니라 제한된 사용자 계정의 패치 및 Windows Vista 및 Windows 7의 자녀 보호에도 필요합니다. 또한 Windows 운영 체제의 향후 기술에는 코드 서명이 필요할 수도 있으므로 모든 전문 및 아마추어 개발자가 CA에서 코드 서명 인증서를 획득하는 것이 좋습니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 신뢰할 수 있는 인증 기관 사용의 이 문서 뒷부분에서 확인할 수 있습니다.
게임 코드, 패치 관리자 및 설치 관리자는 코드에서 파일이 인증되었는지 확인하여 Authenticode 서명을 추가로 활용할 수 있습니다. 이는 부정 행위 방지 및 일반 네트워크 보안에 사용할 수 있습니다. 파일의 서명 여부를 확인하는 예제 코드는 C 프로그램 예제: PE 파일의 서명 확인 및 서명된 파일의 서명 인증서 소유권을 확인하는 예제 코드는 다음 위치에서 찾을 수 있습니다. Authenticode 서명된 실행 파일에서 정보를 가져오는 방법.
시작하기
시작하기 위해 Microsoft는 코드 서명 프로세스를 수행하고 확인하는 데 도움이 되는 Visual Studio 2005 및 Visual Studio 2008 및 Windows SDK 도구를 제공합니다. Visual Studio 또는 Windows SDK를 설치한 후 이 기술 문서에 설명된 도구는 설치의 하위 디렉터리에 있으며 다음 중 하나 이상이 포함될 수 있습니다.
- %SystemDrive%\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
- %SystemDrive%\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Bin
- %SystemDrive%\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\
- %SystemDrive%\Program Files\Microsoft SDKs\Windows\v6.0A\bin\
다음 도구는 코드 서명에 가장 유용합니다.
-
인증서 만들기 도구(MakeCert.exe)
-
공개 키와 프라이빗 키를 포함하는 테스트 X.509 인증서를 .cer 파일로 .pvk 파일로 생성합니다. 이 인증서는 내부 테스트 목적으로만 사용되며 공개적으로 사용할 수 없습니다.
-
pvk2pfx.exe
-
.cer 및 .pvk 파일 쌍에서 개인 정보 교환(.pfx) 파일을 만듭니다. .pfx 파일에는 퍼블릭 키와 프라이빗 키가 모두 포함됩니다.
-
SignTool(SignTool.exe)
-
.pfx 파일을 사용하여 파일에 서명합니다. SignTool은 DLL 파일, 실행 파일, Windows Installer(.msi) 파일 및 캐비닛(.cab) 파일의 서명을 지원합니다.
참고 항목
다른 설명서를 읽는 동안 SignCode(SignCode.exe)에 대한 참조를 찾을 수 있지만 이 도구는 더 이상 사용되지 않으며 더 이상 지원되지 않습니다. 대신 SignTool을 사용합니다.
신뢰할 수 있는 인증 기관 사용
신뢰할 수 있는 인증서를 얻으려면 VeriSign 또는 Thawte와 같은 CA(인증 기관)에 적용해야 합니다. Microsoft는 다른 CA보다 CA를 권장하지 않지만 WER(Windows 오류 보고) 서비스에 통합하려면 VeriSign을 사용하여 인증서를 발급하는 것이 좋습니다. WER 데이터베이스에 액세스하려면 VeriSign ID가 필요한 WinQual 계정이 필요하기 때문입니다. 신뢰할 수 있는 타사 인증 기관의 전체 목록은 Microsoft 루트 인증서 프로그램 구성원을 참조 하세요. WER에 등록하는 방법에 대한 자세한 내용은 ISV 영역의 "Windows 오류 보고 소개"를 참조하세요.
CA에서 인증서를 받은 후 SignTool을 사용하여 프로그램에 서명하고 프로그램을 대중에게 공개할 수 있습니다. 그러나 .pfx 및 .pvk 파일에 포함된 프라이빗 키를 보호해야 합니다. 이러한 파일을 안전한 위치에 유지해야 합니다.
테스트 인증서 사용 예제
다음 단계에서는 테스트 목적으로 코드 서명 인증서를 만든 다음 이 테스트 인증서를 사용하여 Direct3D 샘플 프로그램(BasicHLSL.exe이라고 함)에 서명하는 방법을 보여 줍니다. 이 절차에서는 공용 인증에 사용할 수 없는 .cer 및 .pvk 파일(각각 퍼블릭 및 프라이빗 키)을 만듭니다.
이 예제에서는 서명에도 타임스탬프를 추가합니다. 타임스탬프는 인증서가 만료되면 서명이 유효하지 않게 합니다. 서명되었지만 타임스탬프를 사용하지 않는 코드는 인증서가 만료된 후 유효성을 검사하지 않습니다. 따라서 공개적으로 릴리스된 모든 코드에는 타임스탬프를 사용해야 합니다.
인증서를 만들고 프로그램에 서명하려면
인증서 만들기 도구(MakeCert.exe)를 사용하여 테스트 인증서 및 프라이빗 키를 만듭니다.
다음 명령줄 예제에서는 MyPrivateKey를 프라이빗 키(.pvk) 파일의 파일 이름으로, MyPublicKey를 인증서(.cer) 파일의 파일 이름으로, MySoftwareCompany를 인증서 이름으로 지정합니다. 또한 신뢰할 수 없는 루트 권한이 없도록 인증서를 자체 서명합니다.
MakeCert /n CN=MySoftwareCompany /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /e 12-31-2020 /sv MyPrivateKey.pvk MyPublicKey.cer
pvk2pfx.exe 사용하여 개인 키(.pvk) 파일 및 인증서(.cer) 파일에서 개인 정보 교환(.pfx) 파일을 만듭니다.
.pfx 파일은 공용 키와 프라이빗 키를 단일 파일로 결합합니다. 다음 명령줄 예제에서는 이전 단계의 .pvk 및 .cer 파일을 사용하여 암호 your_password MyPFX라는 .pfx 파일을 만듭니다.
pvk2pfx.exe -pvk MyPrivateKey.pvk -spc MyPublicKey.cer -pfx MyPFX.pfx -po your_password
SignTool을 사용하여 개인 정보 교환(.pfx) 파일로 프로그램에 서명합니다.
명령줄에서 몇 가지 옵션을 지정할 수 있습니다. 다음 명령줄 예제에서는 이전 단계의 .pfx 파일을 사용하고, your_password 암호로 제공하고, BasicHLSL을 서명할 파일로 지정하고, 지정된 서버에서 타임스탬프를 검색합니다.
signtool.exe sign /fd SHA256 /f MyPFX.pfx /p your_password /v /t URL_to_time_stamp_service BasicHLSL.exe
참고 항목
타임스탬프를 서비스에 대한 URL은 CA에서 제공하며 테스트에 선택 사항입니다. 프로덕션 서명에 유효한 타임스탬프를 포함하는 것이 중요하거나 인증서가 만료되면 서명의 유효성을 검사하지 못합니다.
SignTool을 사용하여 프로그램이 서명되었는지 확인합니다.
다음 명령줄 예제에서는 자세한 출력을 제공하면서 사용 가능한 모든 메서드를 사용하여 SignTool이 BasicHLSL.exe 서명을 확인하도록 지정합니다.
signtool.exe verify /a /v BasicHLSL.exe
이 예제에서 SignTool은 인증서가 CA에서 발급되지 않으므로 신뢰할 수 없음을 나타내면서 인증서가 연결되어 있음을 나타내야 합니다.
테스트 인증서를 신뢰합니다.
테스트 인증서의 경우 인증서를 신뢰해야 합니다. 기본적으로 신뢰할 수 있기 때문에 CA에서 제공하는 인증서의 경우 이 단계를 건너뛰어야 합니다.
테스트 인증서를 신뢰하려는 컴퓨터에서만 다음을 실행합니다.
certmgr.msc
그런 다음 신뢰할 수 있는 루트 인증 기관을 마우스 오른쪽 단추로 클릭하고 모든 작업 | 수입. 그런 다음, 만든 .pfx 파일로 이동하고 마법사 단계를 따라 신뢰할 수 있는 루트 인증 기관에 인증서를 배치합니다.
마법사가 완료되면 해당 컴퓨터에서 신뢰할 수 있는 인증서로 테스트를 시작할 수 있습니다.
매일 빌드 시스템에 코드 서명 통합
코드 서명을 프로젝트에 통합하려면 배치 파일 또는 스크립트를 만들어 명령줄 도구를 실행할 수 있습니다. 프로젝트가 빌드된 후 적절한 설정으로 SignTool을 실행합니다(예제의 3단계에 표시된 대로).
.pfx 및 .pvk 파일에 대한 액세스가 가능한 한 적은 수의 컴퓨터와 사용자로 제한되도록 빌드 프로세스에서 특히 주의해야 합니다. 개발자는 배송 준비가 될 때까지 테스트 인증서를 사용하여 코드에만 서명하는 것이 가장 좋습니다. 다시 말하지만, 프라이빗 키(.pvk)는 안전 또는 잠긴 방과 같은 보안 위치에 보관해야 하며, 스마트 카드와 같은 암호화 디바이스에 이상적으로 보관해야 합니다.
또 다른 보호 계층은 Microsoft Authenticode를 사용하여 MSI(Windows Installer) 패키지 자체에 서명하여 제공됩니다. 이렇게 하면 변조 및 실수로 인한 손상으로부터 MSI 패키지를 보호할 수 있습니다. Authenticode를 사용하여 패키지에 서명하는 방법에 대한 자세한 내용은 MSI 만들기 도구에 대한 설명서를 참조하세요.
취소
프라이빗 키의 보안이 손상되거나 일부 보안 관련 이벤트가 코드 서명 인증서를 잘못 렌더링하는 경우 개발자는 인증서를 해지해야 합니다. 이렇게 하지 않으면 개발자의 무결성과 서명 코드의 효율성이 약화됩니다. CA는 특정 시간에 해지를 실행할 수도 있습니다. 해지 시간 전에 타임스탬프를 사용하여 서명된 코드는 여전히 유효한 것으로 간주되지만 후속 타임스탬프를 사용하는 코드는 유효하지 않습니다. 인증서 해지는 해지된 인증서로 서명된 모든 애플리케이션의 코드에 영향을 줍니다.
코드 서명 드라이버
드라이버는 Authenticode에 서명할 수 있고 서명되어야 합니다. 커널 모드 드라이버에는 추가 요구 사항이 있습니다. 64비트 버전의 Windows Vista 및 Windows 7은 서명되지 않은 모든 커널 모드 드라이버의 설치를 방지하며, 사용자가 서명되지 않은 드라이버를 설치하려고 하면 모든 버전의 Windows에서 경고 프롬프트가 표시됩니다. 또한 관리자는 Microsoft Windows Server 2003, Windows XP Professional x64 Edition 및 32비트 버전의 Windows Vista 및 Windows 7에 서명되지 않은 드라이버가 설치되지 않도록 그룹 정책을 설정할 수 있습니다.
WHQL(Windows Hardware Quality Labs)의 Windows 인증 프로그램 또는 분류되지 않은 서명 프로그램(이전의 드라이버 안정성 서명)의 일부로 Microsoft에서 신뢰할 수 있는 서명으로 여러 유형의 드라이버에 서명할 수 있습니다. 그러면 시스템에서 이러한 드라이버를 완전히 신뢰하고 관리 자격 증명 없이도 설치할 수 있습니다.
서명되지 않거나 자체 서명된 드라이버(즉, 테스트 인증서로 서명됨)가 많은 Windows 기반 플랫폼에 설치되지 않으므로 최소한 드라이버는 Authenticode 서명이어야 합니다. 드라이버 서명 및 코드 및 관련 기능에 대한 자세한 내용은 Windows 하드웨어 개발자 중앙의 Windows용 드라이버 서명 요구 사항을 참조하세요.
요약
Microsoft Authenticode를 사용하는 것은 간단한 프로세스입니다. CER을 획득하고 프라이빗 키를 만든 후에는 Microsoft에서 제공하는 도구를 사용하는 것이 간단합니다. 그런 다음 자녀 보호와 같은 Windows Vista 및 Windows 7에서 중요한 기능을 사용하도록 설정하고 고객에게 제품이 정당한 소유자로부터 직접 제공된다는 것을 알릴 수 있습니다.
자세한 정보
서명 코드와 관련된 도구 및 프로세스에 대한 자세한 내용은 다음 링크를 참조하세요.