winapp CLI는 로컬 Windows 개발을 간단하게 만듭니다. 서명 인증서를 생성하고, 머신에서 신뢰하고, 개발자 모드를 켤 수 있습니다. 이러한 각 단계는 컴퓨터 상태를 변경하거나 프라이빗 키를 전달하는 파일을 만들므로 정확히 무엇을 하는지 알 수 있습니다.
이 페이지에서는 각 명령의 결과, 실행 취소 방법 및 배송 시 다르게 수행할 작업을 설명합니다. 개발 인증서 및 개발자 모드는 로컬 테스트를 위해 지원되는 일반적인 경로입니다. 여기서 목표는 옵트인하는 항목을 이해하는 것이 아니라 이를 피하는 것입니다.
개발 인증서
MSIX 패키지는 Windows 설치하기 전에 서명해야 합니다. 로컬 테스트의 winapp cert generate 경우 자체 서명된 인증서를 만들어 아무 것도 구입하지 않고도 고유한 패키지에 서명하고 설치할 수 있습니다.
winapp cert generate이 생성하는 내용
생성된 인증서는 자체 서명된 최종 엔터티 코드 서명 인증서입니다.
| 재산 | 가치 |
|---|---|
| Key | RSA 2048비트, 내보낼 수 있는 것으로 표시 |
| 서명 알고리즘 | SHA-256 및 RSA(PKCS#1 v1.5) |
| 주요 사용량 | 디지털 서명 |
| 확장된 키 사용량 | 코드 서명(1.3.6.1.5.5.7.3.3) |
| 기본 제약 조건 | 인증 기관이 아님 |
| 유효성 | 기본적으로 365일(--valid-days) |
| 주제 | 매니페스트의 Publisher와 일치해야 합니다. |
이 명령은 다음 두 가지를 씁니다.
-
devcert.pfx(또는--output에 전달한 경로)이 현재 디렉터리에 있습니다. 이 파일에는 인증서와 해당 프라이빗 키가 모두 포함됩니다. - 개인 인증서 저장소(
Cert:\CurrentUser\My)에 있는 인증서의 복사본입니다.
--export-cer를 사용하면 .cer 옆에 .pfx 파일도 작성합니다. 이 파일에는 프라이빗 키가 없는 공용 인증서만 포함되어 있으므로 빌드를 신뢰해야 하는 팀 동료나 테스트 컴퓨터에 전달해야 합니다.
메모
자체 서명된 인증서는 누군가가 명시적으로 신뢰할 때까지 아무도 신뢰할 수 없습니다. 그것은 당신의 자신의 컴퓨터와 자신의 테스트 머신에 대한 괜찮습니다; 앱을 배포할 때 실제 코드 서명 ID를 대체하는 것은 아닙니다.
기본 암호
winapp cert generate은(는) password를 전달하지 않는 한 --password을(를) PFX 암호로 사용합니다. 나중에 해당 인증서를 암호 옵션도 --password인 winapp sign 및 winapp pack를 받는 --cert-password에 제공할 때도 동일한 기본값이 적용됩니다.
잘 알려진 암호는 프라이빗 키가 devcert.pfx 효과적으로 보호되지 않음을 의미합니다. 파일을 가져오는 사람은 누구나 코드에 서명할 수 있습니다. 이는 자신의 컴퓨터에서 로컬 테스트 빌드에만 서명하는 일회용 인증서에 대해서는 감수할 만한 절충안이며, 이것이 기본값으로 존재하는 이유이기도 합니다.
Important
기본 암호를 인증서를 삭제할 수 있다는 신호로 처리합니다. 다른 사람이 설치할 인증서에 서명하는 데 인증서를 사용하는 경우 기본 암호가 있는 winapp cert generate 인증서가 아니어야 합니다. 프로덕션에 대한 서명 참조
스크립트와 에이전트는 암호를 직접 winapp cert generate --json 비교할 필요가 없습니다. 기본값이 적용될 때마다 warnings를 보고하고 그 공개 내용을 "defaultPasswordIsPublic": true 배열에서 반복합니다.
인증서 생성 JSON 출력을 참조하세요.
인증서 파일이 있는 위치
devcert.pfx 는 디스크의 프라이빗 키입니다. 두 가지 규칙이 문제를 피하게 합니다:
커밋하지 마세요.winapp cert generate 는 인증서의 파일 이름을 .gitignore 옆에 자동으로 추가하므로 기본 흐름은 이미 적용됩니다. 파일을 이동하거나, 이름을 바꾸거나, 다른 .gitignore디렉터리에서 관리하는 디렉터리로 생성하는 경우 항목이 그 뒤를 따랐는지 확인합니다.
git check-ignore -v devcert.pfx
아무것도 출력되지 않으면, 그 파일은 무시되지 않습니다 — 커밋하기 전에 추가하세요.
패키지하지 마세요.winapp pack 는 입력 디렉터리의 모든 항목을 패키지하므로 devcert.pfx 앱의 출력 폴더에 있는 항목이 배송된 MSIX 내부에 있게 됩니다.
EXE/CLI 패키징 가이드에 표시된 것처럼 패키지하는 폴더 외부에서 인증서를 생성하고 배포하기 전에 인증서가 없는지 확인합니다.
# Unpack the package and check that no certificate is inside
winapp tool makeappx unpack /p .\MyApp.msix /d .\inspect /o
Get-ChildItem .\inspect -Recurse -Include *.pfx, *.cer
팁 (조언)
실제 개인 키가 있는 .pfx가 커밋되거나 공개된 경우에는 이를 교체하세요. 새 인증서를 생성하고 재서명한 다음, 신뢰할 수 있는 인증서 제거의 단계에 따라 이전 인증서를 더 이상 신뢰하지 않도록 하세요. 이후 커밋에서 파일을 삭제해도 기록에서 제거되지는 않습니다.
winapp cert install에서 부여하는 항목
winapp cert install 는 인증서를 저장소에 추가합니다 LocalMachine\TrustedPeople . 이렇게 하려면 컴퓨터의 모든 사용자에 대한 신뢰가 변경되므로 관리자 권한이 필요합니다.
인증서가 있으면 TrustedPeopleWindows 테스트한 패키지뿐만 아니라 해당 인증서에서 서명한 모든 MSIX 패키지를 설치하기에 충분히 신뢰할 수 있는 것으로 수락합니다. 프라이빗 키를 보유하고 로컬로 유지하는 인증서의 경우 이는 정확히 의도된 효과입니다. 그것은 또한 그것에 대해 신중 한 이유:
- 직접 생성한 인증서를 신뢰하거나 컴퓨터에 소프트웨어를 설치할 수 있는 사람이 제공한 인증서를 신뢰합니다.
- 다른 사용자가 사용하는 공유, 프로덕션 또는 빌드 컴퓨터에 개발 인증서를 설치하지 마세요.
- 동료가
.cer테스트 패키지를 설치해야 하는 경우보다.pfx(공개 키만) 배포하는 것을 선호합니다. 그들은 귀하를 대신해 서명할 수 있는 권한은 얻지 않으면서도 귀하의 빌드를 신뢰할 수 있는 능력을 얻게 됩니다.
다른 테스트 머신에서 .cer를 신뢰하려면 해당 머신에서 직접 winapp cert install를 실행하세요. 이 명령은 .cer 또는 공개 키만 포함된 .pfx를 받을 수 있습니다.
# Run as Administrator
winapp cert install .\devcert.cer
기본 제공 Windows 도구만 사용하는 것과 동일한 방법은 다음과 같습니다.
# Run as Administrator
Import-Certificate -FilePath .\devcert.cer -CertStoreLocation Cert:\LocalMachine\TrustedPeople
신뢰할 수 있는 인증서 제거
개발 인증서는 기본적으로 1년 후에 만료되지만 만료는 제거되지 않습니다. 인증서를 완료하면 프로젝트가 종료되거나, 컴퓨터가 용도가 변경되거나, 키가 유출되었을 수 있습니다. 명시적으로 제거합니다.
먼저 해당 지문(thumbprint)을 찾습니다:
Get-ChildItem Cert:\LocalMachine\TrustedPeople |
Where-Object { $_.Subject -like '*CN=Contoso*' } |
Format-List Subject, Thumbprint, NotAfter
그런 다음 머신 신뢰 저장소에서 제거합니다. 이 단계에서는 권한 상승이 필요합니다.
# Run as Administrator. Replace with the thumbprint from the previous command.
$thumbprint = 'ABCD...'
Remove-Item -Path "Cert:\LocalMachine\TrustedPeople\$thumbprint"
cert generate 또한 인증서를 해당 개인 키와 함께 개인 저장소에 저장했습니다.
cert generate을 실행한 계정으로 로그인한 일반(관리자 권한이 없는) 프롬프트에서 해당 항목을 제거합니다:
$thumbprint = 'ABCD...'
Remove-Item -Path "Cert:\CurrentUser\My\$thumbprint"
Important
표시된 컨텍스트에서 위의 두 명령을 실행합니다. 다른 관리자 계정을 사용하여 권한 상승한 경우, 해당 상승된 세션에서 Cert:\CurrentUser은(는) 사용자의 저장소가 아니라 그 관리자의 저장소이므로 개인 키는 키를 생성한 사용자의 저장소에 남게 됩니다.
마지막으로, .pfx와 배포한 모든 .cer 복사본을 삭제하고, 그것으로 사이드로드한 패키지의 등록을 취소하세요.
winapp unregister
메모
인증서를 제거해도 이미 설치된 패키지는 제거되지 않습니다.
설정 > 앱 > 설치된 앱에서 각각 제거하거나, 개발 모드로 등록된 패키지는 winapp unregister 사용하여 제거하세요.
개발자 모드
Windows에서는 빌드되고 서명된 MSIX를 설치하는 대신, 디스크의 폴더에 있는 앱 패키지(느슨한 레이아웃)를 직접 등록하려면 개발자 모드가 필요합니다.
winapp run 및 create-debug-identity 같은 명령은 이에 의존하므로, 이것이 없으면 실패하며 winapp init에서 이를 활성화하도록 제안합니다.
활성화하면 변경되는 사항
CLI는 HKEY_LOCAL_MACHINE 아래에 두 개의 DWORD 값을 기록하여 Developer Mode를 활성화합니다:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock
AllowDevelopmentWithoutDevLicense = 1
AllowAllTrustedApps = 1
컴퓨터 전체 설정이므로 CLI는 관리자 권한 도우미 프로세스를 시작하고 Windows 사용자 계정 컨트롤 프롬프트를 표시합니다. 프롬프트를 거절하면 아무것도 변경되지 않습니다.
실질적으로 이는 컴퓨터가 다음을 수행한다는 것을 의미합니다.
- MSIX로 빌드되거나 전혀 서명되지 않은 상태에서도 디스크의 폴더에서 직접 앱 패키지를 등록할 수 있습니다 (
AllowDevelopmentWithoutDevLicense). -
TrustedPeople(AllowAllTrustedApps)의 모든 개발 인증서를 포함하여, 컴퓨터가 신뢰하는 인증서로 서명되어 있기만 하면 Microsoft Store 외부의 앱 패키지를 설치할 수 있습니다.
Important
개발자 모드와 신뢰할 수 있는 개발 인증서는 기본 설치 제한을 의도적으로 완화하는 것입니다. 이 조합은 개발 및 테스트 머신에 속합니다. 프로덕션 시스템, 키오스크 및 공유 인프라에서는 꺼 두세요.
활성화된 시점 제어
winapp init은(는) 무엇이든 변경하기 전에 먼저 확인을 요청하고, --use-defaults은(는) 확인 절차를 완전히 건너뛰어 개발자 모드를 그대로 둡니다. 이렇게 하면 기본적으로 스크립트 및 CI 실행이 안전합니다.
winapp init --use-defaults
설정을 직접 관리하려는 경우 설정 > 시스템 > 개발자용 > 개발자 모드에서 한 번만 사용하도록 설정하면 CLI가 이를 감지하고 계속 진행합니다.
끄기
개발자용 설정 > 시스템을 > 사용하고 개발자 모드를 해제합니다. 설정은 연결된 OS 상태도 정리하므로 이 경로가 권장됩니다. 나중에 레지스트리 값을 확인하려면 다음을 수행합니다.
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock' `
-Name AllowDevelopmentWithoutDevLicense, AllowAllTrustedApps
개발자 모드를 해제해도 신뢰할 수 있는 인증서 또는 이미 설치된 패키지는 제거되지 않습니다. 신뢰할 수 있는 인증서 제거를 참조하세요.
프로덕션용 서명
개발 인증서는 명시적으로 신뢰한 사용자에 대해서만 작동합니다. 앱을 배포하려면 Windows 이미 신뢰하는 ID로 서명합니다.
서명 ID 선택
Azure 신뢰할 수 있는 서명 - 클라우드 관리 서명 서비스입니다. 프라이빗 키는 빌드 머신에 존재하지 않으므로 직접 보호, 누수 또는 회전할 수 없습니다
.pfx. 를 사용하세요. 이 방식은 표준 Azure 자격 증명 체인으로 인증하며 GitHub Actions OIDC 또는 관리 ID와 함께 작동합니다.winapp az-sign .\MyApp.msix신뢰할 수 있는 인증 기관의 코드 서명 인증서 — 이를 두 번째 위치 인수로
winapp sign에 전달하고, 해당 암호는--password에 지정합니다. 그러면 키 자료를 안전하게 저장할 책임은 사용자에게 있습니다. 하드웨어 토큰, 키 저장소 또는 CI 공급자의 비밀 저장소에 보관하고, 리포지토리에는 절대 저장하지 마세요.Microsoft Store - 스토어를 통해서만 배포하는 경우 패키지에 서명하며 제출 전에 서명할 필요가 없습니다.
모든 경우에 인증서 주체는 Publisher의 경우를 포함하여 매니페스트의 값과 일치해야 합니다.
리포지토리에 서명 비밀 정보를 포함하지 마세요
인증서 암호는 구성 파일이 아닌 CI 비밀 저장소에 속합니다. 하드 코딩하는 대신 환경에서 읽습니다.
winapp sign .\MyApp.msix $env:SIGNING_CERT_PATH --password $env:SIGNING_CERT_PASSWORD
Electron Forge 구성과 같이 소스 제어에 커밋된 빌드 구성에도 동일하게 적용됩니다. Electron 패키징을 참조하세요.
winapp az-sign 는 전달할 암호가 없으므로 문제를 완전히 방지합니다.
게시하기 전에
로컬 테스트에서 배포로 전환하기 위한 간단한 검사 목록:
- 패키지는 CA에서 발급한 인증서, Azure 신뢰할 수 있는 서명 또는 Store 제출을 통해 서명되며,
devcert.pfx로 서명되는 것은 아닙니다. - 패키징된 출력물에는
.pfx파일도.cer파일도 포함되어 있지 않습니다. - 커밋된 파일, 빌드 스크립트 또는 CI 로그에는 인증서 암호가 나타나지 않습니다.
- 인증서 주체는 매니페스트와 일치합니다
Publisher. - 개발 인증서 및 개발자 모드는 앱을 실행 하기만 하면 되는 컴퓨터에서 사용하도록 설정되지 않습니다.
보안 문제 보고
winapp CLI 자체에서 보안 취약성을 보고하려면 SECURITY.md 프로세스를 따릅니다. 보안 보고서에 대한 공개 GitHub 문제를 열지 마세요.
관련 항목
Windows developer