> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/powershell-universal/it/config/hosting.md).

# Hosting

È possibile ospitare PowerShell Universal come servizio Windows, in IIS, come Azure Web App o semplicemente come applicazione autonoma. Se si esegue su Windows, consigliamo un servizio Windows oppure IIS.

## Hosting come servizio Windows

Per l'hosting come servizio Windows, è possibile scaricare e installare l'MSI di PowerShell Universal. L'MSI installerà automaticamente il servizio PowerShell Universal e lo avvierà. Per impostazione predefinita i processi verranno eseguiti con l'account di sistema, ma è possibile configurare il servizio per l'esecuzione con un altro account dopo l'installazione.

Al termine dell'installazione dell'MSI, il browser web predefinito si aprirà su <http://localhost:5000> per l'accesso. Le credenziali di accesso predefinite sono impostate su Admin e una password qualsiasi.

### Configurare manualmente un servizio Windows

Non è necessario utilizzare l'MSI per configurare Universal come servizio Windows. È possibile farlo anche manualmente con il seguente script PowerShell.

```powershell
New-Service -Name "PowerShellUniversal" -BinaryPathName "Universal.Server.exe --service" -Description "PowerShell Universal server service." -DisplayName "PowerShell Universal" -StartupType Automatic
Start-Service PowerShellUniversal
```

## Hosting in Azure

