Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)

Visual Studio에서 pfx 파일로 서명한 경우, 암호는 어디에 저장될까?

다음과 같은 질문이 있는데요.

소스세이프 사용시 pfx 파일 빌드 실패
; https://www.sysnet.pe.kr/3/0/1067

재현을 하자면, 아래와 같이 프로젝트에 대해 서명할 때 사용하는 pfx 파일의 비밀번호를 설정하는 경우,

pfx_co_op_1.png

위의 프로젝트를 소스 제어(소스 세이프나 TFS 소스 컨트롤)에 포함시키고 다른 개발자가 다운로드 받아서 빌드하게 되면 pfx 때문에 아래와 같은 빌드 오류가 발생합니다.

pfx_co_op_2.png

Cannot import the following key file: test.pfx. The key file may be password protected. To correct this, try to import the certificate again or manually install the certificate to the Strong Name CSP with the following key container name: VS_KEY_5BA0AFAB813A51FF

Importing key file "test.pfx" was canceled.





질문의 답변에 제가 명시한 것처럼, 이런 경우 정말로 "암호가 있는 pfx" 파일로 서명해야 하는지를 스스로 질문을 던져야 합니다. 사실, 여기서 대부분의 개발자가 단순 snk 파일로 서명을 하는 것으로 방향을 바꾸어 문제를 해결할 수 있습니다.

하지만, 절대로 pfx를 이용하여 서명을 해야 한다고 하면 이제 좀 ^^ 괴로워집니다.

우선, pfx는 암호를 가지기 때문에 모든 개발자에게 암호를 알려주고 스스로 입력하라고 할 수 있습니다. 사실 이럴 거면 pfx를 사용한 의미가 많이 퇴색하지요. 따라서, 일반적으로는 관리자 한 명이 개발자들 PC에 일일이 돌아다니면서 pfx 암호를 직접 입력해 주어야 합니다.

암호 입력 방법은 어렵지 않습니다. "Cannot import the following key file" 빌드 오류가 발생하는 개발자 PC에 가서, 프로젝트 속성창을 띄운 다음 아래와 같이 pfx 파일을 다시 한번 '의도적으로' 선택해 주면,

pfx_co_op_3.png

이렇게 비밀번호를 묻는 창이 뜹니다.

pfx_co_op_4.png

한번 입력해 두면, 두번 다시 묻지 않기 때문에 개발자들은 이후 별다른 수고로움없이 빌드를 할 수 있습니다.

하지만, 마이크로소프트는 실제 서명에 사용되는 "인증 파일"을 여러 곳에 배포하는 것은 위험하다고 판단해서 별도로 "delay sign" 옵션을 두었습니다. 이에 대해서는 다음의 글을 참고하시기 바랍니다.

When to Delay Sign Assemblies
; https://www.c-sharpcorner.com/article/when-to-delay-sign-assemblies/

어쨌든, 2가지 방법 모두 관리적인 요소가 들어가므로 수고로움은 각오를 해야 합니다.




그런데, 문득... 개인적으로 궁금한 점이 생겼습니다. Visual Studio에서 pfx에 대해 암호를 한번 설정해 주면 이후로는 다시 묻지 않고 해당 pfx 파일로 빌드를 할 수 있게 해주는데... 그렇다면 그 정보가 어딘가 저장된다는 의미인데... 도대체 어디일까요? ^^

이에 대한 답은... ^^ 혹시 기억하실지 모르겠지만 예전에 이미 한번 언급한 적이 있었습니다.

인증서의 개인키를 담은 물리 파일 위치 알아내는 방법
; https://www.sysnet.pe.kr/2/0/865

pfx에 대해 설치를 한 것은 아니므로 '인증서 관리자'에는 나오지 않지만, Visual Studio는 pfx의 암호를 알아낸 뒤 개인키를 추출해서 별도의 폴더에 보관해 놓는데, 그것이 인증서의 개인키 파일 위치와 동일합니다.

실제로, Visual Studio에서 pfx의 암호를 입력하면 다음과 같은 2군데의 폴더에 새로운 파일이 생성됩니다.

C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

%USERPROFILE%\AppData\Roaming\Microsoft\Crypto\RSA\AppData\Roaming\Microsoft\Crypto\RSA\[로그인 사용자 SID]
또는
%USERPROFILE%\AppData\Roaming\Microsoft\Crypto\RSA\[로그인 사용자 SID]

* "로그인 사용자 SID"는 "wmic useraccount where name='%USERNAME%' get sid" 명령어로 알아낼 수 있습니다.

아래에 보시면, 오늘 테스트한 날짜로 파일이 하나 생성된 것이 확인됩니다.

pfx_co_op_5.png

