Windows에서 코드 서명을 위해 자체 서명 된 인증서를 작성하는 방법


답변:


363

업데이트 된 답변

Windows Server 2012, Windows Server 2012 R2 또는 Windows 8.1과 같은 Windows 버전 이상을 사용하는 경우 이제 MakeCert는 더 이상 사용되지 않으며 PowerShell Cmdlet New-SelfSignedCertificate를 사용 하는 것이 좋습니다 .

Windows 7과 같은 이전 버전을 사용하는 경우 MakeCert 또는 다른 솔루션을 사용해야합니다. 일부 사람들 PSPKI (Public Key Infrastructure Powershell) 모듈을 제안 합니다 .

원래 답변

한 번에 자체 서명 된 코드 서명 인증서 (SPC- Software Publisher Certificate )를 작성할 수 있지만 다음을 수행하는 것이 좋습니다 .

자체 서명 인증 기관 (CA) 작성

makecert -r -pe -n "CN=My CA" -ss CA -sr CurrentUser ^
         -a sha256 -cy authority -sky signature -sv MyCA.pvk MyCA.cer

(^ = 배치 명령 줄을 줄 바꿈 허용)

내보낼 수있는 개인 키 (-pe)와 함께 자체 서명 된 (-r) 인증서를 만듭니다. 이름은 "My CA"이며 현재 사용자의 CA 저장소에 있어야합니다. 우리는 SHA-256 알고리즘을 사용하고 있습니다. 키는 서명 (-sky)을위한 것입니다.

개인 키는 MyCA.pvk 파일에 저장되고 인증서는 MyCA.cer 파일에 저장해야합니다.

CA 인증서 가져 오기

신뢰할 수없는 경우 CA 인증서를 가질 필요가 없으므로 Windows 인증서 저장소로 가져와야합니다. 인증서 MMC 스냅인을 사용할 있지만 명령 행에서 사용할 수 있습니다 .

certutil -user -addstore Root MyCA.cer

코드 서명 인증서 (SPC) 생성

makecert -pe -n "CN=My SPC" -a sha256 -cy end ^
         -sky signature ^
         -ic MyCA.cer -iv MyCA.pvk ^
         -sv MySPC.pvk MySPC.cer

위와 거의 동일하지만 발급자 키와 인증서 (-ic 및 -iv 스위치)를 제공하고 있습니다.

또한 인증서와 키를 PFX 파일로 변환하려고합니다.

pvk2pfx -pvk MySPC.pvk -spc MySPC.cer -pfx MySPC.pfx

PFX 파일을 보호하려면 -po 스위치를 추가하십시오. 그렇지 않으면 PVK2PFX는 암호없이 PFX 파일을 생성합니다.

서명 코드에 인증서 사용

signtool sign /v /f MySPC.pfx ^
              /t http://timestamp.url MyExecutable.exe

( 타임 스탬프가 중요한 이유보기 )

PFX 파일을 인증서 저장소로 가져 오는 경우 (PVKIMPRT 또는 MMC 스냅인을 사용할 수 있음) 다음과 같이 코드에 서명 할 수 있습니다.

signtool sign /v /n "Me" /s SPC ^
              /t http://timestamp.url MyExecutable.exe

가능한 타임 스탬프 URL signtool /t은 다음과 같습니다.

  • http://timestamp.verisign.com/scripts/timstamp.dll
  • http://timestamp.globalsign.com/scripts/timstamp.dll
  • http://timestamp.comodoca.com/authenticode

전체 Microsoft 설명서

다운로드

.NET 개발자가 아닌 경우 Windows SDK 및 .NET 프레임 워크의 사본이 필요합니다. 현재 링크는 SDK 및 .NET에서 사용할 수 있습니다 (makecert를에 설치 C:\Program Files\Microsoft SDKs\Windows\v7.1). 귀하의 마일리지가 다를 수 있습니다.

