SignTool을 사용하여 앱 패키지에 서명하는 방법

참고

Windows 앱 패키지에 서명하려면 SignTool을 사용하여 앱 패키지 서명을 참조하세요.

SignTool을 사용하여 배포할 수 있도록 Windows 앱 패키지에 서명하는 방법을 알아봅니다. SignTool 은 Windows SDK(소프트웨어 개발 키트)의 일부입니다.

모든 Windows 앱 패키지는 배포하기 전에 디지털 서명해야 합니다. Microsoft Visual Studio 2012 이상에서는 만드는 동안 앱 패키지에 서명할 수 있지만 Windows SDK에서 앱 패키지(MakeAppx.exe) 도구를 사용하여 만든 패키지는 서명되지 않습니다.

참고

SignTool을 사용하여 Windows 8 이상 또는 Windows Server 2012 이상에서만 Windows 앱 패키지에 서명할 수 있습니다. SignTool을 사용하여 Windows 7 또는 Windows Server 2008 R2와 같은 하위 수준의 운영 체제에서 앱 패키지에 서명할 수 없습니다.

알아야 하는 작업

기술

사전 요구 사항

기타 고려 사항

앱 패키지에 서명하는 데 사용하는 인증서는 다음 조건을 충족해야 합니다.

  • 인증서의 주체 이름은 패키지 내에 저장된 AppxManifest.xml 파일의 Identity 요소에 포함된 Publisher 특성과 일치해야 합니다. 게시자 이름은 패키지된 Windows 앱의 ID에 속하므로 인증서의 주체 이름이 앱의 게시자 이름과 일치하도록 해야 합니다. 이렇게 하면 서명된 패키지의 ID를 디지털 서명에 대해 확인할 수 있습니다. SignTool을 사용하여 앱 패키지에 서명할 때 발생할 수 있는 서명 오류에 대한 자세한 내용은 앱 패키지 서명 인증서를 만드는 방법의 설명 섹션을 참조하세요.

  • 인증서는 코드 서명에 유효해야 합니다. 즉, 이러한 두 항목은 모두 true여야 합니다.

    • 인증서의 EKU(확장 키 사용) 필드는 설정되지 않았거나 코드 서명에 대한 EKU 값(1.3.6.1.5.5.7.3.3)을 포함해야 합니다.
    • 인증서의 KU(키 사용량) 필드는 설정되지 않았거나 디지털 서명(0x80)에 대한 사용량 비트를 포함해야 합니다.
  • 인증서에 프라이빗 키가 포함되어 있습니다.

  • 인증서가 유효합니다. 활성 상태이고 만료되지 않았으며 해지되지 않았습니다.

Instructions

1단계: 사용할 해시 알고리즘 결정

앱 패키지에 서명할 때 앱 패키지를 만들 때 사용한 것과 동일한 해시 알고리즘을 사용해야 합니다. 기본 설정을 사용하여 앱 패키지를 만든 경우 사용되는 해시 알고리즘은 SHA256입니다.

특정 해시 알고리즘과 함께 앱 패키지 프로그램을 사용하여 앱 패키지를 만든 경우 동일한 알고리즘을 사용하여 패키지에 서명합니다. 패키지 서명에 사용할 해시 알고리즘을 확인하려면 패키지 내용을 추출하고 AppxBlockMap.xml 파일을 검사할 수 있습니다. BlockMap 요소의 HashMethod 특성은 앱 패키지를 만들 때 사용된 해시 알고리즘을 나타냅니다. 예를 들면 다음과 같습니다.

<BlockMap xmlns="http://schemas.microsoft.com/appx/2010/blockmap" 
HashMethod="https://www.w3.org/2001/04/xmlenc#sha256">

앞의 BlockMap 요소는 SHA256 알고리즘이 사용되었음을 나타냅니다. 이 표에는 현재 사용 가능한 알고리즘의 매핑이 나열됩니다.

HashMethod 사용할 hashAlgorithm
https://www.w3.org/2001/04/xmlenc#sha256 SHA256(.appx 기본값)
https://www.w3.org/2001/04/xmldsig-more#sha384 SHA384
https://www.w3.org/2001/04/xmlenc#sha512 SHA512

2단계: SignTool.exe 실행하여 패키지 서명

.pfx 파일에서 서명 인증서를 사용하여 패키지에 서명하려면

  • SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password filepath.appx
    

SignTool 은 지정되지 않은 경우 /fd hashAlgorithm 매개 변수를 SHA1로 기본 설정하며 SHA1은 앱 패키지 서명에 유효하지 않습니다. 따라서 앱 패키지에 서명할 때 이 매개 변수를 지정해야 합니다. 기본 SHA256 해시를 사용하여 만든 앱 패키지에 서명하려면 /fd hashAlgorithm 매개 변수를 SHA256으로 지정합니다.

SignTool sign /fd SHA256 /a /f signingCert.pfx /p password filepath.appx

암호로 보호되지 않은 .pfx 파일을 사용하는 경우 /p 암호 매개 변수를 생략할 수 있습니다. SignTool에서 지원하는 다른 인증서 선택 옵션을 사용하여 앱 패키지에 서명할 수도 있습니다. 이러한 옵션에 대한 자세한 내용은 SignTool을 참조하세요.

