创建自签名PowerShell脚本即将完成

时间:2017-07-04 16:40:25

标签: powershell certificate x509certificate powershell-v4.0 x509certificate2

在自己调查此问题时,我无法在自签名PowerShell脚本上找到任何开始完成的解决方案。那么,如何在PowerShell本身中自行处理它以利用AllSigned执行策略并帮助更好地保护您的系统?

1 个答案:

答案 0 :(得分:2)

这是自签名PowerShell脚本的现代方法。我发现旧版本的PowerShell ISE(仅确认为2.0)将使用Big Endian和UTF-8对脚本进行编码,并导致签名问题。使用这种方法,你不应该遇到这种情况,因为我们在v4 +这里 要求:PoSH 4.0 +。

此功能将:检查Pfx证书是否存在并将其导入LocalMachine\TrustedPublisher;检查是否已将证书传递给它,导出到Pfx证书并导入;或者为LocalMachine\Personal创建证书,导出它并导入它。我无法获得与我合作使用Cert:\CurrentUser(个人)以外的\My商店的权限。

$ErrorActionPreference = 'Stop'

Function New-SelfSignedCertificate
{
    Param([Parameter(Mandatory=$True)]$PfxCertPath,$CertObj)

    # Creates a SecureString object
    $Cred = (Get-Credential).Password

    If (Test-Path $PfxCertPath)
    {
        Try {
          Import-PfxCertificate -FilePath $PfxCertPath -Password $Cred -CertStoreLocation Cert:\LocalMachine\TrustedPublisher
          Write "$($PfxCertPath.FriendlyName) exists and is valid. Imported certificate to TrustedPublishers"
        } Catch {
          Write "Type mismatch or improper permission. Ensure your PFX cert is formed properly."
          Write "[$($_.Exception.GetType().FullName)] $($_.Exception.Message)"
        }
    } ElseIf ($CertObj) {
        Try {
          Export-PfxCertificate -Cert $CertObj -FilePath $PfxCertPath -Password $Cred -Force
          Import-PfxCertificate -FilePath $PfxCertPath -Password $Cred -CertStoreLocation Cert:\LocalMachine\TrustedPublisher
        } Catch {
          Write "[$($_.Exception.GetType().FullName)] $($_.Exception.Message)"
        }
    } Else {
        Try {
          $DNS = "$((GWMI Win32_ComputerSystem).DNSHostName).$((GWMI Win32_ComputerSystem).Domain)"
          $CertObj = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName $DNS -Type CodeSigningCert -FriendlyName 'Self-Sign'
          Export-PfxCertificate -Cert $CertObj -FilePath $PfxCertPath -Password $Cred -Force
          Import-PfxCertificate -FilePath $PfxCertPath -Password $Cred -CertStoreLocation Cert:\LocalMachine\TrustedPublisher
        } Catch {
          Write "[$($_.Exception.GetType().FullName)] $($_.Exception.Message)"
        }
    }
}

# Can be called like:
#   Sign-Script -File C:\Script.ps1 -Certificate (GCI Cert:\LocalMachine\TrustedPublisher -CodeSigningCert)
#
# After the cert is imported to TrustedPublisher, you can use the
# exported pfx cert to sign on the machine instead of this method
Function Sign-Script
{
    Param($File,$Cert)
    If($Cert-is[String]){Try{$Cert=Get-PfxCertificate("$Cert")}Catch{}}
    Set-AuthenticodeSignature -FilePath $File -Certificate $Cert -Force
}
Function Check-SignedScript
{
    Param($File)
    Get-AuthenticodeSignature -FilePath $File 
}

完成所有操作后,您可以以管理员身份执行Set-ExecutionPolicy AllSigned并使用此脚本对所有脚本进行签名。 Check-SignedScript会告诉您该标志是否有效,并且您可以判断Sign-Script是否有效,因为您的文件最后会# SIG # Begin signature block。需要重新签名对已签名脚本的任何编辑才能执行。