Powershell 스 크 립 트 디지털 서명 실현 방법

스 크 립 트 는 일반 텍스트 로 구성 되 어 있 기 때문에 이름 을 사칭 하거나 변경 되 기 쉽다.디지털 서명 은 스 크 립 트 와 스 크 립 트 의 편집자 의 유일 성 을 확인 하고 변경 할 수 없 기 때문에 스 크 립 트 에 더 높 은 안전성 을 제공 합 니 다.스 크 립 트 의 발표 자로 서 스 크 립 트 가 악의 적 으로 변경 되 지 않 았 다 는 것 을 확인 할 수 있 습 니 다.전문가 도 어 쩔 수 없다.복잡 한 논리 에 기초 한 것 이기 때문이다.다행히도 실제 응용 프로그램 에서 이러한 세부 사항 을 깊이 연구 할 필요 가 없고 Powershell 스 크 립 트 서명 의 메커니즘 과 과정 만 파악 해 야 합 니 다.
적당 한 증 서 를 준비 하 다.
Powershell 스 크 립 트 에 전통 적 인 종이 서명 을 사용 할 수 없 기 때문에 다른 도구 인'인증서'가 필요 합 니 다.인증 서 는 개인 적 이 고 안전 한 열쇠 와 같다.증 서 는 당신 의 개인 전자 신분 특징 입 니 다.이 비밀 열 쇠 는 인증서 소유자 만 인증서 로 스 크 립 트 서명 을 할 수 있 도록 합 니 다.
mmc 를 통 해 관리 부 를 추가 하여 인증 서 를 볼 수 있 지만 Powershell 에 서 는 인증 서 를 전문 적 으로 볼 수 있 습 니 다.가상 드라이브 cert:이 컴퓨터 가 지원 하 는 인증 서 를 볼 수 있 습 니 다.
자체 서명 인증서 만 들 기
자체 서명 인증 서 를 만 들 려 면 microsoft 도구,Makecert.exe 를 사용 해 야 합 니 다.이 도 구 는 단독으로 다운로드 할 수 없 지만 마이크로소프트 의.NET framework 에 포함 되 어 있 습 니 다.만약 당신 의 컴퓨터 에 Visual studio 가 설치 되 어 있다 면 훨씬 편리 할 것 입 니 다.
시작->모든 프로그램-microsoft Visual Studio 2010->Visual Studio Tools->Visual Studio 명령 알림(2010)

makecert.exe -pe -r -n "cn=MosserPowerShellTestCert" -eku 1.3.6.1.5.5.7.3.3 -ss "my"
Succeeded
여기 서-eku 매개 변수:1.3.6.1.5.7.3.3,다른 것 이 아 닙 니 다.그렇지 않 으 면 인증서 의 예상 목적 속성 은 코드 서명 이 아 닙 니 다.
위 에서 만 든 인증 서 는 Current UserMy 경로 아래 에 자동 으로 저 장 됩 니 다.Powershell 에서 보기:

PS E:> ls cert:CurrentUserMy | where {$_.subject -eq "CN=MosserPowerShellTestCert"}

    : Microsoft.PowerShell.SecurityCertificate::CurrentUserMy

Thumbprint                Subject
----------                -------
BA61AF0B8A856422AD9EF86104C8CEDB2583A21A CN=MosserPowerShellTestCert
인증 코드 서명 인증서
지원 코드 서명 인증서 보기
인증서 의 발급 자,대표,시리 얼 번호,지문 을 확인 합 니 다.

##               :
$certs = @(Dir cert:CurrentUserMy -codeSigningCert)
"   {0}        " -f $certs.count
#    1        
 
##           
$certificate=ls cert:CurrentUserMy | where {$_.subject -eq "CN=MosserPowerShellTestCert"}
 
##      
$certificate.subject
# CN=MosserPowerShellTestCert
 
##       
$certificate.issuer
# CN=MosserPowerShellTestCert
 
##       ,  
$certificate | select SerialNumber,Thumbprint | fl *
# SerialNumber : C23F35EA85D9A5AB466C07A7C0469A78
# Thumbprint  : 586A4332F0528867DA6A0900FCF0938EDD277E22
인증서 가 신뢰 받 는 것 을 설명 합 니 다.
인증서 의 종류,발급 자의 이름 등 정 보 를 지정 하면 인증서 의 원본 데이터(RawData)가 자동 으로 생 성 됩 니 다.이렇게 하면 다른 사람 이 인증 서 를 만 드 는 것 을 사칭 해 서 는 안 되 고,다른 사람 도 당신 의 이름 을 사칭 하여 인증 서 를 만 들 수 없습니다.Powershell 을 통 해 이전에 생 성 된 인증서 가 신뢰 를 받 는 지 확인 하면 정 답 은 아 닙 니 다.

