使用PowerShell 遍历证书信息,查找对应证书

今天再来更新一篇博客,同样也是关于PowerShell的应用,熟练使用PowerShell对于平时的工作很多时候能够起到意想不到的效果,很多事情换个思路往往会发现能够少走很多弯路,今天介绍的其实主要是PowerShell在证书方面的一些简单应用,对应的也是平时工作中用到的一个场景,在我们的生产环境中有很多很多张证书,有一些自签名的,也有很多从第三方公司申请的公网证书,这些证书平时我们都备份在一个公共的文件夹中,以备不时之需,久而久之,文件夹里存放的证书就已经不下百张了,而且各种文件夹穿插着放一下让整个文件夹的结构变得更加复杂。平时想把证书找出来要花不少时间,还要查看证书的属性一一验证。因此前段时间写了这个PowerShell的脚本来方便查询,这个脚本可以根据输入的文件夹路径以及证书的指纹信息,便利文件夹下所有证书的属性,来查询特定指纹的证书的详细信息以及路径,脚本内容如下

#Get-Pfxdata is only supported by PowerShell 4.0 or Higher
[cmdletbinding()]
param(
	[parameter(Mandatory = $true, Position = 0)]
	[string]$Thumbprint,
	[parameter(Mandatory = $true, Position = 1)]
	[string]$FolderPath,
	[parameter(Mandatory = $false, Position = 2)]
	$Password
)

if ($PSVersionTable.PSVersion.Major -lt 4)
{

	Write-Warning "You need run the script on PowerShell 4.0 or Higher"
	exit
}

[string[]]$CertPath = $null
[string[]]$ShortCertPath = $null
[pscustomobject[]]$OutputCerts = $null

#====================================================================
$ShortCertPath = Get-ChildItem -Path $FolderPath -Recurse -Force -Include *.cer, *.pfx -Name
#其实用FUllName就可以直接实现了
foreach ($scp in $ShortCertPath) {
	$CertPath+=Join-Path $FolderPath $scp
}

#====================================================================
#密码是个可选参数,这里设置了默认密码的值,如果有统一密码可以在脚本里***那个位置将密码填上
if ($Password)
{
	$Password = ConvertTo-SecureString -AsPlainText $Password -Force
}
else
{
	$Password = ConvertTo-SecureString -AsPlainText "***" -Force
}
#====================================================================

