From 649d342a073da1973ff68359ea9cb0c25bc8bfc9 Mon Sep 17 00:00:00 2001 From: Robert Holt Date: Mon, 1 Oct 2018 14:40:48 -0700 Subject: [PATCH] Replace test certificates with self-signed certificate generating command (#7875) --- build.psm1 | 10 ++- .../CmsMessage.Tests.ps1 | 5 +- .../certificateCommon.psm1 | 25 +++++- .../Modules/HelpersCommon/HelpersCommon.psd1 | 1 + .../Modules/HelpersCommon/HelpersCommon.psm1 | 10 +++ test/tools/Modules/WebListener/ClientCert.pfx | Bin 4293 -> 0 bytes test/tools/Modules/WebListener/README.md | 15 +++- test/tools/Modules/WebListener/ServerCert.pfx | Bin 2553 -> 0 bytes .../Modules/WebListener/WebListener.psd1 | 3 + .../Modules/WebListener/WebListener.psm1 | 75 +++++++++++++++++- test/tools/WebListener/README.md | 4 + 11 files changed, 138 insertions(+), 10 deletions(-) delete mode 100644 test/tools/Modules/WebListener/ClientCert.pfx delete mode 100644 test/tools/Modules/WebListener/ServerCert.pfx diff --git a/build.psm1 b/build.psm1 index e8e2f6c9ef..9296d98b0e 100644 --- a/build.psm1 +++ b/build.psm1 @@ -5,6 +5,10 @@ # On Windows paths is separated by semicolon $script:TestModulePathSeparator = [System.IO.Path]::PathSeparator +# Path to a directory to store modules we temporarily need to test PowerShell +$script:TestModuleDirPath = Join-Path ([System.IO.Path]::GetTempPath()) 'PwshTestModules' +$null = New-Item -Force -ItemType Directory -Path $script:TestModuleDirPath + $dotnetCLIChannel = "release" $dotnetCLIRequiredVersion = $(Get-Content $PSScriptRoot/global.json | ConvertFrom-Json).Sdk.Version @@ -1035,6 +1039,9 @@ function Publish-PSTestTools { Pop-Location } } + + # Get the SelfSignedCertificate module so the web listener can use it + Save-Module -Name SelfSignedCertificate -Path $script:TestModuleDirPath -Repository "PSGallery" -MinimumVersion '0.0.2' -Force -Confirm:$false } function Get-ExperimentalFeatureTests { @@ -1139,7 +1146,8 @@ function Start-PSPester { } # Autoload (in subprocess) temporary modules used in our tests - $command += '$env:PSModulePath = '+"'$TestModulePath$TestModulePathSeparator'" + '+$($env:PSModulePath);' + $newPathFragment = $TestModulePath + $TestModulePathSeparator + $script:TestModuleDirPath + $TestModulePathSeparator + $command += '$env:PSModulePath = '+"'$newPathFragment'" + '+$env:PSModulePath;' # Windows needs the execution policy adjusted if ($Environment.IsWindows) { diff --git a/test/powershell/Modules/Microsoft.PowerShell.Security/CmsMessage.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Security/CmsMessage.Tests.ps1 index 0865032b85..7dc805be35 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Security/CmsMessage.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Security/CmsMessage.Tests.ps1 @@ -28,9 +28,8 @@ Describe "CmsMessage cmdlets and Get-PfxCertificate basic tests" -Tags "CI" { } It "Verify Get-PfxCertificate right password" { - #[SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Test secret.")] - $pass = ConvertTo-SecureString "password" -AsPlainText -Force - $cert = Get-PfxCertificate $protectedCertLocation -Password $pass + $password = Get-CertificatePassword + $cert = Get-PfxCertificate $protectedCertLocation -Password $password $cert.Subject | Should -Be "CN=localhost" } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Security/certificateCommon.psm1 b/test/powershell/Modules/Microsoft.PowerShell.Security/certificateCommon.psm1 index a58c3ba83b..f390082193 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Security/certificateCommon.psm1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Security/certificateCommon.psm1 @@ -68,6 +68,21 @@ OksttXT1kXf+aez9EzDlsgQU4ck78h0WTy01zHLwSKNWK4wFFQM= return $certLocation } +Function New-CertificatePassword +{ + $script:protectedCertPassword = ConvertTo-SecureString -Force -AsPlainText (New-RandomHexString) + return $script:protectedCertPassword +} + +Function Get-CertificatePassword +{ + if ($null -eq $script:protectedCertPassword) + { + throw [System.InvalidOperationException] "`$script:protectedCertPassword is not defined. Call New-CertificatePassword first." + } + return $script:protectedCertPassword +} + Function New-ProtectedCertificate { <# @@ -78,7 +93,15 @@ Function New-ProtectedCertificate Password: "password" #> - $certLocation = ".\test\tools\Modules\WebListener\ServerCert.pfx" + $certLocation = Join-Path ([System.IO.Path]::GetTempPath()) 'protectedCert.pfx' + + $password = New-CertificatePassword + + $null = SelfSignedCertificate\New-SelfSignedCertificate ` + -CommonName 'localhost' ` + -OutCertPath $certLocation ` + -Passphrase $password ` + -Force return $certLocation } diff --git a/test/tools/Modules/HelpersCommon/HelpersCommon.psd1 b/test/tools/Modules/HelpersCommon/HelpersCommon.psd1 index 6bf4370f88..0dea69c59d 100644 --- a/test/tools/Modules/HelpersCommon/HelpersCommon.psd1 +++ b/test/tools/Modules/HelpersCommon/HelpersCommon.psd1 @@ -21,6 +21,7 @@ FunctionsToExport = @( 'Disable-Testhook' 'Enable-Testhook' 'Get-RandomFileName' + 'New-RandomHexString' 'Send-VstsLogFile' 'Set-TesthookResult' 'Start-NativeExecution' diff --git a/test/tools/Modules/HelpersCommon/HelpersCommon.psm1 b/test/tools/Modules/HelpersCommon/HelpersCommon.psm1 index 3a25101f6f..f3ca73a1fe 100644 --- a/test/tools/Modules/HelpersCommon/HelpersCommon.psm1 +++ b/test/tools/Modules/HelpersCommon/HelpersCommon.psm1 @@ -313,3 +313,13 @@ function Start-NativeExecution $script:ErrorActionPreference = $backupEAP } } + +# Creates a new random hex string for use with things like test certificate passwords +function New-RandomHexString +{ + param([int]$Length = 10) + + $random = [Random]::new() + return ((1..$Length).ForEach{ '{0:x}' -f $random.Next(0xf) }) -join '' +} + diff --git a/test/tools/Modules/WebListener/ClientCert.pfx b/test/tools/Modules/WebListener/ClientCert.pfx deleted file mode 100644 index 3303943fb72d750407be21114b427f82bd77d6d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4293 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 GC+y!b4Ho49 diff --git a/test/tools/Modules/WebListener/WebListener.psd1 b/test/tools/Modules/WebListener/WebListener.psd1 index 91021b45e5..5d90958c08 100644 --- a/test/tools/Modules/WebListener/WebListener.psd1 +++ b/test/tools/Modules/WebListener/WebListener.psd1 @@ -4,6 +4,9 @@ Author = 'Mark Kraus' Description = 'An HTTP and HTTPS Listener for testing purposes' RootModule = 'WebListener.psm1' + RequiredModules = @( + 'SelfSignedCertificate' + ) FunctionsToExport = @( 'Get-WebListener' 'Get-WebListenerClientCertificate' diff --git a/test/tools/Modules/WebListener/WebListener.psm1 b/test/tools/Modules/WebListener/WebListener.psm1 index c58db23ada..d400c768ef 100644 --- a/test/tools/Modules/WebListener/WebListener.psm1 +++ b/test/tools/Modules/WebListener/WebListener.psm1 @@ -1,5 +1,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. + Class WebListener { [int]$HttpPort @@ -18,6 +19,67 @@ Class WebListener [WebListener]$WebListener +function New-ClientCertificate +{ + param([string]$CertificatePath, [string]$Password) + + if ($Password) + { + $Passphrase = ConvertTo-SecureString -Force -AsPlainText $Password + } + + $distinguishedName = @{ + CN = 'adatum.com' + C = 'US' + S = 'Washington' + L = 'Redmond' + O = 'A. Datum Corporation' + OU = 'R&D' + E = 'randd@adatum.com' + } + + $certificateParameters = @{ + OutCertPath = $CertificatePath + StartDate = [datetime]::Now.Subtract([timespan]::FromDays(30)) + Duration = [timespan]::FromDays(365) + Passphrase = $Passphrase + CertificateFormat = 'Pfx' + KeyLength = 4096 + ForCertificateAuthority = $true + Force = $true + } + $distinguishedName + + SelfSignedCertificate\New-SelfSignedCertificate @certificateParameters +} + +function New-ServerCertificate +{ + param([string]$CertificatePath, [string]$Password) + + if ($Password) + { + $Passphrase = ConvertTo-SecureString -Force -AsPlainText $Password + } + + $distinguishedName = @{ + CN = 'localhost' + } + + $certificateParameters = @{ + OutCertPath = $CertificatePath + StartDate = [datetime]::Now.Subtract([timespan]::FromDays(30)) + Duration = [timespan]::FromDays(1000) + Passphrase = $Passphrase + KeyUsage = 'DigitalSignature','KeyEncipherment' + EnhancedKeyUsage = 'ServerAuthentication','ClientAuthentication' + CertificateFormat = 'Pfx' + KeyLength = 2048 + Force = $true + } + $distinguishedName + + SelfSignedCertificate\New-SelfSignedCertificate @certificateParameters +} + function Get-WebListener { [CmdletBinding(ConfirmImpact = 'Low')] @@ -60,11 +122,17 @@ function Start-WebListener $initTimeoutSeconds = 15 $appDll = 'WebListener.dll' $serverPfx = 'ServerCert.pfx' - $serverPfxPassword = 'password' + $serverPfxPassword = New-RandomHexString + $clientPfx = 'ClientCert.pfx' $initCompleteMessage = 'Now listening on' $sleepMilliseconds = 100 - $serverPfxPath = Join-Path $MyInvocation.MyCommand.Module.ModuleBase $serverPfx + $serverPfxPath = Join-Path ([System.IO.Path]::GetTempPath()) $serverPfx + $Script:ClientPfxPath = Join-Path ([System.IO.Path]::GetTempPath()) $clientPfx + $Script:ClientPfxPassword = New-RandomHexString + New-ServerCertificate -CertificatePath $serverPfxPath -Password $serverPfxPassword + New-ClientCertificate -CertificatePath $Script:ClientPfxPath -Password $Script:ClientPfxPassword + $Job = Start-Job { $path = Split-Path -parent (get-command WebListener).Path -Verbose Push-Location $path -Verbose @@ -130,8 +198,7 @@ function Get-WebListenerClientCertificate { [OutputType([System.Security.Cryptography.X509Certificates.X509Certificate2])] param() process { - $pfxPath = Join-Path $MyInvocation.MyCommand.Module.ModuleBase 'ClientCert.pfx' - [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($pfxPath,'password') + [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($Script:ClientPfxPath, $Script:ClientPfxPassword) } } diff --git a/test/tools/WebListener/README.md b/test/tools/WebListener/README.md index 705bf62b05..2d270f55a3 100644 --- a/test/tools/WebListener/README.md +++ b/test/tools/WebListener/README.md @@ -11,6 +11,10 @@ cd bin dotnet WebListener.dll ServerCert.pfx password 8083 8084 8085 8086 ``` +**NOTE**: `ServerCert.pfx` is no longer a static asset +and you will need to create your own certificate for this purpose. +The `SelfSignedCertificate` module in the PowerShell Gallery provides this functionality. + The test site can then be accessed via `http://localhost:8083/`, `https://localhost:8084/`, `https://localhost:8085/`, or `https://localhost:8086/`. The `WebListener.dll` takes 6 arguments: