다음을 통해 공유


about_Signing

간단한 설명

PowerShell 실행 정책을 준수하도록 스크립트에 서명하는 방법을 설명합니다.

자세한 설명

제한된 실행 정책은 스크립트 실행을 허용하지 않습니다. AllSignedRemoteSigned 실행 정책을 사용하면 PowerShell에서 디지털 서명이 없는 스크립트를 실행할 수 없습니다.

이 항목에서는 실행 정책이 RemoteSigned인 경우에도 서명되지 않은 선택한 스크립트를 실행하는 방법과 사용자 고유의 용도로 스크립트에 서명하는 방법을 설명합니다.

PowerShell은 다음 형식 형식의 Authenticode 서명을 확인합니다.

  • .ps1 스크립트 파일
  • .psm1 모듈 파일
  • .psd1 모듈 매니페스트 및 데이터 파일
  • .ps1xml XML 파일 형식 및 서식 지정
  • .cdxml CDXML 스크립트 파일
  • .xaml XAML 스크립트 파일

PowerShell 실행 정책에 대한 자세한 내용은 about_Execution_Policies 참조하세요.

서명된 스크립트 실행을 허용하려면

컴퓨터에서 PowerShell을 처음 시작하면 기본값인 제한된 실행 정책이 적용될 가능성이 높습니다.

제한된 정책은 스크립트 실행을 허용하지 않습니다.

컴퓨터에서 유효한 실행 정책을 찾으려면 다음을 입력합니다.

Get-ExecutionPolicy

로컬 컴퓨터에서 작성한 서명되지 않은 스크립트와 다른 사용자의 서명된 스크립트를 실행하려면 관리자 권한으로 실행 옵션을 사용하여 PowerShell을 시작한 다음, 다음 명령을 사용하여 컴퓨터의 실행 정책을 RemoteSigned변경합니다.

Set-ExecutionPolicy RemoteSigned

자세한 내용은 cmdlet에 대한 Set-ExecutionPolicy 도움말 항목을 참조하세요.

RemoteSigned 실행 정책을 사용하여 서명되지 않은 스크립트 실행

PowerShell 실행 정책이 RemoteSigned인 경우 PowerShell은 전자 메일 및 인스턴트 메시징 프로그램을 통해 수신하는 서명되지 않은 스크립트를 포함하여 인터넷에서 다운로드되는 서명되지 않은 스크립트를 실행하지 않습니다.

다운로드한 스크립트를 실행하려고 하면 PowerShell에서 다음 오류 메시지가 표시됩니다.

The file <file-name> cannot be loaded. The file <file-name> is not
digitally signed. The script will not execute on the system. Please see
"Get-Help about_Signing" for more details.

스크립트를 실행하기 전에 코드를 검토하여 신뢰할 수 있는지 확인합니다. 스크립트는 모든 실행 프로그램과 동일한 효과를 줍니다.

서명되지 않은 스크립트를 실행하려면 cmdlet을 Unblock-File 사용하거나 다음 절차를 사용합니다.

  1. 컴퓨터에 스크립트 파일을 저장합니다.
  2. 시작을 클릭하고 내 컴퓨터를 클릭한 다음 저장된 스크립트 파일을 찾습니다.
  3. 스크립트 파일을 마우스 오른쪽 단추로 클릭한 다음 속성을 클릭합니다.
  4. 차단 해제를 클릭합니다.

인터넷에서 다운로드한 스크립트가 디지털 서명되었지만 게시자를 신뢰하도록 아직 선택하지 않은 경우 PowerShell은 다음 메시지를 표시합니다.

Do you want to run software from this untrusted publisher?
The file <file-name> is published by CN=<publisher-name>. This
publisher is not trusted on your system. Only run scripts
from trusted publishers.

[V] Never run  [D] Do not run  [R] Run once  [A] Always run
[?] Help (default is "D"):

게시자를 신뢰하는 경우 한 번 실행을 선택하거나 항상 실행합니다. 게시자를 신뢰하지 않는 경우 실행 안 함 또는 실행 안 함 중 하나를 선택합니다. 실행 안 하거나 항상 실행하지 않음을 선택하면 PowerShell에서 이 게시자에 대한 메시지를 다시 표시하지 않습니다.

스크립트 서명 방법

작성하는 스크립트와 다른 원본에서 가져오는 스크립트에 서명할 수 있습니다. 스크립트에 서명하기 전에 각 명령을 검사하여 실행해도 안전한지 확인합니다.

코드 서명에 대한 모범 사례는 코드 서명 모범 사례를 참조 하세요.

스크립트 파일에 서명하는 방법에 대한 자세한 내용은 Set-AuthenticodeSignature를 참조 하세요.