foreach ($cp in $CertPath) {
	if ($cp.EndsWith(".pfx"))
	{
		try
		{
			$Error.clear()
			$PfxCert = Get-PfxData -FilePath $cp -Password $Password
		}
		catch
		{
			#$ErrorMessage = $cp+$Error[0].Exception.Message
			#Write-Host -ForegroundColor ‘Red‘ "$(Get-Date -uFormat %Y%m%d-%H:%M:%S)" $ErrorMessage
			$pwdtxt = Join-Path (Get-ChildItem $cp).Directory.FullName "pwd.txt"
			if (Test-Path $pwdtxt)
			{
				$OtherPasswordtxt = Get-Content $pwdtxt
                if($OtherPasswordtxt.Length -lt 5)
                {
                    $OtherPassword = ConvertTo-SecureString -AsPlainText $OtherPasswordtxt[0] -Force
                }
                else
                {
                $OtherPassword = ConvertTo-SecureString -AsPlainText $OtherPasswordtxt -Force
                }
				try
				{
	                $Error.clear()
					$PfxCert = Get-PfxData -FilePath $cp -Password $OtherPassword
				}
				catch
				{
					$ErrorMessage = $cp+$Error[0].Exception.Message
					Write-Warning "$(Get-Date -uFormat %Y%m%d-%H:%M:%S)" $ErrorMessage

				}
			}
			else
			{
				Write-Warning "Didn‘t find the password for $cp, so pls check the thumbprint manually"
				#Write-Warning "The password for $cp is not correct, so pls check the thumbprint manually"
			}

		}

		$PfxThumbprint = $PfxCert.EndEntityCertificates.Thumbprint
		if ($PfxThumbprint -eq $Thumbprint)
		{
			$PfxObject = $null
			$PfxObject = New-Object -TypeName psobject
			$PfxObject | Add-Member -MemberType NoteProperty -Name EnhancedKeyUsageList -Value $PfxCert.EndEntityCertificates.EnhancedKeyUsageList
			$PfxObject | Add-Member -MemberType NoteProperty -Name DnsNameList -Value $PfxCert.EndEntityCertificates.DnsNameList
			$PfxObject | Add-Member -MemberType NoteProperty -Name SendAsTrustedIssuer -Value $PfxCert.EndEntityCertificates.SendAsTrustedIssuer
			$PfxObject | Add-Member -MemberType NoteProperty -Name EnrollmentPolicyEndPoint -Value $PfxCert.EndEntityCertificates.EnrollmentPolicyEndPoint
			$PfxObject | Add-Member -MemberType NoteProperty -Name EnrollmentServerEndPoint -Value $PfxCert.EndEntityCertificates.EnrollmentServerEndPoint
			$PfxObject | Add-Member -MemberType NoteProperty -Name PolicyId -Value $PfxCert.EndEntityCertificates.PolicyId
			$PfxObject | Add-Member -MemberType NoteProperty -Name Archived -Value $PfxCert.EndEntityCertificates.Archived
			$PfxObject | Add-Member -MemberType NoteProperty -Name Extensions -Value $PfxCert.EndEntityCertificates.Extensions
			$PfxObject | Add-Member -MemberType NoteProperty -Name FriendlyName -Value $PfxCert.EndEntityCertificates.FriendlyName
			$PfxObject | Add-Member -MemberType NoteProperty -Name IssuerName -Value $PfxCert.EndEntityCertificates.IssuerName
			$PfxObject | Add-Member -MemberType NoteProperty -Name NotAfter -Value $PfxCert.EndEntityCertificates.NotAfter
			$PfxObject | Add-Member -MemberType NoteProperty -Name NotBefore -Value $PfxCert.EndEntityCertificates.NotBefore
			$PfxObject | Add-Member -MemberType NoteProperty -Name HasPrivateKey -Value $PfxCert.EndEntityCertificates.HasPrivateKey
			$PfxObject | Add-Member -MemberType NoteProperty -Name PrivateKey -Value $PfxCert.EndEntityCertificates.PrivateKey
			$PfxObject | Add-Member -MemberType NoteProperty -Name PublicKey -Value $PfxCert.EndEntityCertificates.PublicKey
			$PfxObject | Add-Member -MemberType NoteProperty -Name RawData -Value $PfxCert.EndEntityCertificates.RawData
			$PfxObject | Add-Member -MemberType NoteProperty -Name SerialNumber -Value $PfxCert.EndEntityCertificates.SerialNumber
			$PfxObject | Add-Member -MemberType NoteProperty -Name SubjectName -Value $PfxCert.EndEntityCertificates.SubjectName
			$PfxObject | Add-Member -MemberType NoteProperty -Name SignatureAlgorithm -Value $PfxCert.EndEntityCertificates.SignatureAlgorithm
			$PfxObject | Add-Member -MemberType NoteProperty -Name Thumbprint -Value $PfxCert.EndEntityCertificates.Thumbprint
			$PfxObject | Add-Member -MemberType NoteProperty -Name Version -Value $PfxCert.EndEntityCertificates.Version
			$PfxObject | Add-Member -MemberType NoteProperty -Name Handle -Value $PfxCert.EndEntityCertificates.Handle
			$PfxObject | Add-Member -MemberType NoteProperty -Name Issuer -Value $PfxCert.EndEntityCertificates.Issuer
			$PfxObject | Add-Member -MemberType NoteProperty -Name Subject -Value $PfxCert.EndEntityCertificates.Subject
			$PfxObject | Add-Member -MemberType NoteProperty -Name CertFilePath -Value $cp
			$OutputCerts += $PfxObject
		}

	}
	elseif ($cp.EndsWith(".cer"))
	{
		$CerCert = Get-PfxCertificate -FilePath $cp
		$CerThumbprint = $CerCert.Thumbprint
		if ($CerThumbprint -eq $Thumbprint)
		{
			$CerObject = $null
			$CerObject = New-Object -TypeName psobject
			$CerObject | Add-Member -MemberType NoteProperty -Name EnhancedKeyUsageList -Value $CerCert.EnhancedKeyUsageList
			$CerObject | Add-Member -MemberType NoteProperty -Name DnsNameList -Value $CerCert.DnsNameList
			$CerObject | Add-Member -MemberType NoteProperty -Name SendAsTrustedIssuer -Value $CerCert.SendAsTrustedIssuer
			$CerObject | Add-Member -MemberType NoteProperty -Name EnrollmentPolicyEndPoint -Value $CerCert.EnrollmentPolicyEndPoint
			$CerObject | Add-Member -MemberType NoteProperty -Name EnrollmentServerEndPoint -Value $CerCert.EnrollmentServerEndPoint
			$CerObject | Add-Member -MemberType NoteProperty -Name PolicyId -Value $CerCert.PolicyId
			$CerObject | Add-Member -MemberType NoteProperty -Name Archived -Value $CerCert.Archived
			$CerObject | Add-Member -MemberType NoteProperty -Name Extensions -Value $CerCert.Extensions
			$CerObject | Add-Member -MemberType NoteProperty -Name FriendlyName -Value $CerCert.FriendlyName
			$CerObject | Add-Member -MemberType NoteProperty -Name IssuerName -Value $CerCert.IssuerName
			$CerObject | Add-Member -MemberType NoteProperty -Name NotAfter -Value $CerCert.NotAfter
			$CerObject | Add-Member -MemberType NoteProperty -Name NotBefore -Value $CerCert.NotBefore
			$CerObject | Add-Member -MemberType NoteProperty -Name HasPrivateKey -Value $CerCert.HasPrivateKey
			$CerObject | Add-Member -MemberType NoteProperty -Name PrivateKey -Value $CerCert.PrivateKey
			$CerObject | Add-Member -MemberType NoteProperty -Name PublicKey -Value $CerCert.PublicKey
			$CerObject | Add-Member -MemberType NoteProperty -Name RawData -Value $CerCert.RawData
			$CerObject | Add-Member -MemberType NoteProperty -Name SerialNumber -Value $CerCert.SerialNumber
			$CerObject | Add-Member -MemberType NoteProperty -Name SubjectName -Value $CerCert.SubjectName
			$CerObject | Add-Member -MemberType NoteProperty -Name SignatureAlgorithm -Value $CerCert.SignatureAlgorithm
			$CerObject | Add-Member -MemberType NoteProperty -Name Thumbprint -Value $CerCert.Thumbprint
			$CerObject | Add-Member -MemberType NoteProperty -Name Version -Value $CerCert.Version
			$CerObject | Add-Member -MemberType NoteProperty -Name Handle -Value $CerCert.Handle
			$CerObject | Add-Member -MemberType NoteProperty -Name Issuer -Value $CerCert.Issuer
			$CerObject | Add-Member -MemberType NoteProperty -Name Subject -Value $CerCert.Subject
			$CerObject | Add-Member -MemberType NoteProperty -Name CertFilePath -Value $cp
			$OutputCerts += $CerObject
		}
	}
	else
	{
		Write-Host  "$cp is not a valid cert" -ForegroundColor ‘Red‘
	}
}
#====================================================================
if ($OutputCerts -ne $null)
{
	if ($OutputCerts.count -eq 1)
	{
		Write-Host "There is one cert with thumbprint $Thumbprint under Folder $FolderPath" -ForegroundColor ‘Cyan‘

	}
	else
	{
		$cc=$OutputCerts.count
		Write-Host "There are $cc certs with thumbprint $Thumbprint under Folder $FolderPath" -ForegroundColor ‘Cyan‘

	}

	for ($i = 0; $i -lt $OutputCerts.count;$i++)
	{
		Write-Host "NO:$($i+1)"
		$OutputCerts[$i]
		Write-Host "================================================================================================="
	}

}
else
{

	Write-Host "There is no cert with thumbprint $Thumbprint under Folder $FolderPath" -ForegroundColor ‘Cyan‘

}

