diff --git a/windows/panels/Catalog.ps1 b/windows/panels/Catalog.ps1 index 32042ca..58d6c06 100644 --- a/windows/panels/Catalog.ps1 +++ b/windows/panels/Catalog.ps1 @@ -81,7 +81,7 @@ function Get-PanelRegistryPlan($Record, [string]$KeyPath) { $entry = ConvertTo-PanelSession $Record if ([string]::IsNullOrWhiteSpace($KeyPath) -or $KeyPath -match '[\x00-\x1f]') { throw 'Select your existing private key file.' } return [pscustomobject]@{ - Strings=@{HostName=$entry.HostName; Protocol='ssh'; UserName=$entry.UserName; PublicKeyFile=$KeyPath; PortForwardings=('L127.0.0.1:' + $entry.LocalPort + '=127.0.0.1:' + $entry.RemotePort)} + Strings=@{HostName=$entry.HostName; Protocol='ssh'; UserName=$entry.UserName; PublicKeyFile=$KeyPath; SSHManualHostKeys=$entry.Fingerprint; PortForwardings=('L127.0.0.1:' + $entry.LocalPort + '=127.0.0.1:' + $entry.RemotePort)} Numbers=@{PortNumber=$entry.PortNumber; LocalPortAcceptAll=0; RemotePortAcceptAll=0; SshNoShell=1; PingInterval=0; PingIntervalSecs=30; TCPKeepalives=1; AgentFwd=0; GssapiFwd=0; ProxyMethod=0; LogType=0} Arguments=('-load ' + $entry.Name + ' -N -hostkey ' + $entry.Fingerprint) PanelUrl=('http://127.0.0.1:' + $entry.LocalPort + $entry.PanelPath) diff --git a/windows/panels/README.txt b/windows/panels/README.txt index 56a5e84..080db85 100644 --- a/windows/panels/README.txt +++ b/windows/panels/README.txt @@ -1,4 +1,4 @@ -Панели 3x-ui: общий установщик сессий PuTTY для Windows +Панели 3x-ui: общий установщик сессий PuTTY для Windows БЫСТРОЕ НАЧАЛО 1. Распакуйте ZIP целиком в отдельную папку. Не запускайте файл внутри ZIP. @@ -51,9 +51,9 @@ connections.example.json — только шаблон. Его адрес и о Для восстановления сессии импортируйте соответствующий *-previous.reg; старый ярлык скопируйте из той же backup-папки на рабочий стол. Остальные серверы не переустанавливаются. Если установка остановится, окно покажет уже установленные записи и папку резервных копий. -Ярлык PuTTY передаёт -hostkey с точным отпечатком и открывает forwarding только на127.0.0.1. -При ручном запуске сохранённой сессии из самого PuTTY также сверяйте host key; -не нажимайте Accept при неожиданной смене ключа. Туннель использует удалённый127.0.0.1. +Проверенный отпечаток сохраняется в сессии PuTTY и передаётся ярлыком через -hostkey. +Предыдущий список разрешённых ручных ключей этой сессии заменяется точным отпечатком. +Forwarding слушает только 127.0.0.1. При смене ключа проверьте его в консоли сервера. Туннель использует удалённый127.0.0.1. Если локальный порт занят, закройте прежнее окно туннеля этой панели либо выберите другой порт. Система с корпоративным запретом PowerShell/WinForms может блокировать запуск: общие ограничения безопасности установщик не отключает. diff --git a/windows/panels/Test-Catalog.ps1 b/windows/panels/Test-Catalog.ps1 index 12b4934..702d817 100644 --- a/windows/panels/Test-Catalog.ps1 +++ b/windows/panels/Test-Catalog.ps1 @@ -53,6 +53,7 @@ $plan=Get-PanelRegistryPlan $catalog.Sessions[2] $key Assert-Panel ($plan.Strings.PublicKeyFile -ceq $key) 'Key path with spaces must remain data.' Assert-Panel ($plan.Strings.PortForwardings -ceq 'L127.0.0.1:18055=127.0.0.1:2053') 'Tunnel must bind loopback and target remote loopback.' Assert-Panel ($plan.Numbers.LocalPortAcceptAll -eq 0 -and $plan.Numbers.AgentFwd -eq 0 -and $plan.Numbers.ProxyMethod -eq 0) 'Unsafe forwarding/proxy settings.' +Assert-Panel ($plan.Strings.SSHManualHostKeys -ceq $catalog.Sessions[2].Fingerprint) 'Saved session must replace any previous manual host key allowlist.' Assert-Panel ($plan.Arguments -ceq ('-load KAgent-DK-panel -N -hostkey SHA256:'+('A'*43))) 'Shortcut must pin the exact host key.' Assert-Panel ($plan.PanelUrl -ceq 'http://127.0.0.1:18055/private-panel/') 'Browser URL must stay loopback.' Expect-Rejection { Get-PanelRegistryPlan $ru '' } 'Missing key path must be rejected.'