테스트를 해보니, "로그인 사용자 ID" 경로의 파일의 유무는 Visual Studio 빌드에 아무런 영향을 주지 않았지만, "C:\ProgramData" 하위 경로의 파일을 삭제한 경우에는 다시 빌드 오류가 발생하였습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/20/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2019-10-28 01시14분
[초보자] 서명에서 파일을 선택하면 암호입력하는 창이 나와야하는데 입력창이 나오지 않는 경우는 어떻게 해야할까요 ??
참고로 관리자권한실행하였습니다.
[guest]
2019-10-28 03시52분
선택한 인증서 파일에 암호가 있나요?
정성태

1  2  3  4  5  6  7  8  9  [10]  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13373정성태6/19/20234398오류 유형: 865. 파이썬 - pymssql 설치 관련 오류 정리
13372정성태6/15/20233111개발 환경 구성: 682. SQL Server TLS 통신을 위해 사용되는 키 길이 확인 방법
13371정성태6/15/20233132개발 환경 구성: 681. openssl - 인증서 버전(V1 / V3)
13370정성태6/14/20233296개발 환경 구성: 680. C# - Ubuntu + Microsoft.Data.SqlClient + SQL Server 2008 R2 연결 방법 - TLS 1.2 지원
13369정성태6/13/20233094개발 환경 구성: 679. PyCharm(을 비롯해 JetBrains에 속한 여타) IDE에서 내부 Window들의 탭이 없어진 경우
13368정성태6/13/20233225개발 환경 구성: 678. openssl로 생성한 인증서를 SQL Server의 암호화 인증서로 설정하는 방법
13367정성태6/10/20233333오류 유형: 864. openssl로 만든 pfx 인증서를 Windows Server 2016 이하에서 등록 시 "The password you entered is incorrect" 오류 발생
13366정성태6/10/20233130.NET Framework: 2128. C# - 윈도우 시스템에서 지원하는 암호화 목록(Cipher Suites) 나열파일 다운로드1
13365정성태6/8/20232896오류 유형: 863. MODIFY FILE encountered operating system error 112(failed to retrieve text for this error. Reason: 15105)
13364정성태6/8/20233678.NET Framework: 2127. C# - Ubuntu + Microsoft.Data.SqlClient + SQL Server 2008 R2 연결 방법 [1]
13363정성태6/7/20233242스크립트: 49. 파이썬 - "Transformers (신경망 언어모델 라이브러리) 강좌" - 1장 2절 코드 실행 결과
13362정성태6/1/20233164.NET Framework: 2126. C# - 서버 측의 요청 제어 (Microsoft.AspNetCore.RateLimiting)파일 다운로드1
13361정성태5/31/20233638오류 유형: 862. Facebook - ASP.NET/WebClient 사용 시 graph.facebook.com/me 호출에 대해 403 Forbidden 오류
13360정성태5/31/20233037오류 유형: 861. WSL/docker - failed to start shim: start failed: io.containerd.runc.v2: create new shim socket
13359정성태5/19/20233354오류 유형: 860. Docker Desktop - k8s 초기화 무한 반복한다면?
13358정성태5/17/20233660.NET Framework: 2125. C# - Semantic Kernel의 Semantic Memory 사용 예제 [1]파일 다운로드1
13357정성태5/16/20233464.NET Framework: 2124. C# - Semantic Kernel의 Planner 사용 예제파일 다운로드1
13356정성태5/15/20233769DDK: 10. Device Driver 테스트 설치 관련 오류 (Code 37, Code 31) 및 인증서 관련 정리
13355정성태5/12/20233685.NET Framework: 2123. C# - Semantic Kernel의 ChatGPT 대화 구현 [1]파일 다운로드1
13354정성태5/12/20233958.NET Framework: 2122. C# - "Use Unicode UTF-8 for worldwide language support" 설정을 한 경우, 한글 입력이 '\0' 문자로 처리
13352정성태5/12/20233569.NET Framework: 2121. C# - Semantic Kernel의 대화 문맥 유지파일 다운로드1
13351정성태5/11/20234072VS.NET IDE: 185. Visual Studio - 원격 Docker container 내에 실행 중인 응용 프로그램에 대한 디버깅 [1]
13350정성태5/11/20233323오류 유형: 859. Windows Date and Time - Unable to continue. You do not have permission to perform this task
13349정성태5/11/20233661.NET Framework: 2120. C# - Semantic Kernel의 Skill과 Function 사용 예제파일 다운로드1
13348정성태5/10/20233570.NET Framework: 2119. C# - Semantic Kernel의 "Basic Loading of the Kernel" 예제
13347정성태5/10/20233933.NET Framework: 2118. C# - Semantic Kernel의 Prompt chaining 예제파일 다운로드1
1  2  3  4  5  6  7  8  9  [10]  11  12  13  14  15  ...