참고

서명된 앱 패키지에서는 SignTool 타임스탬프를 사용할 수 없습니다. 작업이 지원되지 않습니다.

앱 패키지를 타임스탬프를 지정하려면 서명 작업 중에 수행해야 합니다. 예를 들면 다음과 같습니다.

SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password /tr timestampServerUrl 
filepath.appx

/tr timestampServerUrl 매개 변수를 RFC 3161 타임스탬프 서버의 URL과 동일하게 만듭니다.

설명

이 섹션에서는 앱 패키지에 대한 서명 오류 문제 해결에 대해 설명합니다.

앱 패키지 서명 오류 문제 해결

SignTool은 SignTool에서 반환할 수 있는 서명 오류 외에도 앱 패키지 서명과 관련된 오류를 반환할 수 있습니다. 이러한 오류는 일반적으로 내부 오류로 표시됩니다.

SignTool Error: An unexpected internal error has occurred.
Error information: "Error: SignerSign() failed." (-2147024885 / 0x8007000B) 

오류 코드가 0x8008(예: 0x80080206 APPX_E_CORRUPT_CONTENT)로 시작하는 경우 서명 중인 패키지가 유효하지 않음을 나타냅니다. 이 경우 패키지에 서명하려면 먼저 패키지를 다시 빌드해야 합니다. 0x8008* 오류의 전체 목록은 COM 오류 코드(보안 및 설정)를 참조하세요.

더 일반적으로 오류는 0x8007000b(ERROR_BAD_FORMAT)입니다. 이 경우 이벤트 로그에서 보다 구체적인 오류 정보를 찾을 수 있습니다.

이벤트 로그를 검색하려면

  1. Eventvwr.msc를 실행합니다.
  2. 이벤트 로그 열기: 이벤트 뷰어(로컬) > 애플리케이션 및 서비스 로그 > Microsoft > Windows > AppxPackagingOM > Microsoft-Windows-AppxPackaging/Operational
  3. 가장 최근의 오류 이벤트를 찾습니다.

내부 오류는 일반적으로 다음 중 하나에 해당합니다.

이벤트 ID 예제 이벤트 문자열 제안 해결 방법
150 오류 0x8007000B: 앱 매니페스트 게시자 이름(CN=Contoso)은 서명 인증서의 주체 이름(CN=Contoso, C=US)과 일치해야 합니다. 앱 매니페스트 게시자 이름은 서명의 주체 이름과 정확히 일치해야 합니다. 참고: 이러한 이름은 따옴표로 지정되며 대/소문자와 공백을 모두 구분합니다.
AppxManifest.xml 파일의 Identity 요소에 대해 정의된 Publisher 특성 문자열을 원하는 서명 인증서의 주체 이름과 일치하도록 업데이트할 수 있습니다. 또는 앱 매니페스트 게시자 이름과 일치하는 주체 이름을 가진 다른 서명 인증서를 선택합니다. 매니페스트 게시자 이름과 인증서 주체 이름은 모두 이벤트 메시지에 나열됩니다.
151 오류 0x8007000B: 지정된 서명 해시 메서드(SHA512)는 앱 패키지 블록 맵(SHA256)에 사용되는 해시 메서드와 일치해야 합니다. /fd 매개 변수에 지정된 hashAlgorithm이 잘못되었습니다(1단계: 사용할 해시 알고리즘 확인 참조). 앱 패키지 블록 맵과 일치하는 hashAlgorithm을 사용하여 SignTool 을 다시 실행합니다.
152 오류 0x8007000B: 앱 패키지 콘텐츠가 블록 맵에 대해 유효성을 검사해야 합니다. 앱 패키지가 손상되었으며 새 블록 맵을 생성하려면 다시 빌드해야 합니다. 앱 패키지를 만드는 방법에 대한 자세한 내용은 앱 패키지 앱 패키지 만들기 또는 Visual Studio 2012를 사용하여 앱 패키지 만들기를 참조하세요.

보안 고려 사항

패키지가 서명된 후에도 패키지에 서명하는 데 사용한 인증서는 패키지를 배포할 컴퓨터에서 계속 신뢰할 수 있어야 합니다. 로컬 컴퓨터 인증서 저장소에 인증서를 추가하면 컴퓨터의 모든 사용자의 인증서 신뢰에 영향을 줍니다. 앱 패키지를 테스트하려는 코드 서명 인증서를 신뢰할 수 있는 사람 인증서 저장소에 설치하고 더 이상 필요하지 않은 경우 해당 인증서를 즉시 제거하는 것이 좋습니다. 앱 패키지 서명에 대한 고유한 테스트 인증서를 만드는 경우 테스트 인증서와 연결된 권한을 제한하는 것이 좋습니다. 앱 패키지 서명에 대한 테스트 인증서를 만드는 방법에 대한 자세한 내용은 앱 패키지 서명 인증서를 만드는 방법을 참조하세요.

샘플

앱 패키지 만들기 샘플

개념

코드 서명 모범 사례

Visual Studio 2012에서 패키지 서명

SignTool

앱 패키지 작성 도구(MakeAppx.exe)

앱 패키지 서명 인증서를 만드는 방법