Public/Publish-DnsChallenge.ps1
function Publish-DnsChallenge { [CmdletBinding()] param( [Parameter(Mandatory,Position=0)] [string]$Domain, [Parameter(Mandatory,Position=1)] [PSTypeName('PoshACME.PAAccount')]$Account, [Parameter(Mandatory,Position=2)] [string]$Token, [Parameter(Mandatory,Position=3)] [string]$Plugin, [Parameter(Position=4)] [hashtable]$PluginArgs, [switch]$NoPrefix ) if ($NoPrefix) { $recordName = $Domain } else { $recordName = "_acme-challenge.$Domain" } $keyAuth = Get-KeyAuthorization $Account $Token # hash and encode the key authorization value $keyAuthBytes = [Text.Encoding]::UTF8.GetBytes($keyAuth) $sha256 = [Security.Cryptography.SHA256]::Create() $keyAuthHash = $sha256.ComputeHash($keyAuthBytes) $txtValue = ConvertTo-Base64Url $keyAuthHash Write-Debug "Calling $Plugin plugin to add $recordName TXT with value $txtValue" # dot source the plugin file $pluginDir = Join-Path $MyInvocation.MyCommand.Module.ModuleBase 'DnsPlugins' . (Join-Path $pluginDir "$Plugin.ps1") # check for the command that should exist now based on plugin name $addCommand = "Add-DnsTxt$Plugin" if (!(Get-Command $addCommand -ErrorAction SilentlyContinue)) { throw "Expected plugin command $addCommand not found." } # call the function with the required parameters and splatting the rest &$addCommand $recordName $txtValue @PluginArgs <# .SYNOPSIS Publish the required TXT record for a dns-01 authorization challenge. .DESCRIPTION Uses one of the DNS plugins and its associated parameters to write a TXT record to DNS that satisfies the dns-01 authorization challenge in an ACME order. Depending on the plugin, calling Save-DnsChallenge may be required to commit changes to the DNS server. If multiple challenges are being published, make all Publish-DnsChallenge calls first. Then, Save-DnsChallenge once to commit them all. .PARAMETER Domain The domain name that the TXT record will be written for. .PARAMETER Account The account object associated with the order that requires the challenge. .PARAMETER Token The DNS01Token value from the authorization object in the order. .PARAMETER Plugin The name of the DNS plugin to use. Use Get-DnsPlugins to display a list of available plugins. .PARAMETER PluginArgs A hashtable containing the plugin arguments to use with the specified DnsPlugin list. So if a plugin has a -MyText string and -MyNumber integer parameter, you could specify them as @{MyText='text';MyNumber=1234}. .PARAMETER NoPrefix If specified, '_acme-challenge.' will not be added to record name being written in DNS. This normally only used when using challenge aliases. .EXAMPLE $auths = Get-PAOrder | Get-PAAuthorizations PS C:\>Publish-DnsChallenge $auths[0].fqdn (Get-PAAccount) $auths[0].DNS01Token Manual @{} Publish the DNS challenge for the first authorization in the current order using the Manual DNS plugin. .EXAMPLE $auths = Get-PAOrder | Get-PAAuthorizations PS C:\>$acct = Get-PAAccount PS C:\>$auths | %{ Publish-DnsChallenge $_.fqdn $acct $_.DNS01Token Flurbog @{FBServer='127.0.0.1';FBToken='abc123'} } Publish all DNS challenges for the current order using the Flurbog DNS plugin. .LINK Project: https://github.com/rmbolger/Posh-ACME .LINK Unpublish-DnsChallenge .LINK Save-DnsChallenge .LINK Get-DnsPlugins .LINK Get-DnsPluginHelp #> } |