PowerShell 3.0의 PKI 모듈에 도입된 cmdlet은 New-SelfSignedCertificate 테스트에 적합한 자체 서명된 인증서를 만듭니다. 자세한 내용은 cmdlet에 대한 New-SelfSignedCertificate 도움말 항목을 참조하세요.

스크립트에 디지털 서명을 추가하려면 코드 서명 인증서를 사용하여 서명해야 합니다. 두 가지 유형의 인증서는 스크립트 파일에 서명하는 데 적합합니다.

  • 인증 기관에서 만든 인증서: 유료로 공용 인증 기관은 사용자의 ID를 확인하고 코드 서명 인증서를 제공합니다. 신뢰할 수 있는 인증 기관에서 인증서를 구매하면 다른 컴퓨터가 인증 기관을 신뢰하기 때문에 Windows를 실행하는 다른 컴퓨터의 사용자와 스크립트를 공유할 수 있습니다.

  • 만든 인증서: 컴퓨터가 인증서를 만드는 기관인 자체 서명된 인증서를 만들 수 있습니다. 이 인증서는 무료이며 컴퓨터에서 스크립트를 작성, 서명 및 실행할 수 있습니다. 그러나 자체 서명된 인증서로 서명된 스크립트는 다른 컴퓨터에서 실행되지 않습니다.

일반적으로 자체 서명된 인증서를 사용하여 직접 사용하기 위해 작성한 스크립트에 서명하고 안전한 것으로 확인된 다른 원본에서 가져오는 스크립트에 서명합니다. 엔터프라이즈 내에서도 공유되는 스크립트에는 적합하지 않습니다.

자체 서명된 인증서를 만드는 경우 인증서에서 강력한 프라이빗 키 보호를 사용하도록 설정해야 합니다. 이렇게 하면 악의적인 프로그램이 사용자 대신 스크립트에 서명할 수 없습니다. 지침은 이 항목의 끝에 포함되어 있습니다.

자체 서명된 인증서 만들기

자체 서명된 인증서를 만들려면 PKI 모듈에서 New-SelfSignedCertificate cmdlet을 사용합니다. 이 모듈은 PowerShell 3.0에서 도입되었습니다. 자세한 내용은 cmdlet에 대한 New-SelfSignedCertificate 도움말 항목을 참조하세요.

