> 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

Puede alojar PowerShell Universal como servicio de Windows, en IIS, como aplicación web de Azure o simplemente como 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 con la cuenta del sistema de forma predeterminada, pero puede configurar el servicio para que se ejecute con otra cuenta después de la instalación.

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

### Configurar manualmente un servicio de Windows

No es necesario utilizar 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 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 se aloja fuera de IIS.
{% endhint %}

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

Puede establecer el puerto del servidor Universal modificando el fichero `appsettings.json`. Le 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 endpoints de Kestrel de `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 utiliza 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 utilizar una configuración como esta. Al seleccionar el certificado por nombre de sujeto, asegúrese de utilizar 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 utilizar 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 los certificados como ficheros de texto PEM y de clave. Puede utilizar 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 poder proporcionar correctamente compatibilidad con HTTPS. Esto suele ser un problema si el servicio utiliza una cuenta de servicio administrada de grupo. Puede utilizar el siguiente script de PowerShell para conceder 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 desactivar la compatibilidad con HTTP2, configure el listener para que escuche únicamente en HTTP1.

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

Para obtener 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).

### Encabezados de seguridad

Las organizaciones pueden requerir que PowerShell Universal proporcione determinados encabezados de seguridad en las respuestas HTTP procedentes del servidor; entre ellos pueden estar:

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

Puede utilizar 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 estos encabezados, ya que cambian el comportamiento de todas las solicitudes web devueltas por PowerShell Universal.
{% endhint %}

## Ejemplo: certificado autofirmado

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

En primer lugar, cree un certificado autofirmado y almacénelo 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 utilice 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`.


---

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