PSCertUtils.Bundles.psm1


Function Import-CertificateToBundle {
  [CmdletBinding()]
  Param(
    [Parameter(Mandatory = $True, Position = 0)]
    [ValidateNotNullOrEmpty()]
    [Alias("File", "Certificate", "CertificateFile")]
    [String] $CertFile,
    [Parameter(Mandatory = $True, Position = 1)]
    [ValidateNotNullOrEmpty()]
    [Alias("FriendlyName", "Name", "Alias", "CertificateAlias")]
    [String] $CertAlias,
    [Parameter(Mandatory = $True, ValueFromPipelineByPropertyName=$True, Position = 2)]
    [ValidateNotNullOrEmpty()]
    [Alias("Store", "CertificateStore", "Bundle")]
    [String] $KeyStore
  )

  If (Test-CertificateExistsWithinBundle -CertAlias $CertAlias -KeyStore $KeyStore) {
    Write-Verbose ("Certificate with the alias {0} already exists in {1}." -f $CertAlias, $KeyStore)
    return
  }

  Add-X509CertificateToBundle -X509Certificate $X509Certificate -CertAlias $CertAlias -KeyStore $KeyStore

}


# Add certificate to bundle keystore
Function Add-X509CertificateToBundle {
  [CmdletBinding()]
  Param(
    [Parameter(Mandatory = $True, ValueFromPipelineByPropertyName=$True, Position = 0)]
    [ValidateNotNullOrEmpty()]
    [Alias("CertificateObject", "X509CertificateObject", "X509Certificate2")]
    [System.Security.Cryptography.X509Certificates.X509Certificate2] $X509Certificate,
    [Parameter(Mandatory = $False, ValueFromPipelineByPropertyName=$True, Position = 1)]
    [Alias("FriendlyName", "Name", "Alias", "CertificateAlias")]
    [String] $CertAlias,
    [Parameter(Mandatory = $True, Position = 2)]
    [ValidateNotNullOrEmpty()]
    [Alias("Store", "CertificateStore", "Bundle")]
    [String] $KeyStore
  )

  "#$CertAlias" | Add-Content $KeyStore
  Export-X509Certificate -X509Certificate $X509Certificate -CertificateFile $KeyStore -AddToBundle | Out-Null

}


# Test if a certificate with the given alias exists in a bundle keystore - there has to be a comment with the alias
Function Test-CertificateExistsWithinBundle {
  [CmdletBinding()]
  Param(
    [Parameter(Mandatory = $True, Position = 0)]
    [ValidateNotNullOrEmpty()]
    [Alias("FriendlyName", "Name", "Alias", "CertificateAlias")]
    [String] $CertAlias,
    [Parameter(Mandatory = $True, Position = 1)]
    [ValidateNotNullOrEmpty()]
    [Alias("Store", "CertificateStore", "Bundle")]
    [String] $KeyStore
  )

  return (Get-Content $KeyStore | Select-String "^#$CertAlias$") -ne $null

}