PoshCode Logo PowerShell Code Repository

Get-WebsiteCertificate by Andy Arismendi 6 years ago
View followups from tarique | embed code: <script type="text/javascript" src="http://PoshCode.org/embed/2521"></script>download | new post

This will return the specified website’s X.509 certificate either as an object or a file (if the -OutputFile parameter is specified). See included comment based help for documentation.

  1. function Get-WebsiteCertificate {
  2.         [CmdletBinding()]
  3.         param (
  4.                 [Parameter(Mandatory=$true)] [System.Uri]
  5.                         $Uri,
  6.                 [Parameter()] [System.IO.FileInfo]
  7.                         $OutputFile,
  8.                 [Parameter()] [Switch]
  9.                         $UseSystemProxy,       
  10.                 [Parameter()] [Switch]
  11.                         $UseDefaultCredentials,
  12.                 [Parameter()] [Switch]
  13.                         $TrustAllCertificates
  14.         )
  15.         try {
  16.                 $request = [System.Net.WebRequest]::Create($Uri)
  17.                 if ($UseSystemProxy) {
  18.                         $request.Proxy = [System.Net.WebRequest]::DefaultWebProxy
  19.                 }
  20.                
  21.                 if ($UseSystemProxy -and $UseDefaultCredentials) {
  22.                         $request.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
  23.                 }
  24.                
  25.                 if ($TrustAllCertificates) {
  26.                         # Create a compilation environment
  27.                         $Provider=New-Object Microsoft.CSharp.CSharpCodeProvider
  28.                         $Compiler=$Provider.CreateCompiler()
  29.                         $Params=New-Object System.CodeDom.Compiler.CompilerParameters
  30.                         $Params.GenerateExecutable=$False
  31.                         $Params.GenerateInMemory=$True
  32.                         $Params.IncludeDebugInformation=$False
  33.                         $Params.ReferencedAssemblies.Add("System.DLL") > $null
  34.                         $TASource=@'
  35.                           namespace Local.ToolkitExtensions.Net.CertificatePolicy {
  36.                             public class TrustAll : System.Net.ICertificatePolicy {
  37.                               public TrustAll() {
  38.                               }
  39.                               public bool CheckValidationResult(System.Net.ServicePoint sp,
  40.                                 System.Security.Cryptography.X509Certificates.X509Certificate cert,
  41.                                 System.Net.WebRequest req, int problem) {
  42.                                 return true;
  43.                               }
  44.                             }
  45.                           }
  46. '@
  47.                         $TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource)
  48.                         $TAAssembly=$TAResults.CompiledAssembly
  49.  
  50.                         ## We now create an instance of the TrustAll and attach it to the ServicePointManager
  51.                         $TrustAll=$TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
  52.                         [System.Net.ServicePointManager]::CertificatePolicy=$TrustAll
  53.                 }
  54.                
  55.                 $response = $request.GetResponse()
  56.                 $servicePoint = $request.ServicePoint
  57.                 $certificate = $servicePoint.Certificate
  58.                
  59.                 if ($OutputFile) {
  60.                         $certBytes = $certificate.Export(
  61.                                         [System.Security.Cryptography.X509Certificates.X509ContentType]::Cert
  62.                                 )
  63.                         [System.IO.File]::WriteAllBytes( $OutputFile, $certBytes )
  64.                         $OutputFile.Refresh()
  65.                         return $OutputFile
  66.                 } else {
  67.                         return $certificate
  68.                 }
  69.         } catch {
  70.                 Write-Error "Failed to get website certificate. The error was '$_'."
  71.                 return $null
  72.         }
  73.        
  74.         <#
  75.                 .SYNOPSIS
  76.                         Retrieves the certificate used by a website.
  77.        
  78.                 .DESCRIPTION
  79.                         Retrieves the certificate used by a website. Returns either an object or file.
  80.        
  81.                 .PARAMETER  Uri
  82.                         The URL of the website. This should start with https.
  83.        
  84.                 .PARAMETER  OutputFile
  85.                         Specifies what file to save the certificate as.
  86.                        
  87.                 .PARAMETER  UseSystemProxy
  88.                         Whether or not to use the system proxy settings.
  89.                        
  90.                 .PARAMETER  UseDefaultCredentials
  91.                         Whether or not to use the system logon credentials for the proxy.
  92.                        
  93.                 .PARAMETER  TrustAllCertificates
  94.                         Ignore certificate errors for certificates that are expired, have a mismatched common name or are self signed.
  95.        
  96.                 .EXAMPLE
  97.                         PS C:\> Get-WebsiteCertificate "https://www.gmail.com" -UseSystemProxy -UseDefaultCredentials -TrustAllCertificates -OutputFile C:\gmail.cer
  98.                
  99.                 .INPUTS
  100.                         Does not accept pipeline input.
  101.        
  102.                 .OUTPUTS
  103.                         System.Security.Cryptography.X509Certificates.X509Certificate, System.IO.FileInfo
  104.         #>
  105. }

Submit a correction or amendment below (
click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:


Remember me