Actualizar OpenSSH a v9.8 en Windows Server 2016: guía completa, pasos y buenas prácticas

¿Quieres llevar OpenSSH en Windows Server 2016 hasta la versión más reciente disponible y te preguntas si puedes “forzar” la 9.8? Aquí tienes una guía realista y paso a paso: qué se puede y qué no, cómo actualizar correctamente con mínimos tiempos muertos, cómo validar, reforzar la seguridad y cómo volver atrás si algo falla.

Índice

Resumen de la pregunta

Se tiene OpenSSH 9.2 en Windows Server 2016 y se desea “forzar” la actualización a 9.8.

Respuesta corta

No se puede “forzar” una actualización a una versión que no existe como build oficial para Windows. En Windows Server 2016, OpenSSH no es una característica integrada del sistema; se instala y actualiza de forma manual usando los binarios del proyecto Win32‑OpenSSH (paquete OpenSSH‑Win64.zip). Si el repositorio aún no publica binarios de Windows que empaqueten la 9.8, no puedes tener “9.8 para Windows” salvo que la compiles por tu cuenta. En entornos de producción, lo recomendado es usar binarios oficiales de Win32‑OpenSSH.

Qué debes saber antes de actualizar

  • Modelo de distribución: En este sistema, el cliente y el servidor SSH no vienen como rol o característica nativa. Se instalan desde un paquete ZIP y se registran como servicios Windows mediante scripts incluidos (install-sshd.ps1, uninstall-sshd.ps1).
  • Ubicación típica: C:\Program Files\OpenSSH\ para binarios y scripts; C:\ProgramData\ssh\ para configuración y claves.
  • Compatibilidad: Usa siempre el paquete Win64 para Server 2016. Evita mezclar instalaciones anteriores en rutas distintas o entradas antiguas del PATH.
  • Ventana de mantenimiento: La actualización requiere detener el servicio sshd. Planifica una ventana o aplica el patrón de prueba en puerto alternativo para reducir el riesgo.
  • Seguridad: Cambios de versión pueden endurecer algoritmos por defecto (por ejemplo, rechazo de RSA‑SHA1). Revisa tu sshd_config y tus claves antes y después de actualizar.

Preparación y copia de seguridad

Antes de tocar nada, haz una copia de seguridad de configuración y claves:

# Ejecuta PowerShell como Administrador
Copia configuraciones y claves
$stamp = Get-Date -Format "yyyyMMdd-HHmmss"
$bkRoot = "C:\Backup\OpenSSH-$stamp"
New-Item -ItemType Directory -Path $bkRoot -Force | Out-Null

Copy-Item -Recurse -Force "C:\ProgramData\ssh" "\$bkRoot\ProgramData-ssh" -ErrorAction SilentlyContinue
Copy-Item -Recurse -Force "C:\Program Files\OpenSSH" "\$bkRoot\ProgramFiles-OpenSSH" -ErrorAction SilentlyContinue

Exporta ACLs por si necesitas revertir

icacls "C:\ProgramData\ssh" /save "\$bkRoot\ProgramData-ssh.acl" /t 

Adicionalmente:

  • Confirma el puerto: Verifica que el 22 esté libre o documenta si usas otro (netstat -ano | findstr :22).
  • Reglas de firewall: Asegura una regla entrante para el puerto SSH que uses.
  • Antivirus/EDR: Excluye temporalmente la ruta de instalación si tu EDR bloquea nuevos binarios firmados.
  • Control de cambios: Registra un plan de reversión y una ventana de impacto.

Descarga y preparación del paquete

Obtén el ZIP del proyecto Win32‑OpenSSH (edición de 64 bits). El nombre suele ser OpenSSH-Win64.zip. Copia el ZIP al servidor y prepara los archivos:

# Carpeta de destino recomendada
$dest = "C:\Program Files\OpenSSH"

Desbloquea el ZIP si viene de Internet (marca MOTW)

Unblock-File -Path "C:\Temp\OpenSSH-Win64.zip"

Extrae y reemplaza el contenido

Expand-Archive -Path "C:\Temp\OpenSSH-Win64.zip" -DestinationPath \$dest -Force

Permite ejecutar los scripts de instalación

Get-ChildItem "\$dest\*.ps1" | Unblock-File

Añade o asegura la ruta en el PATH del sistema

