- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Powershell 脚本数字签名实现方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
脚本很容易被冒名顶替或者更改,因为它们是由纯文本构成的。数字签名为脚本提供了更高的安全性,因为它能确定脚本和脚本的编辑者的唯一性,并且不能被更改。作为脚本的发布者,你能确定你的脚本没有被恶意篡改。即使专家也无能为力,因为这种机制是基于复杂逻辑的。幸运的是,在实际应用中,你不需要深究这些细节,只需要掌握Powershell脚本签名的机制和过程.
准备一个合适的证书 。
因为不能使用传统的纸质签名给Powershell脚本进行签名,你需要另一个工具“证书”。证书就像一把私有并且安全的钥匙。证书是你的个人电子身份特征。这把私密的钥匙确保只有证书的拥有者使用证书进行脚本签名.
可以通过mmc添加管理单元查看证书,但是在Powershell中有专门查看证书的支持。可以通过虚拟驱动器cert:查看本机支持的证书.
创建自签名证书 。
创建一个自签名证书,需要用到microsoft的工具,makecert.exe 。这个工具不能单独下载,但是它包含在微软的.NET framework中,如果你的电脑上已经安装了Visual studio 那就方便多了.
开始->所有程序-Microsoft Visual Studio 2010->Visual Studio Tools->Visual Studio 命令提示(2010) 。
1
2
|
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.5.7.3.3,不能是其它,否则证书的预期目的属性就不是代码签名了。 上面创建的证书会自动保存在CurrentUserMy 路径下面。可以在Powershell中查看:
1
2
3
4
5
6
7
|
PS
E:>
ls
cert:CurrentUserMy |
where
{$_.subject
-eq
"CN=MosserPowerShellTestCert"
}
目录: Microsoft.PowerShell.SecurityCertificate::CurrentUserMy
Thumbprint Subject
---------- -------
BA61AF0B8A856422AD9EF86104C8CEDB2583A21A CN=MosserPowerShellTestCert
|
验证代码签名证书 。
查看支持代码签名的证书 查看证书的签发者,代表,序列号,指纹.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
## 查看预期目的为代码签名的证书:
$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查看之前生成的证书是否受信任,答案为否.
1
2
|
PS
E:>
$certificate
.Verify()
False
|
为什么我们刚才生成的证书不受信任呢?我们可以通过一个简单的步骤找到答案。在.NET 中有一个方法:DisplayCertificate()可以通过对话框显示证书,位于System.Security.dll中。这个dll默认没有引用,需要添加引用,之后显示证书对话框.
1
2
3
4
5
6
7
|
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自动化操作.
1
2
3
4
5
|
PS
E:>
$rootStore
=
New-Object
system.security.cryptography.X509Certificates.x509Store(
"root"
,"Curre
ntuser")
$rootStore
.Open(
"ReadWrite"
)
$rootStore
.Add(
$certificate
)
$rootStore
.Close()
|
在执行Add操作时,会有一个确认的对话框,确定即可.
接下来我们查看一下验证信息.
1
2
|
PS
E:>
$certificate
.Verify()
True
|
给Powershell 脚本签名 。
给Powershell脚本进行数字签名只需要两步:找的一个受信任的代码签名证书,剩下的工作请交给:Set-AuthenticodeSignature吧.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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
|
递归给所有脚本文件签名 。
给当前文件下的所有脚本签名 。
1
2
3
4
5
6
7
8
9
10
|
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
|
如果你喜欢你甚至可以递归使用 。
1
|
Set-AuthenticodeSignature
(
Dir
-recurse
-include
*.ps1)
$certificate
|
使用对话框选择证书 。
如果机器上安装了代码签名的证书有许多,你可以通过friendName 或者证书的名称,证书的指纹,过滤一个证书供脚本签名.
1
2
|
Dir
cert:CurrentUserMy |
where
{$_.subject
-eq
"CN=MosserPowerShellTestCert"
}
|
另一种方法是通过.NET中的内置的对话框进行选择。将查询到的证书传递给SelectFromCollection()方法,在在作此操作之前必须将证书放在一个特殊的集合中.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 对话框文本:
$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会告诉你签名验证的结果.
1
2
3
4
5
6
7
8
9
|
"'未签名'"
>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,从网络上下载的脚本执行会提示需要签名.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 设置 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 。
到这里文章就结束了,需要的朋友可以参考一下.
原文链接:http://www.pstips.net/powershell-scripts-signature.html 。
最后此篇关于Powershell 脚本数字签名实现方法的文章就讲到这里了,如果你想了解更多关于Powershell 脚本数字签名实现方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在寻找实现 PowerShell 提供程序 在 电源外壳。 我一直在想,如果我只是定义类型,然后将它们导入我的 session (导入模块),我应该能够让它们可用。 例如,这个 不工作但它沿着我想
我创建的脚本使用了组件,这些组件仅在32位版本的Powershell中可用。 默认情况下,Windows使用Powershell x64执行脚本,这会导致一些错误。 是一种在脚本开头设置值以强制Win
是否可以从 Powershell 中检测它是否是嵌套 shell? 如果我打开 Powershell 或 cmd.exe 窗口,然后输入 powershell 在那里,是否有一个神奇的 $host.s
随着 PowerShell Core 的发布,应用程序在使用托管自动化库 (system.management.automation) 时如何选择调用哪个版本的 Powershell(Powershe
最近,我加入了我企业的 Windows 团队,凭借我的开发人员背景(一般是 Java、.NET 和 Web),我很快就对 PowerShell 产生了兴趣。我可以看到它比普通的旧批处理文件、VB 更有
假设我有一个 powershell 脚本,它在我当前路径的相对路径中包含一个 Powershell 哈希。让我们称之为“name.ps1”,它包含: $names = @{ "bob" = "b
我想为我正在构建的自定义 Powershell Commandlet 使用 SqlServerCmdletSnapin。如果我将以下代码添加到 PSM1 的开头: if ( (Get-PSSnapin
如何调用从 PowerShell 脚本中获取命名参数的 PowerShell 脚本? foo.ps1: param( [Parameter(Mandatory=$true)][String]$a=''
我即将为 Windows 管理员编写一个 PowerShell 脚本,以帮助他们完成与部署 Web 应用程序相关的某些任务。 有什么理由让我应该赞成或排除开发 PowerShell 模块 (.psm1
我的 powershell 模块有一个函数,我希望它返回一个非零退出代码。但是,作为一个模块函数,当我运行 Import-Module 时,它会加载到 powershell 控制台的上下文中。所以,当
我在这个问题上花了最后 4 个小时,非常感谢您提供的任何意见。 我需要使用不同的凭据调用 powershell 脚本并将参数传递给该脚本。 安装 WISEScript 中包装的程序后,此脚本开始收集机
我有一个场景,我需要将 powershell 命令的命令和输出转发到另一个进程以进行日志记录和处理。 我希望这个控制台尽可能接近 powershell,因此不希望将它简单地托管在另一个控制台程序中。
我正在尝试让一个主 PowerShell 脚本运行所有其他脚本,同时等待 30-60 秒以确保完成任务。我尝试过的所有其他操作都不会停止/等待第一个脚本及其进程完成,然后才能同时完成所有其他脚本,并且
我正在编写一个脚本来使用多个 plink (PuTTY) session 作为 Windows 版本的 clustersh。然而,我陷入困境,因为我想从 powershell 打开多个 Powersh
我读了这个答案:How to Open Powershell from Powershell start powershell 这将打开基础的大分辨率 PS 实例。如何打开 PS(x86)? 最佳答案
我很想知道我们是否可以在 Powershell 中做到这一点。 使用 Out-File 命令,我们可以通过管道将其输出写入文件。这样我就可以将我所有的历史命令发送到一个文本文件中。 问题是我可以在每次
我在 about_Pipelines 阅读了有关 PowerShell 中的管道工作原理的信息,并了解到管道一次传送一个对象。 所以,这个 Get-Service | Format-Table -Pr
我正在尝试像这样从 powershell 启动一个进程:- $proc = (start-process $myExe -argumentList '/myArg True' -windowStyle
## To run the script # .\get_status.ps1 -Hostname -Service_Action -Service_Name #$Hostname = "hos
让我们使用 powershell 命令 Write-Host "red text"-Fore red这会在红色前景中显示“红色文本”。 但是,您希望文本以稍微亮一点的方式显示字体颜色,浅红色。 有没有
我是一名优秀的程序员,十分优秀!