¿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.
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 conwhere ssh
. Comprueba que apunte aC:\Program Files\OpenSSH\
. - Servicio en escucha:
netstat -ano | findstr :22
(o el puerto configurado) debe mostrar LISTENING. - Prueba local:
ssh localhost
(y cancela conCtrl+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
Elemento | Ruta o comando | Descripción |
---|---|---|
Binarios | C:\Program Files\OpenSSH\ | Contiene ssh.exe , sshd.exe , sftp-server.exe y scripts .ps1 |
Configuración | C:\ProgramData\ssh\sshd_config | Archivo principal del servidor |
Claves de host | C:\ProgramData\ssh\sshhost* | Identidad del servidor; se generan con ssh-keygen -A |
Claves de admins | C:\ProgramData\ssh\administratorsauthorizedkeys | Autoriza claves públicas para el grupo Administrators |
Servicios | sshd , ssh-agent | Administrables con Get-Service , Stop-Service , Start-Service |
Versión | ssh -V , where ssh | Confirma versión y ruta efectiva del ejecutable |
Logs | Visor 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:
- Copia
sshdconfig
asshdconfig_test
y cambiaPort 2222
. - Ejecuta en consola:
"C:\Program Files\OpenSSH\sshd.exe" -f "C:\ProgramData\ssh\sshdconfigtest" -D
. - Conéctate desde otro equipo:
ssh -p 2222 servidor
. - 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 desshd_config
y las claves de host. Comprueba el registro de eventos y, si procede, el log enC:\ProgramData\ssh\logs
. - Autenticación por clave falla: corrige ACLs con
FixUserFilePermissions.ps1
y asegúrate de queauthorized_keys
pertenece al usuario y no tiene herencia abierta. - Puerto ocupado: verifica con
netstat -ano
qué proceso usa el puerto y cámbialo temporalmente ensshd_config
o libera el puerto. - Conflicto de rutas: si
where ssh
devuelve múltiples resultados, ajusta el PATH del sistema para queC:\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
yssh.exe
durante la actualización.
Reversión y limpieza
Si algo sale mal, puedes volver a la versión anterior:
- Detén
sshd
yssh-agent
. - Restaura las carpetas de
C:\Program Files\OpenSSH
yC:\ProgramData\ssh
desde la copia de seguridad. - Ejecuta de nuevo
install-sshd.ps1
, genera claves si faltan y arranca el servicio. - 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
- Respaldar
C:\ProgramData\ssh
yC:\Program Files\OpenSSH
. - Descargar
OpenSSH‑Win64.zip
y extraer enC:\Program Files\OpenSSH
. - Detener servicios existentes (
sshd
,ssh-agent
). - Instalar con
install-sshd.ps1
y generar claves (ssh-keygen -A
). - Configurar
sshd_config
con algoritmos seguros y SFTP. - Arrancar
sshd
en automático y verificar conssh -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.