PS E:> $certificate.Verify()
False
왜 우리 가 방금 만 든 인증 서 는 신뢰 를 받 지 못 합 니까?우 리 는 간단 한 절 차 를 통 해 답 을 찾 을 수 있다..NET 에 서 는 System.security.dll 에 있 는 인증 서 를 대화 상자 로 표시 할 수 있 는 방법 이 있 습 니 다.이 dll 은 기본적으로 인용 되 지 않 았 습 니 다.인용 을 추가 한 다음 인증서 대화 상 자 를 표시 해 야 합 니 다.

PS E:> [System.Reflection.Assembly]::LoadWithPartialName("System.Security")

GAC  Version    Location
---  -------    --------
True  v2.0.50727   C:windowsassemblyGAC_MSILSystem.Security2.0.0.0__b03f5f7f11d50a3aSys...

[System.Security.Cryptography.x509Certificates.X509Certificate2UI]::DisplayCertificate($certificate)

Powershell 인증서 보기 신뢰 할 수 없 음
대화 상자 알림:이 CA 루트 인증 서 는 신뢰 를 받 지 않 습 니 다.신뢰 를 사용 하려 면 이 인증 서 를'신뢰 받 는 루트 인증 기관'저장 소 에 설치 하 십시오.
그래서 이 인증 서 를 신뢰 하 는 저장 소 에 복사 할 수 있 습 니 다.certmgr.msc 를 통 해 수 동 으로 조작 할 수도 있 고 Powershell 자동화 로 조작 할 수도 있 습 니 다.