总体来说脚本很简单,实现的功能也不复杂,主要是来看一下PowerShell在证书这方面的一些基本应用,有需要的话可以将各种语句自由组合在一起,实现想要的功能

时间: 2024-11-05 09:14:55

使用PowerShell 遍历证书信息,查找对应证书的相关文章

PHP查看SSL证书信息

<? $str = file_get_contents('2.cer'); print_r(openssl_x509_parse($str)); ?> 证书需要使用base64编码的方式cer证书. PHP查看SSL证书信息,布布扣,bubuko.com

转: 如何从keystore file中查看数字证书信息

转: http://www.shuziqianming.com/201302/certificate-information-in-a-keystore-file/ 如何从keystore file中查看数字证书信息 2013-02-10    分类:VeriSign代码签名证书帮助0人评论 要查看证书keystore中的信息,请运行以下命令: keytool -list -v -keystore [enter keystore name] -storepass [enter keystore

获取windows下执行文件签名和证书信息

获取证书信息验证文件数字签名是否有效可以使用函数 WinVerifyTrust,可以用:取得文件数字签名证书信息需要使用函数 CryptQueryObject,再用CertFindCertificateInStore获取证书Cert也可以通过,WTHelperProvDataFromStateData WTHelperGetProvSignerFromChain WTHelperGetProvCertFromChain获取证书Cert这里算法是: typedef struct _CERT_INF

