Public/Install-SolrSslCertificate.ps1
function Install-SolrSslCertificate { [CmdletBinding(SupportsShouldProcess)] param( [Parameter(Mandatory, ValueFromPipeline)] [string]$Path, [Parameter(Mandatory)] [SecureString]$KeyPass, [Parameter(Mandatory)] [SecureString]$StorePass, [string]$HostName = "localhost", [string]$IpAddress = "127.0.0.1", [string]$DistinguishedName = "CN=localhost, OU=Organizational Unit, O=Organization, L=Location, ST=State, C=Country", [Parameter(Mandatory)] [string]$ServiceName, [string]$JksFileName = "solr-ssl.keystore.jks", [string]$P12FileName = "solr-ssl.keystore.p12", [int]$CertificateValidityInDays = 365 ) $keypassBstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($KeyPass) $keypassValue = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($keypassBstr) $storepassBstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($StorePass) $storepassValue = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($storepassBstr) $activity = "Setting up SSL for Solr..." Write-Verbose "Adding JRE bin folder to path temporarily..." $env:Path += ";$env:programfiles\Java\jre1.8.0_172\bin" Write-Progress -Activity $activity -Status "Generating SSL keys..." if ($PSCmdlet.ShouldProcess($Path, "Creating keys")) { Start-Process "keytool.exe" -ArgumentList "-genkeypair -alias solr-ssl -keyalg RSA -keysize 2048 -keypass $keypassValue -storepass $storepassValue -validity $CertificateValidityInDays -keystore $JksFileName -ext SAN=DNS:$HostName,IP:$IpAddress -dname ""$DistinguishedName""" -NoNewWindow -Wait Start-Process "keytool.exe" -ArgumentList "-importkeystore -srcalias solr-ssl -destalias solr-ssl -srckeystore $JksFileName -destkeystore $P12FileName -srcstoretype jks -deststoretype pkcs12 -srcstorepass $storepassValue -deststorepass $storepassValue -srckeypass $keypassValue -destkeypass $keypassValue -noprompt" -NoNewWindow -Wait Copy-Item solr-ssl.keystore.jks $ \server\etc } Write-Progress -Activity $activity -Status "Updating Solr configuration for SSL..." if ($PSCmdlet.ShouldProcess($Path, "Updating Solr config")) { $solrincmdContent = Get-Content $Path\bin\solr.in.cmd $newContent = "" foreach ($content in $solrincmdContent) { if ($content -match "^REM set SOLR_SSL_(?!CLIENT)") { Write-Verbose "Old content: $content" $content = $content.replace("REM ", "") if ($content -match " SOLR_SSL_(KEY|TRUST)_STORE=") { $content = $content.Substring(0, $content.IndexOf('=')) + "=$Path\server\etc\solr-ssl.keystore.jks" } elseif ($content -match " SOLR_SSL_(KEY|TRUST)_STORE_PASSWORD=") { $content = $content.Substring(0, $content.IndexOf('=')) + "=$storepassValue" } Write-Verbose "New content: $content" } $newContent += $content $newContent += "`r`n" } Set-Content -Path $Path\bin\solr.in.cmd -Value $newContent } Write-Progress -Activity $activity -Status "Importing SSL certificate to certificate store..." if ($PSCmdlet.ShouldProcess($Path, "Import certificate")) { Import-PfxCertificate -FilePath $P12FileName -CertStoreLocation "cert:\localmachine\root" -Password $StorePass } Write-Progress -Activity $activity -Status "Restarting Solr Service..." if ($PSCmdlet.ShouldProcess($Path, "Restart service")) { Set-Service $ServiceName -Status Stopped Set-Service $ServiceName -Status Running } Write-Progress -Activity $activity -Completed } |