장난감 연구소

[UWP] 패키지 서명용 인증서 만들기, 연장하기 본문

개발/UWP

[UWP] 패키지 서명용 인증서 만들기, 연장하기

changi1122 2019. 8. 25. 18:30

    이 글에서는 Visual Studio를 사용하거나, PowerShell cmdlet[각주:1]인 New-SelfSignedCertificate를 사용하여 자체 서명된 인증서를 만들고, 연장하는 방법을 알아볼 것이다. UWP 앱을 스토어에 업로드하기 위해서는 패키지 서명용 인증서가 필요하다.

    Visual Studio 2019

    Visual Studio 2019로 업데이트되면 테스트 인증서 만들기 기능이 없어졌었다. 매년 인증서가 만료되기 때문에 UWP 앱을 업데이트를 하려면 한 해에 한 번씩 인증서를 연장해주어야 한다. 올해도 스토어용으로 빌드하던 중 문제가 생겨 어렴풋이 남아있던 기억을 살려 인증서를 연장해보려 해도 뭔가 잘 되지 않았다. 그래서 구글에서 관련된 영단어로 검색하던 중 Visual Studio 2019에서는 테스트 인증서를 만드는 기능이 사라졌다는 걸 알게 되었다. #링크

    더 찾아보니 Svet Bonev라는 마이크로소프트의 개발자로 보이는 사람이 쓴 #글도 있었다. 그 내용은 VS에서 자체 서명 테스트 인증서를 만드는 기능을 지웠다는 것이었다. 당시 나는 PowerShell을 비롯한 셸을 다뤄본 적이 없었기에 다소 당황스러웠다. UWP 앱을 만들고, PowerShell을 못 쓰는 사람이 몇이나 있을까 싶으면서도, 나와 비슷하게 당황한 사람을 위해 이 글을 적었다.

    그런데, 이렇게 어려움을 느끼고 있다는 걸 알았는지 버전 16.3.7에 확인해본 결과 다시 테스트 인증서 만들기 기능이 돌아왔다. 그래서 VS를 이용하는 방법, PowerShell을 이용하는 방법을 모두 보여주기 위해 글을 수정하였다.

    자체 서명 인증서

    UWP 앱을 스토어에 업로드하기 위해서는 자체 서명 인증서가 필요하다. 자체 서명된 인증서의 경우 신뢰할 수 있는 기관에서 발행되는 인증서와 다르게 따로 앱이 신뢰할 수 있다고 알려주는 것은 아니나, 개발 중인 앱이 개발용 PC에만 설치되도록 확인해주는 역할을 하는 걸로 보인다. 인증서의 지문이 달라져도 인증서의 발급 대상 영역만 동일하면 스토어에 앱이 정상 제출된다.

    자체 서명 인증서는 Visual Studio의 GUI 상에서 만들거나, PowerShell을 사용해서 만들 수 있다.

    자체 서명 인증서 만들기 (Visual Studio)

    PowerShell과 같은 셸 환경에 익숙하지 않다면, Visual Studio를 사용하는 게 좋다. 굳이 설명할 필요도 없을 정도다.

    UWP 프로젝트의 패키지 매니페스트(Package.appxmanifest)를 열고 패키징 탭에서 인증서 선택을 누르면 아래 사진과 같은 창이 열린다. 인증서 구성(T)라 적힌 콤보박스를 누르면 '만들기...'라는 메뉴를 누르면 두번째 사진의 창이 열린다. 게시자 공용 이름에 본인이나 조직을 표현할 수 있는 이름을 적고, 아래에 암호를 채우고 OK를 누른다. 그러면 인증서가 만들어지고 선택된다.[각주:2]

    인증서 선택을 누르면 열리는 창

    자체 서명 인증서 만들기 (PowerShell)

    Windows PowerShell에서도 자체 서명 인증서를 만들 수 있다. 시작 메뉴의 Windows PowerShell 폴더에 들어거나 PowerShell을 검색하여 실행한다. 간단하게 인증서를 생성하려면, "(게시자 공용 이름)", "(인증서에 표시될 이름)"이란 곳을 본인이나 조직을 표현할 수 있는 이름으로 바꿔주고 그대로 입력해주면 자체 서명 인증서가 만들어진다.[각주:3]

    # 게시자 정보
    $Subject = "CN=(게시자 공용 이름)"
    # 인증서가 저장될 경로
    $Store = "Cert:\CurrentUser\My"
    
    New-SelfSignedCertificate -Type Custom -Subject $Subject -KeyUsage DigitalSignature -FriendlyName "(인증서에 표시될 이름)" -CertStoreLocation $Store -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")

    PowerShell 명령어에서 '$' 문자는 변수 할당의 의미를 가진다고 한다. #링크 그러므로 Subject라는 변수에 게시자 정보 문자열을, Store라는 변수에 인증서가 저장될 경로를 저장하고 마지막 줄의 명령어의 $Subject, $Store에서 사용되는 것이다. 따라서 변수 할당의 부분을 생략하고 마지막 줄에 전부 모아 입력해도 상관 없다.

    각 매개 변수들의 의미는 아래와 같다고 한다.

    Subject 매개 변수는 $Subject에 들어가는 문자열로 게시자의 정보를 담는다. 인증서로 앱 패키지에 서명하려면 앱 매니페스트의 "Publisher" 섹션과 일치해야 한다. Microsoft 문서에서 제시된 예시는 "CN=Contoso Software, O=Contoso Corporation, C=US"이다. 우리는 "CN=이름, O=기관, C=국가"로 적거나 "CN=이름, O=기관", "CN=이름"과 같은 형태로 적어주면 될 것 같다.[각주:4] 게시자 정보로 들어갈 만한 정보 유형는 아래 표에 있다.

    준말 본딧말 예시
    C Country (국가) IN -> India
    S State (주) MH-> Maharashtra
    L Locality (소재지) Pune
    O Organization (기관) FunSoft
    OU OrganizationalUnit (기관 조직) Development
    CN Common Name (이름) FunSoft Root Authority

    #출처

    KeyUsage 매개 변수는 인증서를 사용할 수 있는 항목을 뜻한다고 한다. 자체 서명 인증서의 경우 이 매개 변수는 DigitalSignature로 설정한다.

    FriendlyName 매개변수는 인증서 창에서 '이름' 항목으로 보여진다. 기관 이름이나 역할을 적어주거나 항목 자체를 없애도 상관없다.[각주:5]

    CertStoreLocation 매개변수는 $Store 문자열로 인증서가 저장될 경로이다. 다른 경로로 저장해도 되는지는 잘 모르겠으나, "Cert:\CurrentUser\My"로 저장해 주면 VS에서 찾아 선택할 수 있다.

    TextExtension 매개변수는 아래 항목을 포함한다고 한다.

    • Extended Key Usage (EKU) : 인증서를 사용할 수 있는 항목. 인증서가 코드 서명에 사용됨을 알리는 문자열 "2.5.29.37 = {text} 1.3.6.1.5.5.7.3.3"를 포함한다.
    • 기본 제약 조건 : 인증서가 CA(인증 기관)인지 나타낸다. 자체 서명임을 나타내는 문자열 "2.5.29.19 = {text}"를 포함한다

    Visual Studio에서 인증서를 선택하기 (PowerShell)

    Visual Studio에서 원하는 앱의 프로젝트를 연 후, 패키지 매니페스트(Package.appxmanifest)를 연다. 패키징 탭으로 이동하여 '인증서 선택' 버튼을 누른다. 인증서 선택 창의 '인증서 구성(T)...' 콤보박스에서 '저장소에서 선택...'을 누르면, 저장소의 인증서들을 확인할 수 있는데 원하는 인증서를 선택하면 된다. 앱 매니페스트의 게시자 값이 자동으로 설정된다.

    인증서 선택 창

    만들어진 인증서를 확인하기

    PowerShell에서 확인하기

    PowerShell에 Set-Location 명령어나 cd 명령어를 사용하여 인증서가 있는 경로를 선택해준다.

    # Set-Location 사용
    Set-Location Cert:\CurrentUser\My
    # cd 사용
    cd Cert:\CurrentUser\My
    
    # 알게된 PowerShell 지식을 얘기하자면 PowerShell에서 특수문자가 들어가거나, 공백이 있는 경로를 입력할 때는 ""(큰 따옴표)로 감싸주면 된다.

    그 후 다음 명령어를 입력하면 해당 폴더의 인증서의 발급 대상, 이름, 지문이 출력된다.

    Get-ChildItem | Format-Table Subject, FriendlyName, Thumbprint

     

    사용자 인증서 관리에서 확인하기

    시작 메뉴에서 '인증서'를 검색하면 '사용자 인증서 관리' 프로그램을 실행할 수 있다. 인증서의 경로를 따라서 "개인용\인증서"로 들어가면 인증서를 확인할 수 있다. 인증서를 우클릭시 나타나는 메뉴에서 인증서를 삭제할 수도 있다.

    만들어진 인증서

    인증서가 만료되었을 시 연장하기

    이렇게 만든 인증서는 1년의 유효 기간이 있기 때문에 1년 후에 앱을 업데이트하거나, 새로 제출하려면 인증서를 연장해야 한다.[각주:6] 이 경우 '게시자 공용 이름'만 동일하게 인증서를 다시 만들어주면 된다.

    스토어에 제출된 앱의 제품 ID

    인증서의 지문이 변하더라도 앱 매니페스트의 게시자(인증서)의 값, 스토어에 저장된 제품 ID의 게시자 값이 동일하다면 앱이 제출된다. 그러나 $Subject로 적어 넣은 문자열이 인증서를 새로 만들면서 바뀌었다면 제출을 거부당한다. 그러니 새로 만들기 전에 잘 확인한 후 본문의 과정을 진행해주면 된다.

     

    관련 정보 출처

    패키지 서명용 인증서 만들기 (Microsoft 문서)

    "Create Test Certificate" option missing from UWP SDK in VS2019

     

    1. Windows PowerShell 환경에서 사용되는 명령어 #링크 [본문으로]
    2. 스토어에 앱을 업로드한 이후로는 이 게시자 정보를 변경할 수 없으니 잘 적어주기 바란다. 처음에 잘 모르고 의미없는 문자열로 정했던 걸 바꾸려 스토어 측에 메일도 보내 보았으나, 바꿔줄 수 없다고 한다. [본문으로]
    3. 스토어에 앱을 업로드한 이후로는 이 게시자 정보를 변경할 수 없으니 잘 적어주기 바란다. 처음에 잘 모르고 의미없는 문자열로 정했던 걸 바꾸려 스토어 측에 메일도 보내 보았으나, 바꿔줄 수 없다고 한다. [본문으로]
    4. 사용자 눈에는 보이지 않는 것이라 크게 중요하지 않은지, VS에서 생성했을 때는 "CN=이름" 형태로 간단하게 만들어진다. [본문으로]
    5. 이것 역시 중요하지 않은지, VS에서 생성했을 때는 <없음>으로 나온다. [본문으로]
    6. 이전에 제출된 앱은 따로 조치를 취하지 않아도 작동한다고 한다. [본문으로]
    728x90
    개 댓글