SSL证书之神秘预证书

SSL预证书是用于证书透明度(CT)另一种特殊类型的SSL证书.SSL预证书与日常的SSL证书有所不同,SSL预证书并不是用于通过验证服务器身份后生成HTTPS链接,而是允许将证书透明度数据直接嵌入到最终SSL证书中. SSL预认证证书与传统SSL证书不同,SSL预证书很少直接显示给最终用户,所以用户并不能正确判断自己的证书是否存在SSL预证书. 下面一起来认识预认证在证书透明度RFC中定义,什么是预认证证书,它的工作原理是什么. 为什么要使用预认证? L预证书是提交证书透明度日志(SCT)证明

Windows AD证书服务系列---管理证书还原(1)

秘钥归档和还原的概述 在有些时候保障证书和对应的配对秘钥的安全是很重要的,例如,如果我们使用一个证书去对Email或文档的内容进行加密,但是我们把公钥和私钥遗失了,那么我们就无法访问被证书的公钥加密的数据了,因此对公钥和私钥进行归档和还原就显得非常重要了.我们可以将证书结合一个私钥导出,然后将它保存在一个安全的位置,例如独立媒体或者特定的云存储,以这样的方式来归档或备份私钥.但是这种方法要求每个用户都要备份自己的私钥,这样就算不上一个可靠的备份方式了,那么我们可以选择在CA上集中秘钥归档来作为替

iOS注册远程推送消息证书后提示此证书签发者无效的解决办法

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们在编写关于远程推送消息的App时需要注册一个相关的证书,我们可以到Apple开发网站的Certificates, Identifiers & Profiles页面首先创建一个App ID. 其中进入Push Notifications选项,并且在其子项Development SSL Certificate中选择创建证书(因为该证书是调试用的,所以在Deve

iOS-钥匙串中证书全部失效(证书的签发者无效)的解决办法

今天用Xcode打包IPA文件给同事,结果提示import时,提示证书missing,找了半天没发现问题,后来打开钥匙串,发现证书全失效了!!!吓死宝宝了~~~~(>_<)~~~~ 然后,处理它. 1.打开钥匙串 2.进行如下图操作,打开证书信息双击或右键均可 3.再次去打包,成功 注意:分享转载请注明原博链接,多谢.

HTTP和HTTPS有什么区别? 什么是SSL证书?使用ssl证书优势?

什么是SSL? SSL是指安全套接层协议(以及传输层协议TLS),位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持,是目前使用最广泛的安全协议.它为互联网或内部网络连接,进行操作的两台机器之间提供安全信息通道,即HTTPS. 1.1 数据传输期间,对信息进行加密 1.2通过唯一的SSL凭据识别证书所有者身份. 1.3先验证证书所有者身份,再颁发SSL证书 HTTP和HTTPS有什么区别? HTTP(Hypertext Transfer Protocol)超文本传输协议是用来在In

CA服务器迁移之后,使用IE浏览器申请证书提示无法找到证书模板

问题描述: CA服务器迁移之后,使用IE浏览器申请证书提示无法找到证书模板,截图如下: 问题原因分析: ---------------------------------------------------------------- 使用certutil命令查看当前证书信息,发现有两个证书条目信息截图如下 运行certutil ca 命令发现DNSname指向的还是旧的服务器,于是判定在ADSI 配置信息中肯定有某个键值没有更改. 打开ADSI编辑器配置 展开enrollment service

什么是代码签名证书?代码签名证书的功能和优点

什么是代码签名证书? 代码签名证书是一种数字签名技术,允许软件开发者对其可执行脚本.代码和内容进行签名,以通过Internet验证开发者的身份.通过提供32位和64位的数字签名,代码签名证书能够向软件开发者和消费者保证软件代码和内容的安全性. 代码签名证书(Code Signing Certificate)能够对企业的应用和文档进行签名,从而防止第三方在未经许可的情况下对其进行修改.基本上,所有软件公司在分发软件时都必须购买和使用代码签名证书.缺少代码签名证书的软件在安装时,Windows等各种