> 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/es/config/hosting.md).

# Alojamiento

Aloje PowerShell Universal como servicio de Windows, en IIS, en Azure o de forma independiente, y configure los puertos de Kestrel, los certificados HTTPS y las cabeceras de seguridad.

Puede alojar PowerShell Universal como servicio de Windows, en IIS, como una aplicación web de Azure o simplemente como una aplicación independiente. Si lo ejecuta en Windows, le sugerimos un servicio de Windows o IIS.

## Alojamiento como servicio de Windows

Para alojarlo como servicio de Windows, puede descargar e instalar el MSI de PowerShell Universal. El MSI instalará automáticamente el servicio de PowerShell Universal y lo iniciará. Los trabajos se ejecutarán bajo la cuenta del sistema de forma predeterminada, pero puede configurar el servicio para que se ejecute bajo otra cuenta después de la instalación.

Una vez que el MSI haya finalizado la instalación, su navegador web predeterminado se abrirá en <http://localhost:5000> para iniciar sesión. Las credenciales de inicio de sesión predeterminadas son Admin y cualquier contraseña.

### Configurar un servicio de Windows manualmente

No necesita usar el MSI para configurar Universal como servicio de Windows. También puede hacerlo manualmente con el siguiente script de PowerShell.

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

## Alojamiento en Azure

Consulte nuestra [guía de alojamiento en Azure](/powershell-universal/es/config/hosting/azure.md).

## Alojamiento manual

También puede alojar el servidor Universal como una aplicación independiente. Simplemente ejecute `Universal.Server.exe` desde el directorio de binarios para utilizar la [implementación del servidor web Kestrel en ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-3.1) e iniciar el servidor web.

## Configuración del servidor web

{% hint style="info" %}
Esta sección se aplica a Universal cuando está alojado fuera de IIS.
{% endhint %}

### Establecer el puerto y la dirección de escucha

Puede establecer el puerto del servidor Universal modificando el fichero `appsettings.json`. Recomendamos que cree un fichero `appsettings.json` en la [carpeta de configuración predeterminada](/powershell-universal/es/readme.md).

**Windows**

`%ProgramData%\PowerShellUniversal`

**Linux**

`%HOME%/.PowerShellUniversal`

Para establecer el puerto, cambie la sección de puntos de conexión de Kestrel del `appsettings.json`. De forma predeterminada, la configuración está definida para escuchar en el puerto 5000 y en cualquier dirección.

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

### Configurar HTTPS

Para configurar HTTPS, puede ajustar el fichero `appsettings.json` para usar un certificado y un puerto concretos. La siguiente configuración usa el fichero `testCert.pfx` y `testPassword` y escucha en el puerto 5463.

#### Certificados PFX

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

#### Almacén de certificados

Para configurar un certificado en una ubicación y un almacén concretos, puede usar una configuración como esta. Al seleccionar el certificado por nombre de sujeto, asegúrese de usar el nombre común sin el prefijo `CN=`.

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

La ubicación puede ser `CurrentUser` o `LocalMachine`.

#### Almacén de certificados por huella digital

Puede usar la huella digital en lugar del sujeto en la versión 3.4 y posteriores.

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

#### Certificados PEM y de clave

Algunos proveedores, como Let's Encrypt y GoDaddy, emiten certificados como ficheros de texto PEM y de clave. Puede usar estos tipos de certificados directamente con el servidor web Kestrel. Deberá especificar la sección `HttpsFromPem` dentro de `Endpoints` para 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"
  },
}
```

#### Permisos

En Windows, el usuario que ejecuta el servicio de PowerShell Universal necesitará acceso al certificado para proporcionar correctamente compatibilidad con HTTPS. Esto suele ser un problema si el servicio usa una cuenta de servicio administrada de grupo. Puede usar el siguiente script de PowerShell para proporcionar los permisos adecuados.

```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
```

### Protocolo

De forma predeterminada, Universal escuchará en HTTP1 y HTTP2. Puede ajustar los protocolos en los que escucha el servidor estableciendo la propiedad Protocols. Por ejemplo, puede establecer específicamente la compatibilidad con HTTP1 y HTTP2 con la siguiente configuración.

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

Algunas versiones de Windows Server (como 2012R2) no admiten HTTP2. Para deshabilitar la compatibilidad con HTTP2, configure el listener para que escuche solo en HTTP1.

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

Para ver el conjunto completo de opciones de escucha, puede consultar la [documentación de ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-3.1#listenoptionsusehttps).

### Cabeceras de seguridad

Las organizaciones pueden requerir que PowerShell Universal proporcione ciertas cabeceras de seguridad en las respuestas HTTP procedentes del servidor, entre las que se pueden incluir:

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

Puede usar la sección Kestrel \ Headers para definir estos valores.

```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" %}
Tenga cuidado al configurar estas cabeceras, ya que cambian el comportamiento de cada solicitud web devuelta por PowerShell Universal.
{% endhint %}

## Ejemplo: certificado autofirmado

En este ejemplo, mostraremos cómo crear un certificado autofirmado y usarlo con PowerShell Universal.

En primer lugar, cree un certificado autofirmado y guárdelo en el almacén del equipo local. Deberá ejecutar PowerShell como administrador. El almacén del equipo local es necesario porque PowerShell Universal puede estar ejecutándose como servicio y no con su cuenta.

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

A continuación, deberá configurar PowerShell Universal para que use el certificado. Esto se puede lograr editando o creando el fichero `appsettings.json` en `%ProgramData%\PowerShellUniversal`. Este fichero ya debería existir si realizó la instalación con el instalador MSI. El contenido del fichero debe incluir el nombre DNS de su certificado y la ubicación.

Para los certificados autofirmados, deberá incluir la opción `AllowInvalid`.

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

Una vez que haya actualizado el fichero `appsettings.json`, reinicie el servicio de PowerShell Universal. Ahora debería poder acceder a su sitio web de PowerShell Universal en `https://localhost`.

### Consulte también

* [Devolutions Academy – Crear un punto de conexión básico](https://academy.devolutions.net/student/activity/3466014-creating-a-basic-endpoint)


---

# 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/es/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.
