Eli의 여백

바쁜 나날들 사이에서 생각났던 이런저런 것들을 적어봅니다.

IT/새로운 시도

Exe 프로그램 배포시 자체 인증서 만들고 디지털 서명 적용

Eli♪ 2024. 6. 12. 01:40

작성계기

Visual studio 2022에서 간단한 windows forms 프로그램을 만들고 binary를 github release에 등록했는데 다른 컴퓨터에서 받을 경우 신뢰할 수 없는 게시자 경고가 뜸. 알 수 없는 게시자 문제를 해결하고자 사설 인증서 작성 후 적용했으나 windows 10과 11에서 Smartscreen이 신뢰할 수 있는 게시자(CA) 에 등록되지 않은 경우 게시자 표시가 불가하다는 것을 확인함. 그래도 인증서 만들고 디지털 서명 적용하는 과정이 의미있었다 생각했고, 기록으로 남기고자 함.

 

사설 인증서 생성 절차

기본적으로 VS 2022에 windows SDK를 깔면 생기는 makecert.exe를 활용한다.

 

1. VS에서 도구-명령줄-개발자 명령 프롬프트 켜기

 

2. makecert 활용하여 인증서 생성

예시 코드

makecert.exe -r -pe -n "CN=ProjectEli" -b 06/11/2024 -e 12/31/2099 -sky exchange -ss ProjectEli

 

간단한 설명

-r = self-signed로 생성

-pe = private key를 exportable로

-n = 인증서 이름. 형식은 CN=원하는이름 으로 적어야 함

-b = 유효기간 개시일

-e = 유효기간 만료일

-sky = 세부스펙. 모르면 exchange

-ss = 저장소 이름. my로 하면 개인으로 생성되고 지정하면 특정 저장소로 들어감. CA 불가. 자세한 내용은 후술

 

공식 문서

https://learn.microsoft.com/en-us/windows/win32/seccrypto/makecert

 

MakeCert - Win32 apps

Creates an X.509 certificate, signed by the test root key or other specified key, that binds your name to the public part of the key pair. The certificate is saved to a file, a system certificate store, or both.

learn.microsoft.com

 

3. 인증서 확인 및 내보내기

Win+R 해서 certmgr 입력. 안뜨면 시작버튼 누르고 인증서 라고 검색하면 '사용자 인증서 관리' 라는 것이 뜸. 아까 ss 옵션으로 지정한 폴더에 인증서가 생겨있다.

 

우클릭해서 모든 작업-내보내기

 

 

아래와 같이 인증서 내보내기 마법사 뜨는데 다음 클릭

 

개인 키 내보내기 클릭. 이렇게 해야 pfx 파일로 생성된다. 2024-06 기준 pfx로 만들어야 제대로 서명이 된다.

 

가능한 경우 인증 경로에 있는 인증서 모두 포함에 체크 후 다음

 

암호 적고 암호화는 보안성 더 높은 SHA256 선택

 

내보낼 파일 경로 지정

 

이렇게 하면 정상적으로 pfx파일이 생성된다.

 

디지털 서명 적용 절차

역시 VS에 windows SDK를 깔면 생기는 signtool을 활용한다.

 

1. VS에서 도구-명령줄-개발자 프롬프트 켜기

아까 앞에 인증서 만들때랑 동일하며, 이미 켜있는 경우 그대로 쓰면 된다.

 

2. Signtool.exe 활용하여 디지털 서명 적용

다음과 같은 형식으로 앞에서 만들었던 인증서를 넣어서 서명 적용한다. 바이너리는 release로 이미 빌드된 상태여야 한다.

 

예시 코드

signtool.exe sign /f "D:\ProjectEli\EliSignature\ProjectEli.pfx" /fd SHA256 /p 만들때썼던암호 /tr http://timestamp.digicert.com /td sha256 "D:\ProjectEli\TW_Maps\TW_Maps\bin\Release\net8.0-windows\publish\win-x64\TW_Maps.exe"

 

간단한 설명

sign = 서명 적용

/f = 인증서 파일 경로

/fd = 만들 때 썼던 암호화 알고리즘. 앞에서 SHA256으로 만들었음.

/p =  만들 때 썼던 암호 입력. 한/영 및 대소문자 구분함.

/tr = timestamp를 보증해 줄 기관. 필자는 versign으로 함. 다른 기관도 가능.

/td = timestamp 서버 알고리즘 지정. 필자는 sha256 적용했음.

마지막으로 한 칸 띄고 서명 적용할 exe파일의 경로를 적는다.

 

공식 문서

https://learn.microsoft.com/ko-kr/windows/win32/seccrypto/signtool

 

SignTool - Win32 apps

파일에 디지털 서명하고 파일의 서명을 확인하고 타임스탬프를 지정하는 명령줄 도구인 SignTool을 사용하는 방법을 알아봅니다.

learn.microsoft.com

 

적용결과

아래와 같이 파일 우클릭해서 속성 들어가면 디지털 서명이라는 탭이 생겨있고 적용한 인증서 내용을 볼 수 있다. 서명 적용할 때 지정한 digicert가 연대서명에 들어가 있는 것도 확인 가능하다.

 

이렇게 하면 인증 자체는 유효하지만 윈도우에서 신뢰할 수 있는 인증 기관이 아니라며서 최초 실행시 아래와 같이 보안 경고를 띄운다. 알 수 없는 게시자를 내가 지정한 게시자로 표시하려면 앞에서 설명한 certmgr에서 신뢰할 수 있는 게시자로 인증서를 설치해 주어야 한다. 혼자 쓸 거면 모르겠지만 필자의 경우 다른 사람한테 배포하는 것이 목적이어서 이것은 현재로서는 해결이 불가능한 것으로 파악했다.

 

signtool의 verify를 써봐도 다음과 같이 나온다.

 

디지털 서명하는 다른 방법으로 Visual studio 자체에서 제공하는 ClickOnce라는 것도 있긴 하지만 결국은 신뢰할 수 있는 기관에서 유료로 인증서를 구매하지 않는 이상 위에서 발생하는 알 수 없는 게시자 문제는 동일하게 일어나는 것으로 판단하였다.

 

결론

VS에서 사설 인증서를 만들고, 암호화 적용한 후 제작한 앱의 바이너리에 디지털 서명을 적용할 수 있었다. 다른 사람에게 배포할 경우 최초실행에서 게시자가 표시되게 하고 싶었으나 2024년 6월 기준으로는 보안이 강화되어 사설 인증서로는 불가한 것으로 판단된다.

 

참고한 문서

[1] 인증서 내보내기: https://m.blog.naver.com/asemansa/221519585610

[2] 타임스탬프 주소: https://www.koreassl.com/support/faq/98

[3] unknown publisher name 문제: https://stackoverflow.com/questions/55400990/setup-factory-9-how-i-can-fix-unknown-publisher-name