MakeCert는 Visual Studio 명령 프롬프트에서 사용할 수 있습니다. Visual Studio 2015에는 Windows 7의 시작 메뉴에서 "VS 2015 용 개발자 명령 프롬프트"또는 "VS2015 x64 기본 도구 명령 프롬프트"(아마도 모두 동일한 폴더에 있음)에서 시작할 수 있습니다.


이 방법을 사용하여 인증서의 이메일 주소 필드를 채우는 방법이 있습니까? exe> 속성> 디지털 서명을 마우스 오른쪽 단추로 클릭하면 서명 후 전자 메일이 "사용할 수 없음"으로 표시됩니다.
cronoklee

"너무 많은 매개 변수"오류가 발생하면 실수로 하이픈 중 하나를 편집하지 않았는지 확인하십시오. 하이픈을 다시 입력하면 붙여 넣기를 복사하지 않습니다.
fiat

8
@cronoklee 인증서의 전자 메일 필드를 채우려면 간단히 추가하십시오 E=your@email. 예 :makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W

1
당신이 확장을 사용하여 키 플래그가 필요하지 않습니다 -eku 1.3.6.1.5.5.7.3.3CERT는이 코드 서명에 사용할 수 있도록 (내가 PowerShell을 그것을 누락 된 경우 스크립트에 서명하지 알고)
스콧 체임벌린

1
@AdamPhelps, Windows는 인증서를 신뢰하기 위해 "학습"하지 않습니다. 사용자는 루트 저장소에 CA 인증서를 설치해야합니다. 이것은 일반적으로 나쁜 생각입니다 (루트 CA 인증서가 악의적 인 목적으로 사용될 수 있기 때문에). 그러나 엔터프라이즈 시나리오에서는 의미가 있습니다 .
Roger Lipscombe

36

답변에서 언급했듯이 사용되지 않는 방법으로 자신의 스크립트에 서명하려면 New-SelfSignedCertificate를 사용해야 합니다.

  1. 키를 생성하십시오.
New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. 개인 키없이 인증서를 내 보냅니다.
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt

[0]은 둘 이상의 인증서가있는 경우에이 작업을 수행합니다. 인덱스가 사용하려는 인증서와 일치하는지 확인하십시오.

  1. 신뢰할 수있는 게시자로 가져 오기
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. 루트 인증 기관으로 가져 오십시오.
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. 스크립트에 서명하십시오 (여기서 이름이 script.ps1이라고 가정하고 이에 따라 경로를 수정하십시오).
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

분명히 키를 설정 한 후에는 다른 스크립트로 서명 할 수 있습니다. 이 문서
에서보다 자세한 정보와 문제 해결 도움말을 얻을 수 있습니다 .


이것에 감사합니다. 맨 먼저 아래 답변부터 시작 했어야 했어요!
mdiehl13

감사합니다. 이것은이 겉보기에 간단한 프로세스를 작동시키려는 모든 문제를 해결했습니다.
Dave

1
"2"에 오류가 있습니다. (get-ChildItem ...)두 개 이상의 인증서 를 반환 했기 때문에 끝에 "[0]"을 (를) 입력하면 효과가 있습니다. 마찬가지로Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
lundman

1
@Lara 감사는 의견을 내가 ;-) 쉽게 경우에도 낮은 카페인에 노력하기 위해 몇 가지 상황에 맞는 정보를 추가 한
chaami

1
@Lara는 신호를 보내 주셔서 감사합니다. 편집하는 동안주의를 기울이지 않았습니다. 스택 오버플로가 이제 블록의 구문에 대해 더 까다 롭고 코드가 시작되기 전에 새로운 줄이 필요합니다.
chaami

21

로저의 대답은 매우 도움이되었습니다.

그래도 사용하는 데 약간의 어려움이 있었고 "Windows가이 드라이버 소프트웨어의 게시자를 확인할 수 없습니다"라는 오류 대화 상자가 계속 나타납니다. 열쇠는 테스트 루트 인증서를 설치하는 것이 었습니다.

certutil -addstore Root Demo_CA.cer

로저의 대답은 그다지 다루지 않았습니다.

