디지털 서명이 있는 스크립트 또는 실행 파일을 통해 사용자는 파일이 원본이고 해당 코드가 제3자에 의해 변경되지 않았는지 확인할 수 있습니다. 현재 버전의 PowerShell에는 디지털 인증서를 사용하여 *.ps1 스크립트 파일의 코드 서명을 위한 도구가 내장되어 있습니다.
특별한 유형의 인증서인 코드 서명을 사용하여 PowerShell 스크립트에 서명할 수 있습니다. . 이 인증서는 외부 상용 인증 기관(AC), 내부 엔터프라이즈 CA에서 얻거나 자체 서명된 인증서를 사용할 수 있습니다.
PKI 서비스(Active Directory 인증서 서비스)가 도메인에 배포되어 있다고 가정합니다. https://CA-server-name/certsrv로 이동하여 코드 서명으로 새 인증서를 요청하여 새 인증서를 요청해 보겠습니다. 템플릿(이 템플릿은 먼저 인증 기관 콘솔에서 활성화해야 함).
또한 사용자는 mmc 스냅인 인증서 -> 내 계정 -> 개인 -> 모든 작업 -> 새 인증서 요청에서 PowerShell 스크립트 서명을 위한 인증서를 요청할 수 있습니다.
인증서를 수동으로 요청한 경우 .cer이 있는 x509 인증서 파일이 있어야 합니다. 확대. 이 인증서는 컴퓨터의 로컬 인증서 저장소에 설치해야 합니다.
다음 PowerShell 명령을 사용하여 컴퓨터의 신뢰할 수 있는 루트 인증서에 인증서를 추가할 수 있습니다.
$certFile = Export-Certificate -Cert $cert -FilePath C:\ps\certname.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath $certFile.FullName
자체 서명된 인증서를 사용하려면 New-SelfSignedCertificate cmdlet을 사용하여 DNS 이름이 testPC1인 CodeSigning 인증서를 만듭니다.
New-SelfSignedCertificate -DnsName testPC1 -Type CodeSigning
$cert = New-SelfSignedCertificate -Subject "Cert for Code Signing” -Type CodeSigningCert -DnsName test1 -CertStoreLocation cert:\LocalMachine\My
인증서가 생성된 후 인증서 관리자 콘솔(certmgr.msc
)을 사용하여 중간 컨테이너에서 신뢰할 수 있는 루트로 인증서를 이동합니다. ).
인증서를 받은 후 서명된 스크립트만 실행할 수 있도록 PowerShell 스크립트 실행 정책을 구성할 수 있습니다. 기본적으로 Windows 10/Windows Server 2016의 PowerShell 실행 정책은 제한됨 으로 설정됩니다. (모든 PowerShell 스크립트의 실행을 차단합니다).
File C:\ps\script.ps1 cannot be loaded because running scripts is disabled on this system.
서명된 PS1 스크립트만 실행하도록 허용하려면 PowerShell 실행 정책을 AllSigned 또는 RemoteSigned로 변경할 수 있습니다(RemoteSigned는 인터넷에서 다운로드한 스크립트에 대해서만 서명이 필요하다는 유일한 차이점).
Set-ExecutionPolicy AllSigned –Force
이 모드에서 서명되지 않은 PowerShell 스크립트를 실행할 때 오류가 나타납니다.
File C:\script.ps1 cannot be loaded. The file script.ps1 is not digitally signed. You cannot run this script on the current system.스크립트 실행 켜기를 사용하여 서명된 PowerShell 스크립트를 실행하도록 허용할 수도 있습니다. 컴퓨터 구성 -> 정책 -> 관리 템플릿 -> Windows 구성 요소 -> Windows PowerShell 아래의 그룹 정책 매개변수. 매개변수 값을 서명된 스크립트만 허용으로 변경합니다. .
이제 PowerShell 스크립트 파일 서명으로 넘어 갑시다. 먼저 현재 사용자의 로컬 인증서 저장소에서 CodeSign 인증서를 가져와야 합니다. 먼저 코드 서명에 사용할 수 있는 모든 인증서를 나열해 보겠습니다.
Get-ChildItem cert:\CurrentUser\my –CodeSigningCert
우리의 경우 개인 사용자 인증서 저장소에서 첫 번째 인증서를 가져와 $cert 변수에 저장합니다.
$cert = (Get-ChildItem cert:\CurrentUser\my –CodeSigningCert)[0]
인증서를 신뢰할 수 있는 루트 인증서 저장소로 이동한 경우 다음 명령을 사용하십시오.
$cert = (Get-ChildItem Cert:\LocalMachine\AuthRoot –CodeSigningCert)[0]
그런 다음 이 인증서를 사용하여 PowerShell 스크립트로 PS1 파일에 서명할 수 있습니다.
Set-AuthenticodeSignature -Certificate $cert -FilePath C:\PS\testscript.ps1
다음 명령을 사용할 수도 있습니다(이 경우 이전에 DnsName에서 만든 자체 서명된 인증서 선택).
Set-AuthenticodeSignature C:\PS\test_script.ps1 @(gci Cert:\LocalMachine\AuthRoot -DnsName testPC1 -codesigning)[0]
-TimestampServer "https://timestamp.verisign.com/scripts/timstamp.dll"
일반 SSL/TLS 인증서를 사용하여 스크립트에 서명하려고 하면 오류가 나타납니다.
Set-AuthenticodeSignature: Cannot sign code. The specified certificate is not suitable for code signing.
폴더에 있는 모든 PowerShell 스크립트 파일에 한 번에 서명할 수 있습니다.
Get-ChildItem c:\ps\*.ps1| Set-AuthenticodeSignature -Certificate $Cert
이제 PowerShell 스크립트 파일이 제대로 서명되었는지 확인할 수 있습니다. Get-AuthenticodeSignature cmdlet을 사용하거나 PS1 파일 속성을 열고 디지털 서명 탭.
Get-AuthenticodeSignature c:\ps\test_script.ps1 | ft -AutoSize
UnknownError
Set-AuthenticodeSignature 명령을 실행하는 동안 경고가 나타나면 이 인증서는 사용자의 개인 인증서 저장소에 있기 때문에 신뢰할 수 없습니다.
신뢰할 수 있는 루트 인증서로 이동해야 합니다(Windows 인증서 저장소에 의심스러운 인증서가 있는지 주기적으로 확인하고 신뢰할 수 있는 루트 인증서 목록을 업데이트하는 것을 잊지 마십시오):
Move-Item -Path $cert.PSPath -Destination "Cert:\LocalMachine\Root"
이제 PS1 파일의 서명을 확인할 때 Valid 상태가 반환되어야 합니다.
PowerShell 스크립트 파일에 서명할 때 Set-AuthenticodeSignature cmdlet은 PS1 텍스트 파일 끝에 디지털 서명 블록을 추가합니다.
# SIG # Begin signature block ........... ........... # SIG # End signature block
서명 블록에는 개인 키를 사용하여 암호화된 스크립트의 해시가 포함됩니다.
스크립트를 처음 실행하려고 하면 경고가 나타납니다.
Do you want to run software from this untrusted publisher? File C:\PS\script.ps1 is published by CN=testPC1 and is not trusted on your system. Only run scripts from trusted publishers.
[A] 스크립트를 처음 실행할 때 항상 실행을 선택하면 , 다음에 이 인증서를 사용하여 서명된 스크립트를 실행할 때 경고가 더 이상 표시되지 않습니다.
<강한>
이 경고가 표시되지 않도록 하려면 인증서를 신뢰할 수 있는 게시자에도 복사해야 합니다. 인증 기관. 인증서 콘솔에서 복사-붙여넣기 작업을 사용하여 인증서를 신뢰할 수 있는 게시자 -> 인증서
에 복사합니다.<강한>
이제 서명된 PowerShell 스크립트가 신뢰할 수 없는 게시자 알림을 표시하지 않고 실행됩니다.
도움말 . CA 루트 인증서와 스크립트 서명에 사용된 인증서는 신뢰할 수 있어야 합니다(그렇지 않으면 스크립트가 실행되지 않음). GPO를 사용하여 도메인 컴퓨터에 인증서를 중앙에서 배포할 수 있습니다. 인증서는 GPO의 다음 공개 키 섹션에 배치해야 합니다. 컴퓨터 구성 -> 정책 -> Windows 설정 -> 보안 설정 -> 공개 키 정책 -> 신뢰할 수 있는 루트 인증 기관 및 신뢰할 수 있는 게시자 .
루트 인증서를 신뢰할 수 없는 경우 PowerShell 스크립트를 실행할 때 오류가 나타납니다.
A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
서명된 PowerShell 스크립트 파일의 코드를 변경하면 어떻게 됩니까? 스크립트의 내용이 변경되었다는 알림과 함께 실행 시도가 차단됩니다.
File xx.ps1 cannot be loaded. The contents of file xx.ps1 might have been changed by an unauthorized user or process, because the hash of the file does not match the hash stored in the digital signature. The script cannot run on the specified system.
Get-AuthenticodeSignature cmdlet을 사용하여 스크립트의 서명을 확인하십시오. 계산된 해시가 서명의 해시와 일치하지 않으면 HashMismatch
메시지 나타납니다.
따라서 서명된 PS1 스크립트의 코드를 수정하려면 다시 서명해야 합니다.