\$systemPath = \[Environment]::GetEnvironmentVariable("Path","Machine")
if (\$systemPath -notlike "\$dest") {
\[Environment]::SetEnvironmentVariable("Path", "\$systemPath;\$dest", "Machine")
} 

Consejo: evita rutas diferentes (por ejemplo, C:\Windows\System32\OpenSSH) a menos que se trate de una instalación anterior documentada. Tener dos carpetas con binarios distintos genera confusión en el PATH y puede ejecutar una versión diferente a la esperada.

Instalación y actualización de los servicios

Si ya tienes una versión instalada, detén servicios, instala la nueva y genera claves de host si faltan. A continuación, configura arranque automático y verifica:

# Detén los servicios existentes (ignora errores si no existen)
Stop-Service sshd -ErrorAction SilentlyContinue
Stop-Service ssh-agent -ErrorAction SilentlyContinue

(Opcional) Desinstala servicios antiguos si migras entre rutas

if (Test-Path "\$dest\uninstall-sshd.ps1") {
& "\$dest\uninstall-sshd.ps1"
}

Instala los servicios de la nueva versión

powershell -ExecutionPolicy Bypass -File "\$dest\install-sshd.ps1"

Genera claves de host si no existen

& "\$dest\ssh-keygen.exe" -A

Arranque automático y puesta en marcha

Set-Service sshd -StartupType Automatic
Start-Service sshd

Comprobaciones básicas

ssh -V
Get-Service sshd
where ssh 

Verificación posterior a la actualización

  • Versión: Ejecuta ssh -V y verifica la ruta con where ssh. Comprueba que apunte a C:\Program Files\OpenSSH\.
  • Servicio en escucha: netstat -ano | findstr :22 (o el puerto configurado) debe mostrar LISTENING.
  • Prueba local: ssh localhost (y cancela con Ctrl+C al pedir credenciales si no tienes claves aún).
  • Validación de configuración: sshd -t -f "C:\ProgramData\ssh\sshd_config" para detectar errores sintácticos.
  • Visor de eventos: revisa Applications and Services Logs → OpenSSH → Operational y, si existe, C:\ProgramData\ssh\logs\.

Configuración recomendada

Después de actualizar, refuerza sshd_config. El siguiente ejemplo prioriza claves modernas y SFTP funcional en Windows:

# Ruta: C:\ProgramData\ssh\sshd_config

Puerto por defecto (ajusta si necesitas otro)

Port 22

Claves de host (se crean con ssh-keygen -A)

HostKey PROGRAMDATA/ssh/ssh\host\ed25519\_key
HostKey PROGRAMDATA/ssh/ssh\host\ecdsa\_key

Mantén RSA solo si lo necesitas y firma con SHA-2

HostKey PROGRAMDATA/ssh/ssh\host\rsa\_key

Algoritmos y autenticación

KexAlgorithms curve25519-sha256,[curve25519-sha256@libssh.org](mailto:curve25519-sha256@libssh.org)
HostKeyAlgorithms ssh-ed25519,ecdsa-sha2-nistp256,rsa-sha2-512,rsa-sha2-256
PubkeyAcceptedAlgorithms ssh-ed25519,ecdsa-sha2-nistp256,rsa-sha2-512,rsa-sha2-256
PubkeyAuthentication yes

Considera desactivar contraseñas en producción si ya usas claves

PasswordAuthentication no

SFTP en Windows (servidor externo, no internal-sftp)

Subsystem sftp sftp-server.exe

Endurecimiento adicional

PermitRootLogin no
ChallengeResponseAuthentication no
UseDNS no
AllowTcpForwarding no
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2

Autorización de administradores (archivo especial en Windows)

Match Group administrators
AuthorizedKeysFile PROGRAMDATA/ssh/administrators\authorized\keys 

Permisos de archivos: en Windows, las ACL importan. Si la autenticación por clave pública falla, corrige permisos:

# Archivo de claves de administradores
icacls "C:\ProgramData\ssh\administratorsauthorizedkeys" /inheritance:r /grant "Administrators:F" /grant SYSTEM:F

Scripts de utilidades incluidos en la distribución

& "C:\Program Files\OpenSSH\FixHostFilePermissions.ps1" -Confirm:\$false
& "C:\Program Files\OpenSSH\FixUserFilePermissions.ps1" -Confirm:\$false 

