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분
선택한 인증서 파일에 암호가 있나요?
정성태

... 46  47  48  49  50  [51]  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12665정성태6/9/202117563.NET Framework: 1066. Wslhub.Sdk 사용으로 알아보는 CoInitializeSecurity 사용 제약파일 다운로드1
12664정성태6/9/202115390오류 유형: 723. COM+ PIA 참조 시 "This operation failed because the QueryInterface call on the COM component" 오류
12663정성태6/9/202117743.NET Framework: 1065. Windows Forms - 속성 창의 디자인 설정 지원: 문자열 목록 내에서 항목을 선택하는 TypeConverter 제작파일 다운로드1
12662정성태6/8/202115448.NET Framework: 1064. C# COM 개체를 PIA(Primary Interop Assembly)로써 "Embed Interop Types" 참조하는 방법파일 다운로드1
12661정성태6/4/202127456.NET Framework: 1063. C# - MQTT를 이용한 클라이언트/서버(Broker) 통신 예제 [4]파일 다운로드1
12660정성태6/3/202118171.NET Framework: 1062. Windows Forms - 폼 내에서 발생하는 마우스 이벤트를 자식 컨트롤 영역에 상관없이 수신하는 방법 [1]파일 다운로드1
12659정성태6/2/202119086Linux: 40. 우분투 설치 후 MBR 디스크 드라이브 여유 공간이 인식되지 않은 경우 - Logical Volume Management
12658정성태6/2/202116878Windows: 194. Microsoft Store에 있는 구글의 공식 Youtube App
12657정성태6/2/202117672Windows: 193. 윈도우 패키지 관리자 - winget 설치
12656정성태6/1/202116010.NET Framework: 1061. 서버 유형의 COM+에 적용할 수 없는 Server GC
12655정성태6/1/202114634오류 유형: 722. windbg/sos - savemodule - Fail to read memory
12654정성태5/31/202115316오류 유형: 721. Hyper-V - Saved 상태의 VM을 시작 시 오류 발생
12653정성태5/31/202118557.NET Framework: 1060. 닷넷 GC에 새롭게 구현되는 DPAD(Dynamic Promotion And Demotion for GC)
12652정성태5/31/202116035VS.NET IDE: 164. Visual Studio - Web Deploy로 Publish 시 암호창이 매번 뜨는 문제
12651정성태5/31/202116234오류 유형: 720. PostgreSQL - ERROR: 22P02: malformed array literal: "..."
12650정성태5/17/202115606기타: 82. OpenTabletDriver의 버튼에 더블 클릭을 매핑 및 게임에서의 지원 방법
12649정성태5/16/202117770.NET Framework: 1059. 세대 별 GC(Garbage Collection) 방식에서 Card table의 사용 의미 [1]
12648정성태5/16/202116522사물인터넷: 66. PC -> FTDI -> NodeMCU v1 ESP8266 기기를 UART 핀을 연결해 직렬 통신하는 방법파일 다운로드1
12647정성태5/15/202116761.NET Framework: 1058. C# - C++과의 연동을 위한 구조체의 fixed 배열 필드 사용파일 다운로드1
12646정성태5/15/202115575사물인터넷: 65. C# - Arduino IDE의 Serial Monitor 기능 구현파일 다운로드1
12645정성태5/14/202115651사물인터넷: 64. NodeMCU v1 ESP8266 - LittleFS를 이용한 와이파이 접속 정보 업데이트파일 다운로드1
12644정성태5/14/202116907오류 유형: 719. 윈도우 - 제어판의 "프로그램 및 기능" / "Windows 기능 켜기/끄기" 오류 0x800736B3
12643정성태5/14/202116903오류 유형: 718. 서버 유형의 COM+ 사용 시 0x80080005(Server execution failed) 오류 발생
12642정성태5/14/202118545오류 유형: 717. The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
12641정성태5/13/202117363디버깅 기술: 179. 윈도우용 .NET Core 3 이상에서 Windbg의 sos 사용법
12640정성태5/13/202120984오류 유형: 716. RDP 연결 - Because of a protocol error (code: 0x112f), the remote session will be disconnected. [1]
... 46  47  48  49  50  [51]  52  53  54  55  56  57  58  59  60  ...