여기 나를 위해 일한 배치 파일이 있습니다 (내 .inf 파일은 포함되어 있지 않습니다). GUI 도구를 전혀 사용하지 않고 처음부터 끝까지 모든 작업을 수행하는 방법을 보여줍니다 (몇 가지 암호 프롬프트 제외).

REM Demo of signing a printer driver with a self-signed test certificate.
REM Run as administrator (else devcon won't be able to try installing the driver)
REM Use a single 'x' as the password for all certificates for simplicity.

PATH %PATH%;"c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin";"c:\Program Files\Microsoft SDKs\Windows\v7.0\Bin";c:\WinDDK\7600.16385.1\bin\selfsign;c:\WinDDK\7600.16385.1\Tools\devcon\amd64

makecert -r -pe -n "CN=Demo_CA" -ss CA -sr CurrentUser ^
   -a sha256 -cy authority -sky signature ^
   -sv Demo_CA.pvk Demo_CA.cer

makecert -pe -n "CN=Demo_SPC" -a sha256 -cy end ^
   -sky signature ^
   -ic Demo_CA.cer -iv Demo_CA.pvk ^
   -sv Demo_SPC.pvk Demo_SPC.cer

pvk2pfx -pvk Demo_SPC.pvk -spc Demo_SPC.cer ^
   -pfx Demo_SPC.pfx ^
   -po x

inf2cat /drv:driver /os:XP_X86,Vista_X64,Vista_X86,7_X64,7_X86 /v

signtool sign /d "description" /du "www.yoyodyne.com" ^
   /f Demo_SPC.pfx ^
   /p x ^
   /v driver\demoprinter.cat

certutil -addstore Root Demo_CA.cer

rem Needs administrator. If this command works, the driver is properly signed.
devcon install driver\demoprinter.inf LPTENUM\Yoyodyne_IndustriesDemoPrinter_F84F

rem Now uninstall the test driver and certificate.
devcon remove driver\demoprinter.inf LPTENUM\Yoyodyne_IndustriesDemoPrinter_F84F

certutil -delstore Root Demo_CA

4
드라이버 서명에이 기능을 사용하려면 CA 인증서를 시스템 저장소로 가져와야합니다. 내 예제는 테스트 / 내부 목적으로 대부분의 소프트웨어에 적합한 사용자 저장소로 가져옵니다.
Roger Lipscombe

20

Powershell에서 New-SelfSignedCertificate 명령을 사용하는 것은 매우 쉽습니다 . powershell을 열고이 3 가지 명령을 실행하십시오.

1) 인증서 생성 :
$ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com-유형 코드 서명 -CertStoreLocation 인증서 : \ CurrentUser \ My

2) 비밀번호 설정 .
$ CertPassword = ConvertTo-SecureString -String "my_passowrd"-Force –AsPlainText

3) 내보내기 :
Export-PfxCertificate -Cert "cert : \ CurrentUser \ My \ $ ($ cert.Thumbprint)"-FilePath "d : \ selfsigncert.pfx"-Password $ CertPassword

인증서 selfsigncert.pfx 는 @에 있습니다.D:/


선택적 단계 : 시스템 환경 변수에 인증서 비밀번호를 추가해야합니다. cmd에 아래를 입력하여 그렇게하십시오 :setx CSC_KEY_PASSWORD "my_password"


JerryGoyal 자체 서명 된 인증서를 CA Root Trusted Certificate로 변환하는 방법을 알고 있습니까?
Mr Heelis

12

PowerShell 4.0 (Windows 8.1 / Server 2012 R2)부터 makecert.exe 없이 Windows에서 인증서를 만들 수 있습니다. 있습니다.

필요한 명령은 New-SelfSignedCertificateExport-PfxCertificate입니다. 입니다.

지침은 PowerShell을 사용하여 자체 서명 된 인증서 생성에 있습니다.


3
Windows 7에서 PowerShell 4.0을 사용하기 위해 WMF 업데이트를 설치하더라도이 명령에 액세스 할 수는 없습니다. Win8 또는 Server 2012 이상인 것 같습니다.
Daniel Yankowsky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.