Skip to content

Instantly share code, notes, and snippets.

@Wesley-Lomax
Last active April 12, 2017 15:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Wesley-Lomax/e3e8ebd3e39e13e2129847e434be24f6 to your computer and use it in GitHub Desktop.
Save Wesley-Lomax/e3e8ebd3e39e13e2129847e434be24f6 to your computer and use it in GitHub Desktop.
Octopus Deployment Step for Unicorn sync over https using TLS1.2
{
"Id": "ActionTemplates-22",
"Name": "Unicorn Sync over https",
"Description": "Calls the unicorn sync over https using TLS1.2",
"ActionType": "Octopus.Script",
"Version": 8,
"Properties": {
"Octopus.Action.Script.Syntax": "PowerShell",
"Octopus.Action.Script.ScriptBody": "$ErrorActionPreference = 'Stop'\r\n\r\nAdd-Type -Path \"${MicroChap}\\MicroCHAP.dll\"\r\n\r\n\r\nAdd-Type @\"\r\n using System.Net;\r\n using System.Security.Cryptography.X509Certificates;\r\n public class TrustAllCertsPolicy : ICertificatePolicy {\r\n public bool CheckValidationResult(\r\n ServicePoint srvPoint, X509Certificate certificate,\r\n WebRequest request, int certificateProblem) {\r\n return true;\r\n }\r\n }\r\n\"@\r\n[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy\r\n\r\nFunction Sync-Unicorn {\r\n\tParam(\r\n\t\t[Parameter(Mandatory=$True)]\r\n\t\t[string]$ControlPanelUrl,\r\n\r\n\t\t[Parameter(Mandatory=$True)]\r\n\t\t[string]$SharedSecret,\r\n\r\n\t\t[Parameter(Mandatory=$True)]\r\n\t\t[string[]]$Configurations,\r\n\r\n\t\t[string]$Verb = 'Sync'\r\n\t)\r\n\r\n\t# PARSE THE URL TO REQUEST\r\n\t$parsedConfigurations = ($Configurations) -join \"^\"\r\n\r\n\t$url = \"{0}?verb={1}&configuration={2}\" -f $ControlPanelUrl, $Verb, $parsedConfigurations\r\n\r\n\tWrite-Host \"Sync-Unicorn: Preparing authorization for $url\"\r\n\r\n\t# GET AN AUTH CHALLENGE\r\n\t$challenge = Get-Challenge -ControlPanelUrl $ControlPanelUrl\r\n\r\n\tWrite-Host \"Sync-Unicorn: Received challenge: $challenge\"\r\n\r\n\t# CREATE A SIGNATURE WITH THE SHARED SECRET AND CHALLENGE\r\n\t$signatureService = New-Object MicroCHAP.SignatureService -ArgumentList $SharedSecret\r\n\r\n\t$signature = $signatureService.CreateSignature($challenge, $url, $null)\r\n\t\r\n\tWrite-Host \"Sync-Unicorn: MAC '$($signature.SignatureSource)'\"\r\n\tWrite-Host \"Sync-Unicorn: HMAC '$($signature.SignatureHash)'\"\r\n\tWrite-Host \"Sync-Unicorn: If you get authorization failures compare the values above to the Sitecore logs.\"\r\n\r\n\tWrite-Host \"Sync-Unicorn: Created signature $signature, executing $Verb...\"\r\n\r\n\t# USING THE SIGNATURE, EXECUTE UNICORN\r\n\t[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\r\n\t$result = Invoke-WebRequest -Uri $url -Headers @{ \"X-MC-MAC\" = $signature.SignatureHash; \"X-MC-Nonce\" = $challenge } -TimeoutSec 10800 -UseBasicParsing\r\n\r\n\t$result.Content\r\n}\r\n\r\nFunction Get-Challenge {\r\n\tParam(\r\n\t\t[Parameter(Mandatory=$True)]\r\n\t\t[string]$ControlPanelUrl\r\n\t)\r\n\r\n\t$url = \"$($ControlPanelUrl)?verb=Challenge\"\r\n\r\n\t\r\n\t$result = Invoke-WebRequest -Uri $url -TimeoutSec 360 -UseBasicParsing\r\n\r\n\t$result.Content\r\n}\r\n\r\n$configs = $Configurations.split(\"`n\")\r\n\r\n[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\r\nSync-Unicorn -ControlPanelUrl \"$($SiteUrl)/unicorn.aspx\" -SharedSecret $SharedSecret -Configurations $configs",
"Octopus.Action.Script.ScriptSource": "Inline"
},
"Parameters": [
{
"Name": "SharedSecret",
"Label": "Shared Secret",
"HelpText": null,
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
}
},
{
"Name": "SiteUrl",
"Label": "Site Url",
"HelpText": null,
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "MicroChap",
"Label": "MicroCHAP DLL Location",
"HelpText": null,
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "Configurations",
"Label": "Configurations",
"HelpText": "Add a configuration per line",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "MultiLineText"
}
}
],
"$Meta": {
"ExportedAt": "2017-04-12T15:49:18.593Z",
"OctopusVersion": "3.3.4",
"Type": "ActionTemplate"
}
}
$ErrorActionPreference = 'Stop'
Add-Type -Path "${MicroChap}\MicroCHAP.dll"
Add-Type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
Function Sync-Unicorn {
Param(
[Parameter(Mandatory=$True)]
[string]$ControlPanelUrl,
[Parameter(Mandatory=$True)]
[string]$SharedSecret,
[Parameter(Mandatory=$True)]
[string[]]$Configurations,
[string]$Verb = 'Sync'
)
# PARSE THE URL TO REQUEST
$parsedConfigurations = ($Configurations) -join "^"
$url = "{0}?verb={1}&configuration={2}" -f $ControlPanelUrl, $Verb, $parsedConfigurations
Write-Host "Sync-Unicorn: Preparing authorization for $url"
# GET AN AUTH CHALLENGE
$challenge = Get-Challenge -ControlPanelUrl $ControlPanelUrl
Write-Host "Sync-Unicorn: Received challenge: $challenge"
# CREATE A SIGNATURE WITH THE SHARED SECRET AND CHALLENGE
$signatureService = New-Object MicroCHAP.SignatureService -ArgumentList $SharedSecret
$signature = $signatureService.CreateSignature($challenge, $url, $null)
Write-Host "Sync-Unicorn: MAC '$($signature.SignatureSource)'"
Write-Host "Sync-Unicorn: HMAC '$($signature.SignatureHash)'"
Write-Host "Sync-Unicorn: If you get authorization failures compare the values above to the Sitecore logs."
Write-Host "Sync-Unicorn: Created signature $signature, executing $Verb..."
# USING THE SIGNATURE, EXECUTE UNICORN
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$result = Invoke-WebRequest -Uri $url -Headers @{ "X-MC-MAC" = $signature.SignatureHash; "X-MC-Nonce" = $challenge } -TimeoutSec 10800 -UseBasicParsing
$result.Content
}
Function Get-Challenge {
Param(
[Parameter(Mandatory=$True)]
[string]$ControlPanelUrl
)
$url = "$($ControlPanelUrl)?verb=Challenge"
$result = Invoke-WebRequest -Uri $url -TimeoutSec 360 -UseBasicParsing
$result.Content
}
$configs = $Configurations.split("`n")
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Sync-Unicorn -ControlPanelUrl "$($SiteUrl)/unicorn.aspx" -SharedSecret $SharedSecret -Configurations $configs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment