2014-10-21 13 views
8

Attualmente sto configurando una nuova distribuzione automatizzata e vorrei sapere come registrare un binding https con SNI abilitato su IIS 8 a livello di programmazione. Il sito Web esiste già e il certificato SSL è già installato.Registrare un binding https con SNI abilitato in IIS 8 con PowerShell Script

sceneggiatura PowerShell ha i seguenti parametri passati in:

  • nome del sito Web
  • Certificato SSL identificazione personale
  • dominio di legare

Assumere il certificato SSL è già installato.

Qualcuno può aiutarmi?

risposta

13

Se come dici il certificato è già installato e l'identità del pool di applicazioni ha il permesso alla chiave privata, allora si dovrebbe essere in grado di registrare un nuovo vincolante come questo:

New-WebBinding -Name $WebsiteName -Protocol "https" -Port 443 -IPAddress $IPAddress -HostHeader $HostHeader -SslFlags $sslFlags 

avrete sicuramente bisogno di impostare le variabili prima di eseguire questo codice tuttavia questi dovrebbero essere auto-esplicativi.

Quando si imposta il valore della variabile $ sslFlags dovrebbe essere impostato in base alla seguente tabella:

0 No SNI 
1 SNI Enabled 
2 Non SNI binding which uses Central Certificate Store. 
3 SNI binding which uses Central Certificate store 

Nel tuo caso questo dovrebbe essere impostato a 1 dal momento che non si sta utilizzando l'archivio certificati centrale.

Una volta ottenuto il binding SSL in atto, è necessario associare l'associazione al certificato corretto. Ho trovato attraverso l'esperienza che il modo più semplice per farlo è utilizzare il comando netsh.exe. È possibile utilizzare direttamente Powershell, tuttavia dopo molte ore di ricerca e di risoluzione di diversi problemi, ho trovato netsh solo più affidabile.

La sintassi qui dipende da quanto l'associazione sta per essere messa a punto se si utilizza SNI allora si avrà bisogno la seguente sintassi: (non preoccuparti per l'AppID, non è importante ciò che il valore è)

netsh http add sslcert hostnameport=$($HostHeader):$($Port) certhash=$Thumbprint appid='{4dc3e181-e14b-4a21-b022-59fc669b0914}' certstorename=MY 

Questo codice richiede anche l'impostazione di variabili. L'intestazione host deve essere il nome DNS a cui è associato il tuo sito web, la porta molto probabilmente sarà 443 e la variabile $ Thumbprint deve contenere l'identificazione personale o l'hash del certificato che stai per utilizzare.È possibile trovare questo utilizzando il provider di certificati come in questo codice:

$Thumbprint = (Get-ChildItem -Path cert:\LocalMachine\My | Where-Object {$_.GetNameInfo("SimpleName",$false) -eq "my cert common name"}).Thumbprint 

Spero che questo aiuti, se avete bisogno di più aiuto quindi aggiornare la domanda. Ho lavorato molto in quest'area.

0

Se il legame esiste giá ma il certificato non è presente (supponendo che il sito utilizza la porta 443):

cd IIS:\sslbindings 
get-item cert:\certpath\$thumbprint | new-item 0.0.0.0!443 

Per accedere al IIS PS-Drive è necessario importare il modulo webadministration.

Se l'associazione non esiste ancora è possibile creare con

New-WebBinding -Name $siteName -IP "*" -Port 443 -Protocol https 

saluti

3

Se non si desidera utilizzare Netsh, è anche possibile aggiungere un binding SNI (con il flag "Richiedi nome server" impostato solo su PowerShell.

Qui è l'approccio più semplice che ho trovato per IIS8:

# Parameters: 
$WebsiteName = "Your Site Name" # this is the Sites name as displayed in IIS Manager 
$port = 443 # SSL Port, when using SNI most likely the default port 443 
$hostHeader = "www.example.com" # the domain/host-header this binding should listen for 
$thumbprint = "AAABBBCCCDDDEEEFFF000111222333444555666" # the certificate thumbprint 
# Commands: 
New-Item -Path "IIS:\SslBindings\!$port!$hostHeader" -Thumbprint $thumbprint -SSLFlags 1 
New-WebBinding -Name $WebsiteName -Protocol "https" -Port $port -HostHeader $hostHeader -SslFlags 1 

Spero che questo aiuti qualcuno! :-)

+1

La (non documentato) '-SSLFlags 1' su' nuovo elemento di cui sopra 'e omettendo l'indirizzo IP ha fatto il trucco per me. Grazie, ha aiutato molto! –

1

C'è in realtà un metodo sull'oggetto vincolante per aggiungere uno SSL che sembra funzionare meglio di entrambe le opzioni

$Name = '' 
$IP = '' 
$HostHeader = '' 

#ymmv here. if host header doesnt match subject name you need to adjust how you're getting the cert 
$Cert = (gci cert:\LocalMachine\My) | ? { (($_.Subject | SLS '^(?:CN=)(.*?)(?=,)').matches.groups.value[-1]) -eq $HostHeader} 

New-WebBinding -Name $Name -Protocol 'https' -Port 443 -IPAddress $IP -HostHeader $HostHeader -SslFlags 1 
$NewBinding = get-webbinding -hostheader $HostHeader -protocol https 
$NewBinding.AddSSLCertificate("$($cert.getcerthashstring())","MY") 
Problemi correlati