$params = @{
    Subject = 'CN=PowerShell Code Signing Cert'
    Type = 'CodeSigning'
    CertStoreLocation = 'Cert:\CurrentUser\My'
    HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params

Makecert.exe 사용

이전 버전의 Windows에서 자체 서명된 인증서를 만들려면 인증서 만들기 도구를 MakeCert.exe사용합니다. 이 도구는 Microsoft .NET SDK(버전 1.1 이상) 및 Microsoft Windows SDK에 포함되어 있습니다.

도구의 구문 및 매개 변수 설명 MakeCert.exe 에 대한 자세한 내용은 인증서 생성 도구(MakeCert.exe)를 참조하세요.

도구를 사용하여 MakeCert.exe 인증서를 만들려면 SDK 명령 프롬프트 창에서 다음 명령을 실행합니다.

참고 항목

첫 번째 명령은 컴퓨터에 대한 로컬 인증 기관을 만듭니다. 두 번째 명령은 인증 기관에서 개인 인증서를 생성합니다. 명령이 표시되는 대로 정확하게 복사하거나 입력할 수 있습니다. 인증서 이름을 변경할 수 있지만 대체는 필요하지 않습니다.

makecert -n "CN=PowerShell Local Certificate Root" -a sha256 `
-eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer `
-ss Root -sr localMachine

makecert -pe -n "CN=PowerShell User" -ss MY -a sha256 `
-eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

이 도구는 MakeCert.exe 프라이빗 키 암호를 묻는 메시지를 표시합니다. 암호는 아무도 사용자의 동의 없이 인증서를 사용하거나 액세스할 수 없도록 합니다. 기억할 수 있는 암호를 만들고 입력합니다. 나중에 이 암호를 사용하여 인증서를 검색합니다.

인증서가 올바르게 생성되었는지 확인하려면 다음 명령을 사용하여 컴퓨터의 인증서 저장소에서 인증서를 가져옵니다. 파일 시스템 디렉터리에서 인증서 파일을 찾을 수 없습니다.

PowerShell 프롬프트에서 다음을 입력합니다.

Get-ChildItem cert:\CurrentUser\my -codesigning

이 명령은 PowerShell 인증서 공급자를 사용하여 인증서에 대한 정보를 봅니다.

인증서를 만든 경우 출력은 다음과 유사한 디스플레이에서 인증서를 식별하는 지문을 표시합니다.

Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

Thumbprint                                Subject
----------                                -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF  CN=PowerShell User ]

스크립트 서명

자체 서명된 인증서를 만든 후 스크립트에 서명할 수 있습니다. AllSigned 실행 정책을 사용하는 경우 스크립트에 서명하면 컴퓨터에서 스크립트를 실행할 수 있습니다.

다음 샘플 스크립트는 Add-Signature.ps1스크립트에 서명합니다. 그러나 AllSigned 실행 정책을 사용하는 경우 스크립트를 Add-Signature.ps1 실행하기 전에 서명해야 합니다.

Important

스크립트는 ASCII 또는 UTF8NoBOM 인코딩을 사용하여 저장해야 합니다. 다른 인코딩을 사용하는 스크립트 파일에 서명할 수 있지만 스크립트가 실행되지 않거나 스크립트가 포함된 모듈을 가져오지 못합니다. 파일에 UTF8(유니코드) 문자가 포함된 경우에도 스크립트가 실패합니다.

이 스크립트를 사용하려면 다음 텍스트를 텍스트 파일에 복사하고 이름을 지정합니다 Add-Signature.ps1.

## Signs a file
[cmdletbinding()]
param(
    [Parameter(Mandatory=$true)]
    [string] $File
)

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature -FilePath $File -Certificate $cert

스크립트 파일에 서명 Add-Signature.ps1 하려면 PowerShell 명령 프롬프트에 다음 명령을 입력합니다.

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature add-signature.ps1 $cert

스크립트에 서명한 후 로컬 컴퓨터에서 실행할 수 있습니다. 그러나 PowerShell 실행 정책에 신뢰할 수 있는 기관의 디지털 서명이 필요한 컴퓨터에서는 스크립트가 실행되지 않습니다. 시도하면 PowerShell에 다음과 같은 오류 메시지가 표시됩니다.

The file C:\remote_file.ps1 cannot be loaded. The signature of the
certificate cannot be verified.
At line:1 char:15
+ .\ remote_file.ps1 <<<<

작성하지 않은 스크립트를 실행할 때 PowerShell에서 이 메시지를 표시하는 경우 서명되지 않은 스크립트를 처리하는 것처럼 파일을 처리합니다. 코드를 검토하여 스크립트를 신뢰할 수 있는지 여부를 확인합니다.

프라이빗 키에 대한 강력한 보호 사용

컴퓨터에 프라이빗 키와 인증서가 있는 경우 악성 프로그램이 사용자 대신 스크립트에 서명할 수 있으며, 이를 실행하도록 PowerShell에 권한을 부여합니다.

사용자 대신 자동 서명을 방지하려면 인증서 관리자 Certmgr.exe 를 사용하여 서명 키와 인증서를 파일로 .pfx 내보냅니다. 인증서 관리자는 Microsoft .NET SDK, Microsoft Windows SDK 및 Internet Explorer에 포함됩니다.

인증서를 내보내려면 다음을 수행합니다.

  1. 인증서 관리자를 시작합니다.
  2. PowerShell 로컬 인증서 루트에서 발급한 인증서를 선택합니다.
  3. 내보내기를 클릭하여 인증서 내보내기 마법사를 시작합니다.
  4. 예, 프라이빗 키를 내보냅니다.를 선택한 후, 다음을 클릭합니다.
  5. 강력한 보호 사용 선택
  6. 암호를 입력한 다음 다시 입력하여 확인합니다.
  7. 파일 이름 확장자를 가진 .pfx 파일 이름을 입력합니다.
  8. Finish를 클릭합니다.

인증서를 다시 가져오려면 다음을 수행합니다.

  1. 인증서 관리자를 시작합니다.
  2. 가져오기를 클릭하여 인증서 가져오기 마법사를 시작합니다.
  3. 내보내기 프로세스 중에 만든 파일의 .pfx 위치로 엽니다.
  4. 암호 페이지에서 강력한 프라이빗 키 보호 사용을 선택한 다음 내보내기 프로세스 중에 할당한 암호를 입력합니다.
  5. 개인 인증서 저장소를 선택합니다.
  6. Finish를 클릭합니다.

서명이 만료되지 않도록 방지

서명 인증서가 만료될 때까지 또는 타임스탬프 서버가 서명 인증서가 유효한 동안 스크립트에 서명되었는지 확인할 수 있는 한 스크립트의 디지털 서명은 유효합니다.

대부분의 서명 인증서는 1년 동안만 유효하기 때문에 타임스탬프를 사용하면 사용자가 앞으로 몇 년 동안 스크립트를 사용할 수 있습니다.

참고 항목