Tabla de rutas y archivos clave

ElementoRuta o comandoDescripción
BinariosC:\Program Files\OpenSSH\Contiene ssh.exe, sshd.exe, sftp-server.exe y scripts .ps1
ConfiguraciónC:\ProgramData\ssh\sshd_configArchivo principal del servidor
Claves de hostC:\ProgramData\ssh\sshhost*Identidad del servidor; se generan con ssh-keygen -A
Claves de adminsC:\ProgramData\ssh\administratorsauthorizedkeysAutoriza claves públicas para el grupo Administrators
Serviciossshd, ssh-agentAdministrables con Get-Service, Stop-Service, Start-Service
Versiónssh -V, where sshConfirma versión y ruta efectiva del ejecutable
LogsVisor de eventos → OpenSSH, y C:\ProgramData\ssh\logs\Diagnóstico y auditoría

Actualización con mínima interrupción

Para reducir riesgo, puedes probar la nueva versión en un puerto alternativo antes del corte:

  1. Copia sshdconfig a sshdconfig_test y cambia Port 2222.
  2. Ejecuta en consola: "C:\Program Files\OpenSSH\sshd.exe" -f "C:\ProgramData\ssh\sshdconfigtest" -D.
  3. Conéctate desde otro equipo: ssh -p 2222 servidor.
  4. Si funciona, detén sshd de producción, instala/actualiza y arranca en el puerto definitivo.

Automatización con PowerShell

Script de instalación/actualización idempotente (ajusta rutas a tu entorno):

param(
  [string]$ZipPath = "C:\Temp\OpenSSH-Win64.zip",
  [string]$Dest = "C:\Program Files\OpenSSH"
)

Write-Host "Preparando actualización de OpenSSH..." -ForegroundColor Cyan

Copia de seguridad

\$stamp = Get-Date -Format "yyyyMMdd-HHmmss"
\$bkRoot = "C:\Backup\OpenSSH-\$stamp"
New-Item -ItemType Directory -Path \$bkRoot -Force | Out-Null
Copy-Item -Recurse -Force "C:\ProgramData\ssh" "\$bkRoot\ProgramData-ssh" -ErrorAction SilentlyContinue
Copy-Item -Recurse -Force \$Dest "\$bkRoot\ProgramFiles-OpenSSH" -ErrorAction SilentlyContinue

Desbloqueo, extracción y PATH

Unblock-File -Path \$ZipPath
Expand-Archive -Path \$ZipPath -DestinationPath \$Dest -Force
Get-ChildItem "\$Dest\*.ps1" | Unblock-File
\$systemPath = \[Environment]::GetEnvironmentVariable("Path","Machine")
if (\$systemPath -notlike "\$Dest") {
\[Environment]::SetEnvironmentVariable("Path", "\$systemPath;\$Dest", "Machine")
}

Detención, instalación y claves

Stop-Service sshd -ErrorAction SilentlyContinue
Stop-Service ssh-agent -ErrorAction SilentlyContinue
if (Test-Path "\$Dest\uninstall-sshd.ps1") { & "\$Dest\uninstall-sshd.ps1" }
powershell -ExecutionPolicy Bypass -File "\$Dest\install-sshd.ps1"
& "\$Dest\ssh-keygen.exe" -A

Arranque y comprobaciones

Set-Service sshd -StartupType Automatic
Start-Service sshd

Write-Host "Versión: \$(ssh -V)" -ForegroundColor Green
where ssh 

Solución de problemas frecuentes

  • El servicio no inicia: ejecuta sshd -t para validar la sintaxis del archivo. Revisa permisos de sshd_config y las claves de host. Comprueba el registro de eventos y, si procede, el log en C:\ProgramData\ssh\logs.
  • Autenticación por clave falla: corrige ACLs con FixUserFilePermissions.ps1 y asegúrate de que authorized_keys pertenece al usuario y no tiene herencia abierta.
  • Puerto ocupado: verifica con netstat -ano qué proceso usa el puerto y cámbialo temporalmente en sshd_config o libera el puerto.
  • Conflicto de rutas: si where ssh devuelve múltiples resultados, ajusta el PATH del sistema para que C:\Program Files\OpenSSH tenga prioridad y elimina restos antiguos.
  • Algoritmos obsoletos: versiones recientes deshabilitan firmas SHA‑1. Migra a claves ed25519 o ECDSA y aplica rsa-sha2-256/512 si mantienes RSA.
  • Entorno en modo FIPS: si el sistema aplica FIPS, usa el paquete compatible si está disponible. Si no, considera RSA/ECDSA en lugar de ed25519 según tus políticas.
  • EDR bloquea binarios: agrega exclusiones temporales para sshd.exe y ssh.exe durante la actualización.