Consulti la nostra [guida all'hosting in Azure](/powershell-universal/it/config/hosting/azure.md).

## Hosting manuale

È anche possibile ospitare il server Universal come applicazione autonoma. È sufficiente eseguire `Universal.Server.exe` dalla directory dei binari per utilizzare l'[implementazione del server web Kestrel in ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-3.1) e avviare il server web.

## Configurazione del server web

{% hint style="info" %}
Questa sezione si applica a Universal quando è ospitato al di fuori di IIS.
{% endhint %}

### Impostazione della porta e dell'indirizzo di ascolto

È possibile impostare la porta del server Universal modificando il file `appsettings.json`. Consigliamo di creare un file `appsettings.json` nella [cartella di configurazione predefinita](/powershell-universal/it/readme.md).

**Windows**

`%ProgramData%\PowerShellUniversal`

**Linux**

`%HOME%/.PowerShellUniversal`

Per impostare la porta, modifichi la sezione degli endpoint Kestrel di `appsettings.json`. Per impostazione predefinita, la configurazione è definita per l'ascolto sulla porta 5000 e su qualsiasi indirizzo.

```javascript
    "Kestrel": {
    "Endpoints": {
      "HTTP": {
        "Url": "http://*:5000"
      }
    }
  },
```

### Configurazione di HTTPS

Per configurare HTTPS, è possibile modificare il file `appsettings.json` in modo da utilizzare un certificato e una porta specifici. La configurazione seguente utilizza il file `testCert.pfx` e `testPassword` e resta in ascolto sulla porta 5463.

#### Certificati PFX

```javascript
{
  "Kestrel": {
    "Endpoints": {
       "HTTP": { "Url": "http://*:5000" },
           "HTTPS": {
              "Url": "https://*:5463",
              "Certificate": {
                  "Path": "testCert.pfx",
                  "Password": "testPassword"
              }
          }
    }
}
```

#### Archivio certificati

Per configurare un certificato in una posizione e in un archivio specifici, è possibile utilizzare una configurazione come questa. Quando si seleziona il certificato in base al nome del soggetto, si assicuri di utilizzare il nome comune senza il prefisso `CN=`.

```javascript
{
  "Kestrel": {
    "Endpoints": {
      "HTTPS": {
         "Url": "https://*:443",
           "Certificate": {
             "Subject": "windows-server.ironman.local",
             "Store": "My",
             "Location": "LocalMachine",
             "AllowInvalid": "true"
           }
      }
   }
}
```

Location può essere `CurrentUser` oppure `LocalMachine`.

#### Archivio certificati per identificazione personale

È possibile utilizzare l'identificazione personale anziché il soggetto nella versione 3.4 e successive.

```powershell
{
  "Kestrel": {
    "Endpoints": {
      "HTTPS": {
         "Url": "https://*:443",
           "Certificate": {
             "Thumbprint": "SDFSDFSDFSDFSDFSDFSDFFSD",
             "Store": "My",
             "Location": "LocalMachine",
             "AllowInvalid": "true"
            }
         }
      }
   }
}
```

#### Certificati PEM e chiave

Alcuni provider, come Let's Encrypt e GoDaddy, rilasciano i certificati come file di testo PEM e key. È possibile utilizzare questi tipi di certificati direttamente con il server web Kestrel. Sarà necessario specificare la sezione `HttpsFromPem` all'interno di `Endpoints` per Kestrel.

```json
{
  "Kestrel": {
    "Endpoints": {
      "HTTP": {
        "Url": "http://*:5000"
      },
      "HttpsFromPem": {
        "Url": "https://*:5001",
        "Certificate": {
          "Path": "C:\\Users\\adamr\\Desktop\\cert.pem",
          "KeyPath": "C:\\Users\\adamr\\Desktop\\key.pem"
        }
      }
    },
    "RedirectToHttps": "true"
  },
}
```

#### Autorizzazioni

Su Windows, l'utente che esegue il servizio PowerShell Universal dovrà avere accesso al certificato per fornire correttamente il supporto HTTPS. Questo è in genere un problema se il servizio utilizza un account del servizio gestito del gruppo. È possibile utilizzare il seguente script PowerShell per fornire le autorizzazioni corrette.

```powershell
$thumbprint = "<<THUMBPRINT>>"
$certPath = "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys"
$cert = Get-ChildItem -Path Cert:\LocalMachine\My\$thumbprint
$acl = Get-Acl -Path (Join-Path $certPath $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName)
$gmSaAccount = "Domain\<<GMSA_Account>>$"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($gmSaAccount, "Read", "Allow")
$acl.SetAccessRule($accessRule)
Set-Acl -Path (Join-Path $certPath $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName) -AclObject $acl
```

### Protocollo

Per impostazione predefinita, Universal resterà in ascolto su HTTP1 e HTTP2. È possibile modificare i protocolli su cui il server resta in ascolto impostando la proprietà Protocols. Ad esempio, è possibile impostare in modo specifico il supporto HTTP1 e HTTP2 con la seguente impostazione.

```javascript
"Kestrel": {
  "Endpoints": {
    "HTTP": {
      "Url": "http://*:5000",
      "Protocols": "Http1AndHttp2"
    }
  },
  "RedirectToHttps": "false"
},
```

Alcune versioni di Windows Server (come 2012R2) non supportano HTTP2. Per disabilitare il supporto HTTP2, imposti il listener in modo che resti in ascolto solo su HTTP1.

```javascript
"Kestrel": {
  "Endpoints": {
    "HTTP": {
      "Url": "http://*:5000",
      "Protocols": "Http1"
    }
  },
  "RedirectToHttps": "false"
},
```

Per l'insieme completo delle opzioni di ascolto, può fare riferimento alla [documentazione di ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-3.1#listenoptionsusehttps).

### Intestazioni di sicurezza

Le organizzazioni possono richiedere che PowerShell Universal fornisca determinate intestazioni di sicurezza nelle risposte HTTP provenienti dal server; queste possono includere:

* Strict-Transport-Security
* Content-Security-Policy
* X-Frame-Options
* X-Content-Type-Options
* X-XSS-Protection
* Referrer-Policy

È possibile utilizzare la sezione Kestrel \ Headers per definire questi valori.

```json
{
    "Kestrel" : {
       "Headers": {
          "X-Content-Type-Options": "nosniff",
          "Content-Security-Policy": "default-src 'self';",
          "X-XSS-Protection": "block",
          "X-Frame-Options": "DENY"
       }
    }
}
```

{% hint style="warning" %}
Presti attenzione durante la configurazione di queste intestazioni, poiché modificano il comportamento di ogni richiesta web restituita da PowerShell Universal.
{% endhint %}

## Esempio: certificato autofirmato

In questo esempio mostreremo come creare un certificato autofirmato e utilizzarlo con PowerShell Universal.

Innanzitutto, crei un certificato autofirmato e lo memorizzi nell'archivio del computer locale. Sarà necessario eseguire PowerShell come amministratore. L'archivio del computer locale è necessario perché PowerShell Universal potrebbe essere in esecuzione come servizio e non con il suo account.

```powershell
New-SelfSignedCertificate -DnsName localhost -CertStoreLocation cert:\LocalMachine\My
```

Successivamente, sarà necessario configurare PowerShell Universal per utilizzare il certificato. Questo può essere fatto modificando o creando il file `appsettings.json` in `%ProgramData%\PowerShellUniversal`. Questo file dovrebbe già esistere se l'installazione è stata eseguita con il programma di installazione MSI. Il contenuto del file dovrebbe includere il nome DNS del certificato e la posizione.

Per i certificati autofirmati, sarà necessario includere l'opzione `AllowInvalid`.

```json
{
  "Kestrel": {
    "Endpoints": {
      "HTTPS": {
         "Url": "https://*:443",
           "Certificate": {
             "Subject": "localhost",
             "Store": "My",
             "Location": "LocalMachine",
             "AllowInvalid": "true"
           }
      }
   }
}
```

Dopo aver aggiornato il file `appsettings.json`, riavvii il servizio PowerShell Universal. A questo punto dovrebbe essere possibile accedere al sito web di PowerShell Universal all'indirizzo `https://localhost`.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.devolutions.net/powershell-universal/it/config/hosting.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