PS E:> $rootStore= New-Object system.security.cryptography.X509Certificates.x509Store("root","Curre
ntuser")
$rootStore.Open("ReadWrite")
$rootStore.Add($certificate)
$rootStore.Close()
Add 작업 을 수행 할 때 확인 대화 상자 가 있 습 니 다.확인 하면 됩 니 다.
다음은 검증 정 보 를 살 펴 보 겠 습 니 다.

PS E:> $certificate.Verify()
True
Powershell 스 크 립 트 에 서명 하기
Powershell 스 크 립 트 에 디지털 서명 을 하려 면 두 단계 만 필요 합 니 다.신뢰 할 수 있 는 코드 서명 인증 서 를 찾 습 니 다.나머지 작업 은 Set-AuthenticodeSignature 에 맡 기 십시오.

PS E:> 'Write-Host "         "' > firstSignScript.ps1
PS E:> $certificate=ls cert:CurrentUserMy | where {$_.subject -eq "CN=MosserPowerShellTestCert"}
PS E:> Set-AuthenticodeSignature .firstSignScript.ps1 $certificate

    : E:

SignerCertificate            Status Path
-----------------            ------ ----
586A4332F0528867DA6A0900FCF0938EDD277E22 Valid firstSignScript.ps1

PS E:> Get-Content .firstSignScript.ps1
Write-Host "         "

# SIG # Begin signature block
# MIIEIQYJKoZIhvcNAQcCoIIEEjCCBA4CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUnxRdr+yE6sFotfvZjfn8k15W
# OtigggI0MIICMDCCAZ2gAwIBAgIQwj816oXZpatGbAenwEaaeDAJBgUrDgMCHQUA
# MCMxITAfBgNVBAMTGE1vc3NlclBvd2VyU2hlbGxUZXN0Q2VydDAeFw0xMjA2MTYx
# MzAyMjZaFw0zOTEyMzEyMzU5NTlaMCMxITAfBgNVBAMTGE1vc3NlclBvd2VyU2hl
# bGxUZXN0Q2VydDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAr/2eZ6iS3Zi4
# Q2RsXFPRmDynztxPwArZ6SK663R6X2Dfqwv+kuev4VbEHJ20Bvd9yLvCS4QgCCR6
# n0D+ELfBy6aRpst51dNKNGV74TZIBu1M5EKG2+didLrKTx3lwEC66Bl+QyFiOzcH
# ZhQcaZzgdx8m8EN10/B2cDg9Tm9ppQsCAwEAAaNtMGswEwYDVR0lBAwwCgYIKwYB
# BQUHAwMwVAYDVR0BBE0wS4AQjHzaaSg4KlNdyvIpJNjeiqElMCMxITAfBgNVBAMT
# GE1vc3NlclBvd2VyU2hlbGxUZXN0Q2VydIIQwj816oXZpatGbAenwEaaeDAJBgUr
# DgMCHQUAA4GBAFA3lvWcbA8mWndKdIOCzQUbC9/+1vIeQRGaH7L6U6OHZuV2IBw1
# EpLxz1/dyFEMNZmy9z+/YjfJi774UY1eTzOJnz0AYKGPpM0BK2ieGZzPDIlbkpv1
# ywrv5BtRt053MNHRYaZQP0v9Sp6pOB4h10tKnvh0DW882zRPeB4hkK+fMYIBVzCC
# AVMCAQEwNzAjMSEwHwYDVQQDExhNb3NzZXJQb3dlclNoZWxsVGVzdENlcnQCEMI/
# NeqF2aWrRmwHp8BGmngwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKA
# AKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFMgyEZ64UFors3z9JGuKLVxh
# P2hLMA0GCSqGSIb3DQEBAQUABIGAMHFJHMVlauxKGIo2p9ieFBVp4Am6n533k89j
# 7pQXKOGmU/sG9d8PILifHLJZw7BU66+uZFvOSXlUxvqaPRAdeosc2BLDPf5Cu6o7
# 61BfSJc2H5dQCgbK/90OKmeJp4KJQRCk7HLEBvV23ddVSyl4CPplbUcTVmo92Zd1
# B/Moxro=
# SIG # End signature block
모든 스 크 립 트 파일 에 서명 하기
현재 파일 에 있 는 모든 스 크 립 트 에 서명 하기

PS E:> Set-AuthenticodeSignature (ls *.ps1) $certificate

    : E:

SignerCertificate            Status Path
-----------------            ------ ----
586A4332F0528867DA6A0900FCF0938EDD277E22 Valid firstSignScript.ps1
586A4332F0528867DA6A0900FCF0938EDD277E22 Valid MyScript.ps1
586A4332F0528867DA6A0900FCF0938EDD277E22 Valid pipeline.ps1
586A4332F0528867DA6A0900FCF0938EDD277E22 Valid PSLib.ps1
만약 당신 이 당신 을 좋아한다 면 재 귀적 으로 사용 할 수도 있 습 니 다.

Set-AuthenticodeSignature (Dir -recurse -include *.ps1) $certificate
인증서 선택 대화 상자 사용 하기
기계 에 코드 서명 이 설 치 된 인증서 가 많 으 면 friendName 이나 인증서 의 이름,인증서 의 지문 을 통 해 스 크 립 트 서명 을 위 한 인증 서 를 걸 러 낼 수 있 습 니 다.

 Dir cert:CurrentUserMy |
 where {$_.subject -eq "CN=MosserPowerShellTestCert"}
다른 방법 은.NET 에 내 장 된 대화 상 자 를 통 해 선택 하 는 것 이다.조 회 된 인증 서 를 SelectFromCollection()방법 에 전달 합 니 다.이 작업 을 하기 전에 인증 서 를 특별한 집합 에 두 어야 합 니 다.

#      :
$title = "     "
$text = "            :"
# Find certificates:
$certificates = Dir cert: -recurse -codeSigningCert
#    System.Security   
#            (X509Certificate2Collection) :
[Reflection.Assembly]::LoadWithPartialName("System.Security")
$collection = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2Collection
$certificates | ForEach-Object { $collection.Add($_) }
#     :
$certificate =[System.Security.Cryptography.x509Certificates.X509Certificate2UI]::`
SelectFromCollection($collection, $title, $text, 0)
#              
Set-AuthenticodeSignature -Certificate $certificate[0] -FilePath .firstSignScript.ps1

Powershel l 대화 상자 에서 인증서 선택
Powershell 스 크 립 트 서명 검증
스 크 립 트 에 서명 하면 어떤 좋 은 점 이 있 는 지 검증 할 수 있 습 니 다.수 동 으로 검증 할 수도 있 고 자동 으로 검증 할 수도 있다.서명 검증 은 스 크 립 트 가 신뢰 하 는 지,악의 적 인 변경 이 포함 되 어 있 는 지 알려 줍 니 다.
사용자 자체 검증:수 동 검증,스 크 립 트 에 서명 코드 가 포함 되 어 있 는 지 확인 할 수 있 습 니 다.서명 자 는 누구 입 니까?이 서명 자 는 신뢰 를 받 습 니까?
자동 검증:Powershell 의 스 크 립 트 실행 정책 을 AllSigned.Powershell 로 설정 하면 스 크 립 트 를 실행 하려 고 할 때 코드 와 스 크 립 트 서명 이 일치 하 는 지 자동 으로 검증 합 니 다.또한 서명자 에 게 신뢰 여 부 를 묻는다.
수 동 검증
Get-AuthenticodeSignature 명령 은 서명 을 검증 할 수 있 습 니 다.예 를 들 어 스 크 립 트 를 만 들 고 서명 하지 않 으 며 이 명령 을 통 해 검증 합 니 다.속성 StatusMessage 는 서명 검증 결 과 를 알려 줍 니 다.

 "'   '" >notsign.ps1
$checkResult=Get-AuthenticodeSignature .notsign.ps1
$checkResult.Status
NotSigned
$checkResult.StatusMessage
   E:notsign.ps1       。         。      ,    "get-help about_signing"
。
$checkResult.Status.GetType().fullName
System.Management.Automation.SignatureStatus
서명 되 지 않 은 스 크 립 트 를 실행 하면 오류 알림 메시지,즉 StatusMessage 에 포 함 된 정 보 를 받 을 수 있 습 니 다.스 크 립 트 의 인증 결과 상 태 는 다음 과 같 습 니 다.
구성원 이름
묘사 하 다.
HashMismatch
파일 의 해시 코드 가 저 장 된 서명 과 일치 하지 않 습 니 다.
Incompatible
현재 운영 체제 와 호 환 되 지 않 기 때문에 서명 을 검증 할 수 없습니다.
NotSigned
파일 에 서명 하지 않 음
NotSupportedFileFormat
지정 한 파일 형식 이 지원 되 지 않 는 시스템 서명 입 니 다.이것 은 일반적으로 시스템 이 파일 의 형식 을 서명 하거나 검증 하 는 방법 을 모른다 는 것 을 의미한다.
NotTrusted
인증서 의 발표 자 는 시스템 에서 신뢰 를 받 지 못 합 니 다.
UnknownError
파일 서명 이 잘못 되 었 습 니 다.
Valid
이 파일 은 유효한 서명 이 있 습 니 다.이것 은 서명 한 문법 만 합 법 적 이라는 것 을 의미한다.믿음 을 의미 하 는 것 은 아니다.
자동 검증
스 크 립 트 의 서명 을 검증 할 필요 가 없습니다.스 크 립 트 를 실행 할 때 Powershell 이 자동 으로 검 증 됩 니 다.검 증 된 스 크 립 트 라 도 일부 내용 이 업데이트 되면 자동 으로 검 증 된 스 크 립 트 는 경 고 를 줍 니 다.
사용자 가 스 크 립 트 실행 정책 을 AllSigned 와 RemoteSigned 로 설정 하면 자동 검증 이 활성화 되 며,실행 정책 을 AllSigned 로 설정 하면 모든 스 크 립 트 가 검 증 됩 니 다.RemoteSigned 를 선택 하면 인터넷 에서 다운로드 한 스 크 립 트 실행 에 서명 이 필요 하 다 는 것 을 알려 줍 니 다.

#    ExecutionPolicy   AllSigned.   
#           :
Set-ExecutionPolicy AllSigned
#            .
#        :
       E:unSigned.ps1。   E:unSigned.ps1       。         。      ,
    "get-help about_signing"。。
      :1   : 15
+ .unSigned.ps1 < <<<
  + CategoryInfo     : NotSpecified: (:) [], PSSecurityException
  + FullyQualifiedErrorId : RuntimeException

          ,        ,    。
.firstSignScript.ps1

                 ?
   E:firstSignScript.ps1   CN=MosserPowerShellTestCert
  ,              。              。
[V]     (V) [D]    (D) [R]     (R) [A]     (A) [?]    (    “D”): a
         

#     ,    
         
Windows PowerShell 로 실 행 된 스 크 립 트 가 디지털 서명 을 하지 않 았 음 을 표시 합 니 다.
서명 하지 않 은 스 크 립 트 를 실행 하거나 스 크 립 트 에 서명 할 수 있 도록 설정 하 십시오.set-executionpolicy Bypass여기까지 문장 이 끝 났 으 니 필요 한 친 구 는 참고 하 세 요.

좋은 웹페이지 즐겨찾기