Reversión y limpieza

Si algo sale mal, puedes volver a la versión anterior:

  1. Detén sshd y ssh-agent.
  2. Restaura las carpetas de C:\Program Files\OpenSSH y C:\ProgramData\ssh desde la copia de seguridad.
  3. Ejecuta de nuevo install-sshd.ps1, genera claves si faltan y arranca el servicio.
  4. Confirma la versión y comprueba la conectividad.

Preguntas y respuestas prácticas

¿Se puede “forzar” la 9.8? No, salvo que exista un build oficial para Windows que empaquete esa versión o que la compiles tú mismo. El flujo normal es esperar a la publicación de Win32‑OpenSSH para Windows y, entonces, actualizar.

¿Hace falta reiniciar todo el servidor? No. Solo reinicias servicios sshd y, si procede, ssh-agent.

¿Server Core es compatible? Sí. La instalación basada en ZIP y scripts funciona en Server Core; únicamente necesitas PowerShell y permisos de administrador.

¿Cliente y servidor vienen juntos? Sí. El ZIP incluye herramientas cliente (ssh.exe, scp.exe, sftp.exe) y servidor (sshd.exe).

¿Qué pasa si la versión más reciente todavía no alcanza la 9.8? Puedes instalar la más reciente disponible. Si necesitas estrictamente la 9.8 por una exigencia regulatoria o de compatibilidad, valora compilar desde fuente en un entorno controlado (no recomendado para producción sin un proceso de firma, pruebas y validación estrictos).

Guía paso a paso resumida

  1. Respaldar C:\ProgramData\ssh y C:\Program Files\OpenSSH.
  2. Descargar OpenSSH‑Win64.zip y extraer en C:\Program Files\OpenSSH.
  3. Detener servicios existentes (sshd, ssh-agent).
  4. Instalar con install-sshd.ps1 y generar claves (ssh-keygen -A).
  5. Configurar sshd_config con algoritmos seguros y SFTP.
  6. Arrancar sshd en automático y verificar con ssh -V y pruebas de conexión.

Notas prácticas finales

  • Antes de actualizar, haz copia de seguridad del sshd_config y de las claves de host.
  • Comprueba el firewall (regla entrante TCP 22 o el puerto que uses).
  • Si necesitas estrictamente la 9.8, espera a un release oficial de Win32‑OpenSSH para Windows o compila tú mismo. En producción, prioriza los binarios oficiales.

Comandos esenciales de referencia

# Detener servicios existentes
Stop-Service sshd -ErrorAction SilentlyContinue
Stop-Service ssh-agent -ErrorAction SilentlyContinue

Desinstalar (opcional) e instalar servicios nuevos

& "C:\Program Files\OpenSSH\uninstall-sshd.ps1"   # si existe
powershell -ExecutionPolicy Bypass -File "C:\Program Files\OpenSSH\install-sshd.ps1"

Generar claves de host si no existen

& "C:\Program Files\OpenSSH\ssh-keygen.exe" -A

Arranque automático y verificación

Set-Service sshd -StartupType Automatic
Start-Service sshd
ssh -V 

Con este procedimiento tendrás un camino claro para actualizar OpenSSH en Windows Server 2016 a la versión para Windows más reciente disponible, con buenas prácticas de seguridad y una ruta de reversión preparada.

Resumen ejecutivo: En este sistema, OpenSSH se administra como una aplicación de terceros: descarga del ZIP oficial de Win32‑OpenSSH, extracción en la ruta de programa, registro de servicios, generación de claves y verificación. No es viable “forzar” una versión para Windows que no tiene binarios publicados; la alternativa es compilarla, lo que no es recomendable para producción sin un proceso de ingeniería y QA formal.

Si bien el objetivo era alcanzar la 9.8, el resultado correcto y seguro es moverse siempre a la última compilación oficial disponible para Windows y reforzar configuraciones y permisos tras la actualización.

Índice