Certificates are complex. They can be tough to view and difficult to understand. This is even more true when the topic is related to determining certificate signature details. In the past, there were really no reasons to look so closely at an issued certificates signature details. That has all changed now in conjunction with an ever changing security landscape.
Microsoft has plans to deprecate the use of some certificates which have SHA1 signatures. The plans are nuanced by date and the deprecation strategy does not apply to just any certificate. The current plans apply to server authentication certificates (certificates which are used to secure network communication using TLS) as well as to the certificates used to sign executables in Windows (code signing and time stamping certificates).
The authoritative place to find out about the Microsoft strategy for SHA1 deprecation is http://aka.ms/sha1 .
Due to the complexity of certificates and PKI in general it can be confusing and difficult to determine whether the SHA1 deprecation applies to a particular certificate or code signed application. I wrote this PowerShell script in order to make it easier to tell if a certificate was signed with SHA1.
There are two scenarios this script checks. One is a server auth (TLS) certificate which is signed with SHA1, and the other is an application (EXE) which is signed with SHA1.
More details
WARNING: A known issue has been seen on when checking some executables on Windows 10 where the script will not warn on problematic time stamping certificates. This is a concern with the Get-AuthenticodeSignature cmdlet. Get-AuthenticodeSignature is what the script uses to retreive signing certificate information. If you see this variance simply run the script on a different operating system version and the cmdlet should work as expected.
Examples of using the script:
PS C:\ > .\SHA1SigCertCheck.ps1 -File -Path $path
Checking certificate file at C:\test\TestCerts\512TestCert.cer for SHA1 signature and to see if it is a Server Authentication certificate.
SHA1 signed Server Auth certificate found.
Friendly Name :
Subject Name : DC=com
DC=contoso
CN=test
Subject : CN=test, DC=contoso, DC=com
Issuer : DC=com
DC=contoso
CN=contoso-WIN-49H89RJ0MQQ-CA
Serial Number : 6106C9AB000000000004
Thumbprint : E97A7C532D19D2BBEBA43EB409B720CA404559CD
Signature Algorithm : sha1RSA
PARAM ( [switch] $Cert, [switch] $EXE, [switch] $SYSTEM, [string]$Path)
#************************************************
# SHA1SigCertCheck.ps1
# Version 1.0
# Date: 11/9/2015
# Author: Tim Springston [MSFT]
# Description: This script will check a specified certificate file (.cer), the local System My store,
# or a specified executubale for a SHA1 signature on the certificate.
# SHA1 signed certificates are less secure and problematic. Microsoft has a planned SHA1 Windows
# deprecation strategy where they will no longer be usable by Windows after
# specified dates. More detail on this is available at http://aka.ms/sha1
#************************************************
cls
function CheckCertforSHA1 ($Path ) {
$Certificate = New-object System.Security.Cryptography.X509Certificates.X509Certificate2($Path)
Write-host "Checking certificate file at $Path for SHA1 signature and to see if it is a Server Authentication certificate."
#Check for certificate being server auth.
$ServerAuth = $false
$SHA1 = $false
if ($Certificate.Extensions -ne $null)
{
foreach ($Extension in $Certificate.Extensions)
{
if (($Extension.Oid.FriendlyName -like "Key Usage") -or ($Extension.Oid.FriendlyName -like "Enhanced Key Usage"))
{if ((($Extension).Format(1)) -match "1.3.6.1.5.5.7.3.1"){$ServerAuth = $True}}
}
}
#Check for SHA1 signature.
if ($ServerAuth -eq $true)
{
if (($Certificate.SignatureAlgorithm.Value -eq '1.3.14.3.2.29') -or ($Certificate.SignatureAlgorithm.Value -eq '1.2.840.10040.4.3') `
-or ($Certificate.SignatureAlgorithm.Value -eq '1.2.840.10045.4.1') -or ($Certificate.SignatureAlgorithm.Value -eq '1.2.840.113549.1.1.5') `
-or ($Certificate.SignatureAlgorithm.Value -eq '1.3.14.3.2.13') -or ($Certificate.SignatureAlgorithm.Value -eq '1.3.14.3.2.27'))
{
Write-Host "SHA1 signed Server Auth certificate found." -ForegroundColor Yellow
$SHA1 = $true
$CertObject = New-Object PSObject
if ($Certificate.FriendlyName -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Friendly Name" -value $Certificate.FriendlyName}
if ($Certificate.SubjectName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Subject Name" -value ($Certificate.SubjectName).Format(1)}
if ($Certificate.Subject -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Subject" -value $Certificate.Subject}
if ($Certificate.IssuerName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Issuer" -value ($Certificate.IssuerName).Format(1)}
if ($Certificate.SerialNumber -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Serial Number" -value $Certificate.SerialNumber}
if ($Certificate.Thumbprint-ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Thumbprint" -value $Certificate.Thumbprint}
add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Issued Time" -value $EXEResult.SignerCertificate.NotBefore
add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Expiry Time" -value $EXEResult.SignerCertificate.NotAfter
add-member -inputobject $CertObject -membertype noteproperty -name "Signature Algorithm" -value $Certificate.SignatureAlgorithm.FriendlyName
$CertObject | FL *
}
#Check the certificate chain for problematic certificates.
$ChainObject = New-Object System.Security.Cryptography.X509Certificates.X509Chain($True)
$ChainObject.ChainPolicy.RevocationFlag = "EntireChain"
$ChainObject.ChainPolicy.VerificationFlags = "AllFlags"
$ChainObject.ChainPolicy.RevocationMode = "Online"
$ChainResult = $ChainObject.Build($Certificate)
ForEach ($ParentCert in $ChainObject.ChainElements.Certificate)
{
if ((($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.29') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10040.4.3') `
-or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10045.4.1') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.113549.1.1.5') `
-or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.13') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.27')) -and `
(!($ParentCert.Issuer -eq $ParentCert.Subject)))
{
Write-Host "A leaf or intermediate CA certificate in the specified certificate's path is signed with SHA1." -ForegroundColor Red -BackgroundColor Black
$ParentCertObject = New-Object PSObject
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Type" -value "Leaf or Intermediate CA"
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Chain" -value "Code Signing Certificate"
if ($ParentCert.FriendlyName -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Friendly Name" -value $ParentCert.FriendlyName}
if ($ParentCert.SubjectName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject Name" -value ($ParentCert.SubjectName).Format(1)}
if ($ParentCert.Subject -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject" -value $ParentCert.Subject}
if ($ParentCert.IssuerName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Issuer" -value ($ParentCert.IssuerName).Format(1)}
if ($ParentCert.SerialNumber -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Serial Number" -value $ParentCert.SerialNumber}
if ($ParentCert.Thumbprint -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Thumbprint" -value $ParentCert.Thumbprint}
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Issued Time" -value $ParentCert.NotBefore
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Expiry Time" -value $ParentCert.NotAfter
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Signature Algorithm" -value $ParentCert.SignatureAlgorithm.FriendlyName
$ParentCertObject | FL *
$SHA1 = $true
}
}
if ($SHA1 -eq $false)
{Write-Host "SHA1 signed Server Auth certificate NOT found." -ForegroundColor Green}
}
else
{Write-Host "This certificate is not a Server Auth certificate and SHA1 deprecation doesn't apply." -ForegroundColor Green}
}
function CheckEXESigforSHA1 ($Path ) {
$EXEResult = Get-AuthenticodeSignature -FilePath $Path
Write-Host "Checking the code signing and time stamping certificate for the executable $Path" -ForegroundColor Green
$SHA1 = $false
$Date = Get-Date "1/1/2016"
#Check for SHA1 signature in signing certificate.
if (($EXEResult.SignerCertificate.SignatureAlgorithm.value -eq '1.3.14.3.2.29') -or ($EXEResult.SignerCertificate.SignatureAlgorithm.value -eq '1.2.840.10040.4.3') `
-or ($EXEResult.SignerCertificate.SignatureAlgorithm.value -eq '1.2.840.10045.4.1') -or ($EXEResult.SignerCertificate.SignatureAlgorithm.value -eq '1.2.840.113549.1.1.5') `
-or ($EXEResult.SignerCertificate.SignatureAlgorithm.value -eq '1.3.14.3.2.13') -or ($EXEResult.SignerCertificate.SignatureAlgorithm.value -eq '1.3.14.3.2.27'))
{
Write-Host "SHA1 code signing certificate found." -ForegroundColor Red -BackgroundColor Black
if ($EXEResult.SignerCertificate.NotBefore -gt $Date)
{
Write-Host "This executable will was signed with a certificate signed with SHA1 after 1/1/2016 and is therefore deprecated now." -ForegroundColor red
$SHA1 = $true
}
if ($EXEResult.SignerCertificate.NotBefore -lt $Date)
{
Write-Host "This executable will not be deprecated from use in Windows until January 1, 2020." -ForegroundColor Yellow
$SHA1 = $true
}
$CertObject = New-Object PSObject
add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Type" -value "Code Signing Certificate"
if ($EXEResult.SignerCertificate.FriendlyName -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Friendly Name" -value $EXEResult.SignerCertificate.FriendlyName}
if ($EXEResult.SignerCertificate.SubjectName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Subject Name" -value ($EXEResult.SignerCertificate.SubjectName).Format(1)}
if ($EXEResult.SignerCertificate.Subject -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Subject" -value $EXEResult.SignerCertificate.Subject}
if ($EXEResult.SignerCertificate.IssuerName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Issuer" -value ($EXEResult.SignerCertificate.IssuerName).Format(1)}
if ($EXEResult.SignerCertificate.SerialNumber -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Serial Number" -value $EXEResult.SignerCertificate.SerialNumber}
if ($EXEResult.SignerCertificate.Thumbprint -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Thumbprint" -value $EXEResult.SignerCertificate.Thumbprint}
add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Issued Time" -value $EXEResult.SignerCertificate.NotBefore
add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Expiry Time" -value $EXEResult.SignerCertificate.NotAfter
add-member -inputobject $CertObject -membertype noteproperty -name "Signature Algorithm" -value $EXEResult.SignerCertificate.SignatureAlgorithm.FriendlyName
$CertObject | FL *
$SHA1 = $true
}
#Check the code signing certificate chain for problematic certificates.
$ChainObject = New-Object System.Security.Cryptography.X509Certificates.X509Chain($True)
$ChainObject.ChainPolicy.RevocationFlag = "EntireChain"
$ChainObject.ChainPolicy.VerificationFlags = "AllFlags"
$ChainObject.ChainPolicy.RevocationMode = "Online"
$ChainResult = $ChainObject.Build($EXEResult.SignerCertificate)
ForEach ($ParentCert in $ChainObject.ChainElements.Certificate)
{
if ((($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.29') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10040.4.3') `
-or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10045.4.1') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.113549.1.1.5') `
-or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.13') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.27')) -and `
(!($ParentCert.Issuer -eq $ParentCert.Subject)))
{
Write-Host "A leaf or intermediate CA certificate in the code signing certificate's path is signed with SHA1." -ForegroundColor Red -BackgroundColor Black
$ParentCertObject = New-Object PSObject
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Type" -value "Leaf or Intermediate CA"
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Chain" -value "Code Signing Certificate"
if ($ParentCert.FriendlyName -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Friendly Name" -value $ParentCert.FriendlyName}
if ($ParentCert.SubjectName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject Name" -value ($ParentCert.SubjectName).Format(1)}
if ($ParentCert.Subject -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject" -value $ParentCert.Subject}
if ($ParentCert.IssuerName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Issuer" -value ($ParentCert.IssuerName).Format(1)}
if ($ParentCert.SerialNumber -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Serial Number" -value $ParentCert.SerialNumber}
if ($ParentCert.Thumbprint -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Thumbprint" -value $ParentCert.Thumbprint}
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Issued Time" -value $ParentCert.NotBefore
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Expiry Time" -value $ParentCert.NotAfter
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Signature Algorithm" -value $ParentCert.SignatureAlgorithm.FriendlyName
$ParentCertObject | FL *
$SHA1 = $true
}
}
If ($EXEResult.TimeStamperCertificate -ne $null)
{
#Check for SHA1 signature in time stamping certificate.
if (($EXEResult.TimeStamperCertificate.SignatureAlgorithm.value -eq '1.3.14.3.2.29') -or ($EXEResult.TimeStamperCertificate.SignatureAlgorithm.value -eq '1.2.840.10040.4.3') `
-or ($EXEResult.TimeStamperCertificate.SignatureAlgorithm.value -eq '1.2.840.10045.4.1') -or ($EXEResult.TimeStamperCertificate.SignatureAlgorithm.value -eq '1.2.840.113549.1.1.5') `
-or ($EXEResult.TimeStamperCertificate.SignatureAlgorithm.value -eq '1.3.14.3.2.13') -or ($EXEResult.TimeStamperCertificate.SignatureAlgorithm.value -eq '1.3.14.3.2.27'))
{
Write-Host "SHA1 time stamping certificate found." -ForegroundColor Yellow
if ($EXEResult.TimeStamperCertificate.NotBefore -gt $Date)
{
Write-Host "This executable will was signed with a certificate signed with SHA1 after 1/1/2016 and is therefore deprecated now." -ForegroundColor red
$SHA1 = $true
}
if ($EXEResult.TimeStamperCertificate.NotBefore -lt $Date)
{
Write-Host "This executable will not be deprecated from use in Windows until January 1, 2020." -ForegroundColor Yellow
$SHA1 = $true
}
$CertObject = New-Object PSObject
add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Type" -value "Time Stamping Certificate"
if ($EXEResult.TimeStamperCertificate.FriendlyName -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Friendly Name" -value $EXEResult.TimeStamperCertificate.FriendlyName}
if ($EXEResult.TimeStamperCertificate.SubjectName -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Subject Name" -value ($EXEResult.TimeStamperCertificate.SubjectName).Format(1)}
if ($EXEResult.TimeStamperCertificate.Subject -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Subject" -value $EXEResult.TimeStamperCertificate.Subject}
if ($EXEResult.TimeStamperCertificate.IssuerName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Issuer" -value ($EXEResult.TimeStamperCertificate.IssuerName).Format(1)}
if ($EXEResult.TimeStamperCertificate.SerialNumber -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Serial Number" -value $EXEResult.TimeStamperCertificate.SerialNumber}
if ($EXEResult.TimeStamperCertificate.Thumbprint -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Thumbprint" -value $EXEResult.TimeStamperCertificate.Thumbprint}
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Issued Time" -value $EXEResult.TimeStamperCertificate.NotBefore
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Expiry Time" -value $EXEResult.TimeStamperCertificate.NotAfter
add-member -inputobject $CertObject -membertype noteproperty -name "Signature Algorithm" -value $EXEResult.TimeStamperCertificate.SignatureAlgorithm.FriendlyName
$CertObject | FL *
$SHA1 = $true
}
#Check the time stamping certificate chain for problematic certificates.
$ChainObject = New-Object System.Security.Cryptography.X509Certificates.X509Chain($True)
$ChainObject.ChainPolicy.RevocationFlag = "EntireChain"
$ChainObject.ChainPolicy.VerificationFlags = "AllFlags"
$ChainObject.ChainPolicy.RevocationMode = "Online"
$ChainResult = $ChainObject.Build($EXEResult.TimeStamperCertificate)
ForEach ($ParentCert in $ChainObject.ChainElements.Certificate)
{
if ((($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.29') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10040.4.3') `
-or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10045.4.1') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.113549.1.1.5') `
-or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.13') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.27')) -and `
(!($ParentCert.Issuer -eq $ParentCert.Subject)))
{
Write-Host "A leaf or intermediate CA certificate in the time stamping certificate's path is signed with SHA1." -ForegroundColor Red -BackgroundColor Black
$ParentCertObject = New-Object PSObject
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Chained Certificate Serial Number" -value $Certificate.SerialNumber
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Chained Certificate Thumbprint" -value $Certificate.Thumbprint
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Type" -value "Leaf or Intermediate CA"
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Chain" -value "Time Stamping Certificate"
if ($ParentCert.FriendlyName -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Friendly Name" -value $ParentCert.FriendlyName}
if ($ParentCert.SubjectName -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject Name" -value ($ParentCert.SubjectName).Format(1)}
if ($ParentCert.Subject -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject" -value $ParentCert.Subject}
if ($ParentCert.IssuerName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Issuer" -value ($ParentCert.IssuerName).Format(1)}
if ($ParentCert.SerialNumber -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Serial Number" -value $ParentCert.SerialNumber}
if ($ParentCert.Thumbprint -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Thumbprint" -value $ParentCert.Thumbprint}
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Issued Time" -value $ParentCert.NotBefore
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Expiry Time" -value $ParentCert.NotAfter
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Signature Algorithm" -value $ParentCert.SignatureAlgorithm.FriendlyName
$ParentCertObject | FL *
$SHA1 = $true
}
}
}
if ($SHA1 -eq $false)
{Write-Host "Neither code signing nor time stamping certificate was signed with SHA1." -ForegroundColor Green -BackgroundColor Black}
}
function SHA1SIgCheckAllSystemCerts {
$CS = get-wmiobject -class win32_computersystem
$Hostname = $CS.Name + '.' + $CS.Domain
$Results = $pwd.Path + "\" + $Hostname + "_SHA1ServerAuthSystemCerts.txt"
Get-Date | Out-File $Results -Encoding UTF8
"Computer certificate My store checks for Server Auth certificates which are signed with SHA1 or that have leaf or intermediate CA certfiicates in their path which are SHA1 signed." | Out-File $Results -Encoding UTF8 -Append
Write-Host "Checking the local computer's My certificate store for Server Authentication certificates which are signed with SHA1 signatures or which have leaf or intermediate CA certificates which are signed with SHA1." -ForegroundColor Green
$MyStore = New-Object System.Security.Cryptography.X509Certificates.X509Store("My","LocalMachine")
$SHA1 = $false
$MyStore.Open("ReadOnly")
$CertsInStore = $MyStore.Certificates
foreach ($Certificate in $CertsInStore)
{
if ($Certificate.Extensions -ne $null)
{
foreach ($Extension in $Certificate.Extensions)
{
if (($Extension.Oid.FriendlyName -like "Key Usage") -or ($Extension.Oid.FriendlyName -like "Enhanced Key Usage"))
{if ($Extension.OID.Value -eq "1.3.6.1.5.5.7.3.1"){$ServerAuth = $True}}
#{if ($Extension.OID.Value -ne "1.3.6.1.5.5.7.3.1"){$ServerAuth = $True}} #Testing value
}
if ($ServerAuth -eq $true)
{
if (($Certificate.SignatureAlgorithm.Value -eq '1.3.14.3.2.29') -or ($Certificate.SignatureAlgorithm.Value -eq '1.2.840.10040.4.3') `
-or ($Certificate.SignatureAlgorithm.Value -eq '1.2.840.10045.4.1') -or ($Certificate.SignatureAlgorithm.Value -eq '1.2.840.113549.1.1.5') `
-or ($Certificate.SignatureAlgorithm.Value -eq '1.3.14.3.2.13') -or ($Certificate.SignatureAlgorithm.Value -eq '1.3.14.3.2.27'))
{
$CertObject = New-Object PSObject
if ($Certificate.FriendlyName -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Friendly Name" -value $Certificate.FriendlyName}
if ($Certificate.SubjectName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Subject Name" -value ($Certificate.SubjectName).Format(1)}
if ($Certificate.Subject -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Subject" -value $Certificate.Subject}
if ($Certificate.IssuerName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Issuer" -value ($Certificate.IssuerName).Format(1)}
if ($Certificate.SerialNumber -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Serial Number" -value $Certificate.SerialNumber}
if ($Certificate.Thumbprint -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Thumbprint" -value $Certificate.Thumbprint}
add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Issued Time" -value $Certificate.NotBefore
add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Expiry Time" -value $Certificate.NotAfter
add-member -inputobject $CertObject -membertype noteproperty -name "Signature Algorithm" -value $Certificate.SignatureAlgorithm.FriendlyName
$CertObject | FL *
$CertObject | Out-File $Results -Encoding UTF8 -Append
$SHA1 = $true
$ChainObject = New-Object System.Security.Cryptography.X509Certificates.X509Chain($True)
$ChainObject.ChainPolicy.RevocationFlag = "EntireChain"
$ChainObject.ChainPolicy.VerificationFlags = "AllFlags"
$ChainObject.ChainPolicy.RevocationMode = "Online"
$ChainResult = $ChainObject.Build($Certificate)
#Check the certfificates parents in chain for SHA1 signature.
ForEach ($ParentCert in $ChainObject.ChainElements.Certificate)
{
if ((($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.29') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10040.4.3') `
-or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10045.4.1') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.113549.1.1.5') `
-or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.13') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.27')) -and `
(!($ParentCert.Issuer -eq $ParentCert.Subject)))
{
Write-Host "SHA1 signed leaf or intermediate certificate found." -ForegroundColor Yellow
$ParentCertObject = New-Object PSObject
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Chained Certificate Serial Number" -value $Certificate.SerialNumber
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Chained Certificate Thumbprint" -value $Certificate.Thumbprint
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Type" -value "Leaf or Intermediate CA"
if ($ParentCert.FriendlyName -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Friendly Name" -value $ParentCert.FriendlyName}
if ($ParentCert.SubjectName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject Name" -value ($ParentCert.SubjectName).Format(1)}
if ($ParentCert.Subject -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject" -value $ParentCert.Subject}
if ($ParentCert.IssuerName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Issuer" -value ($ParentCert.IssuerName).Format(1)}
if ($ParentCert.SerialNumber -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Serial Number" -value $ParentCert.SerialNumber}
if ($ParentCert.Thumbprint -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Thumbprint" -value $ParentCert.Thumbprint}
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Issued Time" -value $ParentCert.NotBefore
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Expiry Time" -value $ParentCert.NotAfter
add-member -inputobject $ParentCertObject -membertype noteproperty -name "Signature Algorithm" -value $ParentCert.SignatureAlgorithm.FriendlyName
$ParentCertObject | FL *
$ParentCertObject | Out-File $Results -Encoding UTF8 -Append
$SHA1 = $true
}
}
}
}
}
}
if ($SHA1 -eq $false)
{
Write-Host " "
Write-Host "No SHA1 signed Server Auth certs, or leaf or intermediate certs for them, were found." -ForegroundColor Green -BackgroundColor Black
"No SHA1 signed Server Auth certs, or leaf or intermediate certs for them, were found." | Out-File $Results -Encoding UTF8 -Append
}
}
#Script switch
if (($Cert -and $EXE) -or ($Cert -and $System) -or ($EXE -and $System) -or ($EXE -and $Cert) -or ($EXE -and $System -and $Cert))
{Write-host "Only one of the switches for FILE, SYSTEM or EXE may be done at a time. Please retry." -ForegroundColor red }
if (!($Cert -or $System -or $EXE))
{Write-host "One of the switches for Certificate (CERT), EXE (executable) or SYSTEM (check all certificates in the computer store) must be set to true. Please retry." -ForegroundColor red }
if ($Cert) {
if ($Path -eq $null) {Write-Host "A file path for the certificate to be checked must be provided in the -Path switch." -ForegroundColor Red}
else {CheckCertforSHA1 $Path }
}
if($EXE) {
if ($Path -eq $null) {Write-Host "A file path for the executable to be checked must be provided in the -Path switch." -ForegroundColor Red}
else {CheckEXESigforSHA1 $Path}
}
if($SYSTEM) {SHA1SIgCheckAllSystemCerts}
PARAM ( [switch] $Cert, [switch] $EXE, [switch] $SYSTEM, [string]$Path) #************************************************ # SHA1SigCertCheck.ps1 # Version 1.0 # Date: 11/9/2015 # Author: Tim Springston [MSFT] # Description: This script will check a specified certificate file (.cer), the local System My store, # or a specified executubale for a SHA1 signature on the certificate. # SHA1 signed certificates are less secure and problematic. Microsoft has a planned SHA1 Windows # deprecation strategy where they will no longer be usable by Windows after # specified dates. More detail on this is available at http://aka.ms/sha1 #************************************************ cls function CheckCertforSHA1 ($Path ) { $Certificate = New-object System.Security.Cryptography.X509Certificates.X509Certificate2($Path) Write-host "Checking certificate file at $Path for SHA1 signature and to see if it is a Server Authentication certificate." #Check for certificate being server auth. $ServerAuth = $false $SHA1 = $false if ($Certificate.Extensions -ne $null) { foreach ($Extension in $Certificate.Extensions) { if (($Extension.Oid.FriendlyName -like "Key Usage") -or ($Extension.Oid.FriendlyName -like "Enhanced Key Usage")) {if ((($Extension).Format(1)) -match "1.3.6.1.5.5.7.3.1"){$ServerAuth = $True}} } } #Check for SHA1 signature. if ($ServerAuth -eq $true) { if (($Certificate.SignatureAlgorithm.Value -eq '1.3.14.3.2.29') -or ($Certificate.SignatureAlgorithm.Value -eq '1.2.840.10040.4.3') ` -or ($Certificate.SignatureAlgorithm.Value -eq '1.2.840.10045.4.1') -or ($Certificate.SignatureAlgorithm.Value -eq '1.2.840.113549.1.1.5') ` -or ($Certificate.SignatureAlgorithm.Value -eq '1.3.14.3.2.13') -or ($Certificate.SignatureAlgorithm.Value -eq '1.3.14.3.2.27')) { Write-Host "SHA1 signed Server Auth certificate found." -ForegroundColor Yellow $SHA1 = $true $CertObject = New-Object PSObject if ($Certificate.FriendlyName -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Friendly Name" -value $Certificate.FriendlyName} if ($Certificate.SubjectName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Subject Name" -value ($Certificate.SubjectName).Format(1)} if ($Certificate.Subject -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Subject" -value $Certificate.Subject} if ($Certificate.IssuerName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Issuer" -value ($Certificate.IssuerName).Format(1)} if ($Certificate.SerialNumber -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Serial Number" -value $Certificate.SerialNumber} if ($Certificate.Thumbprint-ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Thumbprint" -value $Certificate.Thumbprint} add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Issued Time" -value $EXEResult.SignerCertificate.NotBefore add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Expiry Time" -value $EXEResult.SignerCertificate.NotAfter add-member -inputobject $CertObject -membertype noteproperty -name "Signature Algorithm" -value $Certificate.SignatureAlgorithm.FriendlyName $CertObject | FL * } #Check the certificate chain for problematic certificates. $ChainObject = New-Object System.Security.Cryptography.X509Certificates.X509Chain($True) $ChainObject.ChainPolicy.RevocationFlag = "EntireChain" $ChainObject.ChainPolicy.VerificationFlags = "AllFlags" $ChainObject.ChainPolicy.RevocationMode = "Online" $ChainResult = $ChainObject.Build($Certificate) ForEach ($ParentCert in $ChainObject.ChainElements.Certificate) { if ((($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.29') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10040.4.3') ` -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10045.4.1') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.113549.1.1.5') ` -or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.13') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.27')) -and ` (!($ParentCert.Issuer -eq $ParentCert.Subject))) { Write-Host "A leaf or intermediate CA certificate in the specified certificate's path is signed with SHA1." -ForegroundColor Red -BackgroundColor Black $ParentCertObject = New-Object PSObject add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Type" -value "Leaf or Intermediate CA" add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Chain" -value "Code Signing Certificate" if ($ParentCert.FriendlyName -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Friendly Name" -value $ParentCert.FriendlyName} if ($ParentCert.SubjectName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject Name" -value ($ParentCert.SubjectName).Format(1)} if ($ParentCert.Subject -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject" -value $ParentCert.Subject} if ($ParentCert.IssuerName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Issuer" -value ($ParentCert.IssuerName).Format(1)} if ($ParentCert.SerialNumber -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Serial Number" -value $ParentCert.SerialNumber} if ($ParentCert.Thumbprint -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Thumbprint" -value $ParentCert.Thumbprint} add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Issued Time" -value $ParentCert.NotBefore add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Expiry Time" -value $ParentCert.NotAfter add-member -inputobject $ParentCertObject -membertype noteproperty -name "Signature Algorithm" -value $ParentCert.SignatureAlgorithm.FriendlyName $ParentCertObject | FL * $SHA1 = $true } } if ($SHA1 -eq $false) {Write-Host "SHA1 signed Server Auth certificate NOT found." -ForegroundColor Green} } else {Write-Host "This certificate is not a Server Auth certificate and SHA1 deprecation doesn't apply." -ForegroundColor Green} } function CheckEXESigforSHA1 ($Path ) { $EXEResult = Get-AuthenticodeSignature -FilePath $Path Write-Host "Checking the code signing and time stamping certificate for the executable $Path" -ForegroundColor Green $SHA1 = $false $Date = Get-Date "1/1/2016" #Check for SHA1 signature in signing certificate. if (($EXEResult.SignerCertificate.SignatureAlgorithm.value -eq '1.3.14.3.2.29') -or ($EXEResult.SignerCertificate.SignatureAlgorithm.value -eq '1.2.840.10040.4.3') ` -or ($EXEResult.SignerCertificate.SignatureAlgorithm.value -eq '1.2.840.10045.4.1') -or ($EXEResult.SignerCertificate.SignatureAlgorithm.value -eq '1.2.840.113549.1.1.5') ` -or ($EXEResult.SignerCertificate.SignatureAlgorithm.value -eq '1.3.14.3.2.13') -or ($EXEResult.SignerCertificate.SignatureAlgorithm.value -eq '1.3.14.3.2.27')) { Write-Host "SHA1 code signing certificate found." -ForegroundColor Red -BackgroundColor Black if ($EXEResult.SignerCertificate.NotBefore -gt $Date) { Write-Host "This executable will was signed with a certificate signed with SHA1 after 1/1/2016 and is therefore deprecated now." -ForegroundColor red $SHA1 = $true } if ($EXEResult.SignerCertificate.NotBefore -lt $Date) { Write-Host "This executable will not be deprecated from use in Windows until January 1, 2020." -ForegroundColor Yellow $SHA1 = $true } $CertObject = New-Object PSObject add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Type" -value "Code Signing Certificate" if ($EXEResult.SignerCertificate.FriendlyName -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Friendly Name" -value $EXEResult.SignerCertificate.FriendlyName} if ($EXEResult.SignerCertificate.SubjectName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Subject Name" -value ($EXEResult.SignerCertificate.SubjectName).Format(1)} if ($EXEResult.SignerCertificate.Subject -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Subject" -value $EXEResult.SignerCertificate.Subject} if ($EXEResult.SignerCertificate.IssuerName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Issuer" -value ($EXEResult.SignerCertificate.IssuerName).Format(1)} if ($EXEResult.SignerCertificate.SerialNumber -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Serial Number" -value $EXEResult.SignerCertificate.SerialNumber} if ($EXEResult.SignerCertificate.Thumbprint -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Thumbprint" -value $EXEResult.SignerCertificate.Thumbprint} add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Issued Time" -value $EXEResult.SignerCertificate.NotBefore add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Expiry Time" -value $EXEResult.SignerCertificate.NotAfter add-member -inputobject $CertObject -membertype noteproperty -name "Signature Algorithm" -value $EXEResult.SignerCertificate.SignatureAlgorithm.FriendlyName $CertObject | FL * $SHA1 = $true } #Check the code signing certificate chain for problematic certificates. $ChainObject = New-Object System.Security.Cryptography.X509Certificates.X509Chain($True) $ChainObject.ChainPolicy.RevocationFlag = "EntireChain" $ChainObject.ChainPolicy.VerificationFlags = "AllFlags" $ChainObject.ChainPolicy.RevocationMode = "Online" $ChainResult = $ChainObject.Build($EXEResult.SignerCertificate) ForEach ($ParentCert in $ChainObject.ChainElements.Certificate) { if ((($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.29') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10040.4.3') ` -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10045.4.1') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.113549.1.1.5') ` -or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.13') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.27')) -and ` (!($ParentCert.Issuer -eq $ParentCert.Subject))) { Write-Host "A leaf or intermediate CA certificate in the code signing certificate's path is signed with SHA1." -ForegroundColor Red -BackgroundColor Black $ParentCertObject = New-Object PSObject add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Type" -value "Leaf or Intermediate CA" add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Chain" -value "Code Signing Certificate" if ($ParentCert.FriendlyName -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Friendly Name" -value $ParentCert.FriendlyName} if ($ParentCert.SubjectName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject Name" -value ($ParentCert.SubjectName).Format(1)} if ($ParentCert.Subject -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject" -value $ParentCert.Subject} if ($ParentCert.IssuerName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Issuer" -value ($ParentCert.IssuerName).Format(1)} if ($ParentCert.SerialNumber -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Serial Number" -value $ParentCert.SerialNumber} if ($ParentCert.Thumbprint -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Thumbprint" -value $ParentCert.Thumbprint} add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Issued Time" -value $ParentCert.NotBefore add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Expiry Time" -value $ParentCert.NotAfter add-member -inputobject $ParentCertObject -membertype noteproperty -name "Signature Algorithm" -value $ParentCert.SignatureAlgorithm.FriendlyName $ParentCertObject | FL * $SHA1 = $true } } If ($EXEResult.TimeStamperCertificate -ne $null) { #Check for SHA1 signature in time stamping certificate. if (($EXEResult.TimeStamperCertificate.SignatureAlgorithm.value -eq '1.3.14.3.2.29') -or ($EXEResult.TimeStamperCertificate.SignatureAlgorithm.value -eq '1.2.840.10040.4.3') ` -or ($EXEResult.TimeStamperCertificate.SignatureAlgorithm.value -eq '1.2.840.10045.4.1') -or ($EXEResult.TimeStamperCertificate.SignatureAlgorithm.value -eq '1.2.840.113549.1.1.5') ` -or ($EXEResult.TimeStamperCertificate.SignatureAlgorithm.value -eq '1.3.14.3.2.13') -or ($EXEResult.TimeStamperCertificate.SignatureAlgorithm.value -eq '1.3.14.3.2.27')) { Write-Host "SHA1 time stamping certificate found." -ForegroundColor Yellow if ($EXEResult.TimeStamperCertificate.NotBefore -gt $Date) { Write-Host "This executable will was signed with a certificate signed with SHA1 after 1/1/2016 and is therefore deprecated now." -ForegroundColor red $SHA1 = $true } if ($EXEResult.TimeStamperCertificate.NotBefore -lt $Date) { Write-Host "This executable will not be deprecated from use in Windows until January 1, 2020." -ForegroundColor Yellow $SHA1 = $true } $CertObject = New-Object PSObject add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Type" -value "Time Stamping Certificate" if ($EXEResult.TimeStamperCertificate.FriendlyName -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Friendly Name" -value $EXEResult.TimeStamperCertificate.FriendlyName} if ($EXEResult.TimeStamperCertificate.SubjectName -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Subject Name" -value ($EXEResult.TimeStamperCertificate.SubjectName).Format(1)} if ($EXEResult.TimeStamperCertificate.Subject -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Subject" -value $EXEResult.TimeStamperCertificate.Subject} if ($EXEResult.TimeStamperCertificate.IssuerName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Issuer" -value ($EXEResult.TimeStamperCertificate.IssuerName).Format(1)} if ($EXEResult.TimeStamperCertificate.SerialNumber -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Serial Number" -value $EXEResult.TimeStamperCertificate.SerialNumber} if ($EXEResult.TimeStamperCertificate.Thumbprint -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Thumbprint" -value $EXEResult.TimeStamperCertificate.Thumbprint} add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Issued Time" -value $EXEResult.TimeStamperCertificate.NotBefore add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Expiry Time" -value $EXEResult.TimeStamperCertificate.NotAfter add-member -inputobject $CertObject -membertype noteproperty -name "Signature Algorithm" -value $EXEResult.TimeStamperCertificate.SignatureAlgorithm.FriendlyName $CertObject | FL * $SHA1 = $true } #Check the time stamping certificate chain for problematic certificates. $ChainObject = New-Object System.Security.Cryptography.X509Certificates.X509Chain($True) $ChainObject.ChainPolicy.RevocationFlag = "EntireChain" $ChainObject.ChainPolicy.VerificationFlags = "AllFlags" $ChainObject.ChainPolicy.RevocationMode = "Online" $ChainResult = $ChainObject.Build($EXEResult.TimeStamperCertificate) ForEach ($ParentCert in $ChainObject.ChainElements.Certificate) { if ((($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.29') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10040.4.3') ` -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10045.4.1') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.113549.1.1.5') ` -or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.13') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.27')) -and ` (!($ParentCert.Issuer -eq $ParentCert.Subject))) { Write-Host "A leaf or intermediate CA certificate in the time stamping certificate's path is signed with SHA1." -ForegroundColor Red -BackgroundColor Black $ParentCertObject = New-Object PSObject add-member -inputobject $ParentCertObject -membertype noteproperty -name "Chained Certificate Serial Number" -value $Certificate.SerialNumber add-member -inputobject $ParentCertObject -membertype noteproperty -name "Chained Certificate Thumbprint" -value $Certificate.Thumbprint add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Type" -value "Leaf or Intermediate CA" add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Chain" -value "Time Stamping Certificate" if ($ParentCert.FriendlyName -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Friendly Name" -value $ParentCert.FriendlyName} if ($ParentCert.SubjectName -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject Name" -value ($ParentCert.SubjectName).Format(1)} if ($ParentCert.Subject -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject" -value $ParentCert.Subject} if ($ParentCert.IssuerName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Issuer" -value ($ParentCert.IssuerName).Format(1)} if ($ParentCert.SerialNumber -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Serial Number" -value $ParentCert.SerialNumber} if ($ParentCert.Thumbprint -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Thumbprint" -value $ParentCert.Thumbprint} add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Issued Time" -value $ParentCert.NotBefore add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Expiry Time" -value $ParentCert.NotAfter add-member -inputobject $ParentCertObject -membertype noteproperty -name "Signature Algorithm" -value $ParentCert.SignatureAlgorithm.FriendlyName $ParentCertObject | FL * $SHA1 = $true } } } if ($SHA1 -eq $false) {Write-Host "Neither code signing nor time stamping certificate was signed with SHA1." -ForegroundColor Green -BackgroundColor Black} } function SHA1SIgCheckAllSystemCerts { $CS = get-wmiobject -class win32_computersystem $Hostname = $CS.Name + '.' + $CS.Domain $Results = $pwd.Path + "\" + $Hostname + "_SHA1ServerAuthSystemCerts.txt" Get-Date | Out-File $Results -Encoding UTF8 "Computer certificate My store checks for Server Auth certificates which are signed with SHA1 or that have leaf or intermediate CA certfiicates in their path which are SHA1 signed." | Out-File $Results -Encoding UTF8 -Append Write-Host "Checking the local computer's My certificate store for Server Authentication certificates which are signed with SHA1 signatures or which have leaf or intermediate CA certificates which are signed with SHA1." -ForegroundColor Green $MyStore = New-Object System.Security.Cryptography.X509Certificates.X509Store("My","LocalMachine") $SHA1 = $false $MyStore.Open("ReadOnly") $CertsInStore = $MyStore.Certificates foreach ($Certificate in $CertsInStore) { if ($Certificate.Extensions -ne $null) { foreach ($Extension in $Certificate.Extensions) { if (($Extension.Oid.FriendlyName -like "Key Usage") -or ($Extension.Oid.FriendlyName -like "Enhanced Key Usage")) {if ($Extension.OID.Value -eq "1.3.6.1.5.5.7.3.1"){$ServerAuth = $True}} #{if ($Extension.OID.Value -ne "1.3.6.1.5.5.7.3.1"){$ServerAuth = $True}} #Testing value } if ($ServerAuth -eq $true) { if (($Certificate.SignatureAlgorithm.Value -eq '1.3.14.3.2.29') -or ($Certificate.SignatureAlgorithm.Value -eq '1.2.840.10040.4.3') ` -or ($Certificate.SignatureAlgorithm.Value -eq '1.2.840.10045.4.1') -or ($Certificate.SignatureAlgorithm.Value -eq '1.2.840.113549.1.1.5') ` -or ($Certificate.SignatureAlgorithm.Value -eq '1.3.14.3.2.13') -or ($Certificate.SignatureAlgorithm.Value -eq '1.3.14.3.2.27')) { $CertObject = New-Object PSObject if ($Certificate.FriendlyName -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Friendly Name" -value $Certificate.FriendlyName} if ($Certificate.SubjectName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Subject Name" -value ($Certificate.SubjectName).Format(1)} if ($Certificate.Subject -gt 0){add-member -inputobject $CertObject -membertype noteproperty -name "Subject" -value $Certificate.Subject} if ($Certificate.IssuerName -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Issuer" -value ($Certificate.IssuerName).Format(1)} if ($Certificate.SerialNumber -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Serial Number" -value $Certificate.SerialNumber} if ($Certificate.Thumbprint -ne $null){add-member -inputobject $CertObject -membertype noteproperty -name "Thumbprint" -value $Certificate.Thumbprint} add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Issued Time" -value $Certificate.NotBefore add-member -inputobject $CertObject -membertype noteproperty -name "Certificate Expiry Time" -value $Certificate.NotAfter add-member -inputobject $CertObject -membertype noteproperty -name "Signature Algorithm" -value $Certificate.SignatureAlgorithm.FriendlyName $CertObject | FL * $CertObject | Out-File $Results -Encoding UTF8 -Append $SHA1 = $true $ChainObject = New-Object System.Security.Cryptography.X509Certificates.X509Chain($True) $ChainObject.ChainPolicy.RevocationFlag = "EntireChain" $ChainObject.ChainPolicy.VerificationFlags = "AllFlags" $ChainObject.ChainPolicy.RevocationMode = "Online" $ChainResult = $ChainObject.Build($Certificate) #Check the certfificates parents in chain for SHA1 signature. ForEach ($ParentCert in $ChainObject.ChainElements.Certificate) { if ((($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.29') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10040.4.3') ` -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.10045.4.1') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.2.840.113549.1.1.5') ` -or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.13') -or ($ParentCert.SignatureAlgorithm.Value -eq '1.3.14.3.2.27')) -and ` (!($ParentCert.Issuer -eq $ParentCert.Subject))) { Write-Host "SHA1 signed leaf or intermediate certificate found." -ForegroundColor Yellow $ParentCertObject = New-Object PSObject add-member -inputobject $ParentCertObject -membertype noteproperty -name "Chained Certificate Serial Number" -value $Certificate.SerialNumber add-member -inputobject $ParentCertObject -membertype noteproperty -name "Chained Certificate Thumbprint" -value $Certificate.Thumbprint add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Type" -value "Leaf or Intermediate CA" if ($ParentCert.FriendlyName -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Friendly Name" -value $ParentCert.FriendlyName} if ($ParentCert.SubjectName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject Name" -value ($ParentCert.SubjectName).Format(1)} if ($ParentCert.Subject -gt 0){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Subject" -value $ParentCert.Subject} if ($ParentCert.IssuerName -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Issuer" -value ($ParentCert.IssuerName).Format(1)} if ($ParentCert.SerialNumber -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Serial Number" -value $ParentCert.SerialNumber} if ($ParentCert.Thumbprint -ne $null){add-member -inputobject $ParentCertObject -membertype noteproperty -name "Thumbprint" -value $ParentCert.Thumbprint} add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Issued Time" -value $ParentCert.NotBefore add-member -inputobject $ParentCertObject -membertype noteproperty -name "Certificate Expiry Time" -value $ParentCert.NotAfter add-member -inputobject $ParentCertObject -membertype noteproperty -name "Signature Algorithm" -value $ParentCert.SignatureAlgorithm.FriendlyName $ParentCertObject | FL * $ParentCertObject | Out-File $Results -Encoding UTF8 -Append $SHA1 = $true } } } } } } if ($SHA1 -eq $false) { Write-Host " " Write-Host "No SHA1 signed Server Auth certs, or leaf or intermediate certs for them, were found." -ForegroundColor Green -BackgroundColor Black "No SHA1 signed Server Auth certs, or leaf or intermediate certs for them, were found." | Out-File $Results -Encoding UTF8 -Append } } #Script switch if (($Cert -and $EXE) -or ($Cert -and $System) -or ($EXE -and $System) -or ($EXE -and $Cert) -or ($EXE -and $System -and $Cert)) {Write-host "Only one of the switches for FILE, SYSTEM or EXE may be done at a time. Please retry." -ForegroundColor red } if (!($Cert -or $System -or $EXE)) {Write-host "One of the switches for Certificate (CERT), EXE (executable) or SYSTEM (check all certificates in the computer store) must be set to true. Please retry." -ForegroundColor red } if ($Cert) { if ($Path -eq $null) {Write-Host "A file path for the certificate to be checked must be provided in the -Path switch." -ForegroundColor Red} else {CheckCertforSHA1 $Path } } if($EXE) { if ($Path -eq $null) {Write-Host "A file path for the executable to be checked must be provided in the -Path switch." -ForegroundColor Red} else {CheckEXESigforSHA1 $Path} } if($SYSTEM) {SHA1SIgCheckAllSystemCerts}