HopToDesk vs RustDesk
Au départ il y avait TeamViewer, leader de la prise de main à distance, à défaut d'en être l'inventeur (souvenez-vous de pcAnywhere en 1986). Comme tous les leaders ils imposent leurs tarifs, et ça pique de plus en plus ! A ses cotés il y a AnyDesk, un peu moins cher mais qui aimerait bien prendre la place de khalife et probablement ajuster ses prix. Il y a plein d'autres solutions plus ou moins connues et performantes, mais ce sont ces deux là qui dominent le marché.
Lors de la période Covid ces applications ont pris une autre dimension et d'aucuns s'en sont servi pour mettre en place le travail à distance de façon plus que de déployer des passerelles RDP.
Et c'est à cette époque qu'à émergé RustDesk. J'en avais parlé, j'y croyais et j'ai déployé un serveur privé dans sa version professionnelle (payante) afin d'assurer le support de mes clients et des clients de mes collègues. Bref, replacer Teamviewer et et diviser la facture par dix. Depuis ils ont doublé leurs tarifs, mais ça reste très raisonnable. RustDesk c'est une équipe de barbus très axés sur la sécurité, on ne leur reprochera pas, la contrepartie étant qu'ils prennent bien moins en compte l'expérience utilisateur.
Il y a deux façons d'utiliser Rustdesk. Avec un serveur privé et des clients verrouillés sur ce serveur, ou avec leurs serveurs public, le serveur privé pouvait alors servir d'annuaire centralisé tant pour des clients verrouillés que des clients public. Pour faire simple on installe un logiciel client verrouillé sur les machines distantes sous contrat de services et on assure la sécurité via le serveur privé, alors qu'on installe occasionnellement des clients publics dans un contexte plus léger.
Problème, depuis le début de l'année le logiciel client verrouillé sur le serveur privé ne peut plus joindre un client public. Pour se connecter à un client distant public il faut au préalable que le logiciel soit connecté à un compte GitHub, Microsoft ou Google. Si on est très loin de s'éloigner des GAFAM's, c'est entrée ou dessert car un même client ne peut pas en même temps faire partie d'un réseau privé et se connecter à un GAFAM. De plus je ne vois pas ce que cette authentification imposée, mais non gérée, apporte en matière de sécurité si ce n'est collecter quelques datas. Avec le temps je pensait (naïvement) que l'équipe de Rustdesk aurait trouvé une solution dans l'élégance, mais les barbus se contentent de rappeler que RustDesk est fait pour être utilisé avec un serveur privé sans apporter de solution mixte. De là à penser qu'ils veulent surtout vendre des licences... Bref, beaucoup de frustration et de temps perdu.
Alternative
Quand on a déployé une telle solution il est très difficile d'en sortir facilement. Ca impose de trouver une alternative, de la valider et de la déployer. Autant dire que même si je valide la solution dont je vais vous parler, les deux solutions vont cohabiter longtemps et que je devrais supporter les frais inerrants à chacune.
HopToDesk
HopToDesk est un fork de RustDesk. Pour faire simple ça veut dire qu'au départ ils ont utilisé le code open source de RustDesk. Dans la pratique c'est fait pour et c'est une des bases de l'open source, mais il y a des règles et usages à respecter, et au vu des polémiques d'alors (2023), je ne suis pas certain que ça se soit passé dans la sérénité. Aujourd'hui mon contact chez HopToDesk m'assure que tout cela est de l'histoire ancienne et que tout va bien.
De fait HopToDesk est open source et il est également possible d'installer un serveur privé. L'approche retenue est surtout orientée vers l'expérience utilisateur avec un tableau de bord web très professionnel qui concentre toutes les fonctionnalités. Ainsi il n'y a pas d'annuaire partagé et synchronisable au niveau du client comme le propose RustDesk, mais un tableau de bord en ligne. C'est ce tableau de bord qui permet le lancement d'une session, soit dans une fenêtre du navigateur (plus lent), soit en lançant le client (plus rapide) s'il est installé. C'est aussi sur ce tableau de bord dont l'usage est facturé que repose le modèle économique.
A noter que le client reste open source et que rien n'empêche un client de joindre une autre machine sans passer par le tableau de bord, et dans ce cas là tout reste gratuit. Pour les astucieux et curieux, sachez qu'il est possible de gérer un petit annuaire local, voire de le transférer ou le synchroniser d'une machine à une autre (peers.json), le fichier qui contient les mots de passe (HopToDesk.toml) est lui chiffré avec la clé locale du host, donc non exportable.
De même il est possible d'installer l'infrastructure (signal/relais) sur son propre serveur sur lequel viendra se greffer le tableau de bord qui reste hébergé par l'éditeur. Une telle configuration n'est toutefois pas totalement privée et souveraine, mais ils y travaillent, conscients des enjeux du moment.

invitations et déploiement
HopToDesk permet de générer des clients personnalisés avec l'identité visuelle de l'entreprise et dispose d'un système de déploiement évolué dans sa version entreprise (que je n'ai volontairement pas trop testée pour rester en mode SMB). Pour ma part je trouve surtout intéressant les liens d'invitation qui vont permettre à un opérateur de facilement déployer le client à la volée lors d'un contact d'assistance. C'est très pratique et ça permet d'assister très rapidement un client. Depuis la console il est également possible de copier un script PowerShell, les options des clients se configurant depuis la console avec des stratégies d'appareils.
Et en mode Open Source ?
Pour ceux qui gèrent un home lab ou un groupe d'amis le superbe dashboard de HopToDesk impose une (grosse) limitation à 3 clients dans sa version gratuite. Trop restrictif et quand on rends service à des amis on n'a pas non plus envie de payer pour ça.
On va donc perdre tout ce qu'apporte de tableau de bord et simplement demander à son contact de télécharger et lance le client HopToDesk et de nous donner l'ID et le mot de passe temporaire. Simple et gratuit.
Par contre si on souhaite installer HopToDesk sur plusieurs machines, j'en ai quelques unes dans mon home lab, on peut également faire (ou plutôt demander à une IA de faire) un petit script PowerShell qui va installer le client, générer un mot de passe aléatoire et nous fournir l'URI idoine.
Cliquez ici pour voir un exemple de code
# ===== Config =====
$ScriptUrl = "https://ton-serveur.tld/install-hoptodesk.ps1"
$InstallerUrl = "https://www.hoptodesk.com/hoptodesk.exe"
$PasswordLength = 16
# ===== Auto-elevation =====
$isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not $isAdmin) {
Start-Process powershell -Verb RunAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"irm '$ScriptUrl' | iex`""
exit
}
$ErrorActionPreference = "Stop"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# ===== Generation du mot de passe =====
$script:rng = [Security.Cryptography.RandomNumberGenerator]::Create()
function Get-RandomIndex([int]$max) {
$b = New-Object byte[] 4
$script:rng.GetBytes($b)
return [int]([BitConverter]::ToUInt32($b, 0) % [uint32]$max)
}
function Get-RandomChar([char[]]$set) {
return $set[(Get-RandomIndex $set.Length)]
}
function New-RandomPassword([int]$length) {
$upper = [char[]]'ABCDEFGHJKLMNPQRSTUVWXYZ'
$lower = [char[]]'abcdefghijkmnopqrstuvwxyz'
$digits = [char[]]'23456789'
$symbols = [char[]]'+-#@'
$all = $upper + $lower + $digits + $symbols
# Au moins 1 caractere de chaque type, le reste aleatoire
$chars = New-Object System.Collections.Generic.List[char]
$chars.Add((Get-RandomChar $upper))
$chars.Add((Get-RandomChar $lower))
$chars.Add((Get-RandomChar $digits))
$chars.Add((Get-RandomChar $symbols))
while ($chars.Count -lt $length) { $chars.Add((Get-RandomChar $all)) }
# Melange (Fisher-Yates)
for ($i = $chars.Count - 1; $i -gt 0; $i--) {
$j = Get-RandomIndex ($i + 1)
$tmp = $chars[$i]; $chars[$i] = $chars[$j]; $chars[$j] = $tmp
}
return -join $chars
}
# ===== Fonctions utilitaires =====
function Find-HopToDesk {
@("$env:ProgramFiles\HopToDesk\HopToDesk.exe",
"${env:ProgramFiles(x86)}\HopToDesk\HopToDesk.exe") |
Where-Object { Test-Path $_ } | Select-Object -First 1
}
function Wait-ForInstall($seconds) {
for ($i = 0; $i -lt $seconds; $i++) {
$found = Find-HopToDesk
if ($found) { return $found }
Start-Sleep -Seconds 1
}
return $null
}
$password = New-RandomPassword $PasswordLength
# ===== Telechargement =====
$installer = Join-Path $env:TEMP "hoptodesk-setup.exe"
Write-Host "[*] Telechargement de HopToDesk..." -ForegroundColor Cyan
Invoke-WebRequest -Uri $InstallerUrl -OutFile $installer -UseBasicParsing
# ===== Installation =====
$exe = Find-HopToDesk
if (-not $exe) {
foreach ($arg in @("--silent-install", "/S")) {
Write-Host "[*] Installation ($arg)..." -ForegroundColor Cyan
Start-Process -FilePath $installer -ArgumentList $arg | Out-Null
$exe = Wait-ForInstall 90
if ($exe) { break }
Write-Host "[!] Pas d'installation detectee avec $arg" -ForegroundColor Yellow
}
}
if (-not $exe) { throw "HopToDesk.exe introuvable apres installation." }
Write-Host "[*] Installe : $exe" -ForegroundColor Cyan
Start-Sleep -Seconds 5
# ===== Service =====
Get-Service -Name "*HopToDesk*" -ErrorAction SilentlyContinue |
Where-Object Status -ne 'Running' | Start-Service -ErrorAction SilentlyContinue
# ===== Mot de passe =====
Write-Host "[*] Configuration du mot de passe..." -ForegroundColor Cyan
$p = Start-Process -FilePath $exe -ArgumentList "--password", $password -PassThru -WindowStyle Hidden
if (-not $p.WaitForExit(20000)) { $p | Stop-Process -Force -ErrorAction SilentlyContinue }
# ===== Recuperation de l'ID =====
Write-Host "[*] Recuperation de l'ID..." -ForegroundColor Cyan
$id = $null
$tmp = Join-Path $env:TEMP "htd_id.txt"
for ($i = 0; $i -lt 10 -and -not $id; $i++) {
$p = Start-Process -FilePath $exe -ArgumentList "--get-id" -PassThru -WindowStyle Hidden `
-RedirectStandardOutput $tmp
if (-not $p.WaitForExit(10000)) { $p | Stop-Process -Force -ErrorAction SilentlyContinue }
$out = Get-Content $tmp -Raw -ErrorAction SilentlyContinue
if ($out -match '\d{6,}') { $id = ($out -replace '\D','') }
else { Start-Sleep -Seconds 3 }
}
Remove-Item $tmp -Force -ErrorAction SilentlyContinue
if (-not $id) {
$id = Read-Host "ID non detecte automatiquement, saisis-le (visible dans la fenetre HopToDesk)"
}
# ===== Resultat =====
$uri = "hoptodesk://connect/$id/$password"
$uriEnc = "hoptodesk://connect/$id/" + [uri]::EscapeDataString($password)
Set-Clipboard -Value $uri
Write-Host ""
Write-Host "================ RESULTAT ================" -ForegroundColor Green
Write-Host " ID : $id"
Write-Host " Password : $password"
Write-Host " URI : $uri" -ForegroundColor Yellow
Write-Host " (copiee dans le presse-papiers)"
Write-Host ""
Write-Host " URI encodee (si le lien ci-dessus ne passe pas) :"
Write-Host " $uriEnc"
Write-Host "==========================================" -ForegroundColor Green
Remove-Item $installer -Force -ErrorAction SilentlyContinue
Read-Host "Appuie sur Entree pour fermer"
Il suffit ensuite de lancer ce script en local ou de l'héberger sur un NAS ou un serveur HTTPS et de lancer :
Appuyez sur Win + R pour ouvrir la fenêtre Exécuter .
powershell -NoProfile -ExecutionPolicy Bypass -Command "irm "https://ton-serveur.tld/install-hoptodesk.ps1 | iex"Ce qui retournera les informations, dont l'URI de connexion (à condition que les client HopToDesk soit présent sur la machine locale :
ID : 123456789
Password : 7Zkdshshshjjjj@S454545j
URI : hoptodesk://connect/123456789/7Zkdshshshjjjj@S454545j
(copié dans le presse-papiers)Il sera bien sur possible d'améliorer ce code afin d'aller modifier les options dans les fichiers de configuration (.toml), modifications qui seront prises en compte lors du prochain lancement. Attention, dans ce chapitre on bricole et on expérimente, cette utilisation est à vos risques.
Tickets
Des lors que l'on a déployé un client via une invitation ou le code idoine qui permet de l'associer à notre compte, celui ci peut également créer des tickets d'incidents qui seront gérés dans le tableau de bord et assignés aux différents opérateurs qui recevront un e-mail. Un formulaire personnalisable est également proposé. C'est un plus pour de petites structures qui ne disposent pas d'un tel système.
IA et automatisations.
Bien sur il y a de l'IA intégrée ainsi qu'une API MCP afin d'y connecter d'autres outils IA. Ce ne sont franchement pas ces fonctionnalités, pas plus que les automatisations intégrées qui me feront choisir ce produit car je n'en ai pas l'usage. Il n'en reste pas moins que dans certains contextes d'entreprise cela peut être un vrai plus.
Sécurité
Côté tableau de bord, les mots de passe de compte sont hachés (PBKDF2) et ne sont donc jamais stockés en clair. Si un administrateur choisit d'enregistrer le mot de passe de connexion d'un appareil, celui-ci est chiffré au repos (AES-GCM) et n'est déchiffré que pour un utilisateur autorisé. Ils précisent que c'est une action volontaire de la part de l'utilisateur qui ne sera jamais automatique, il n'en reste pas moins que ça fait partie de l'intérêt d'un tel tableau de bord de ne pas avoir à aller chercher le mot de passe quand on en a besoin, et surtout de ne pas avoir à la confier à un collaborateur éphémère...
Afin d'assurer plus de sécurité, deux options supplémentaires sont à activer. L'authentification à deux facteurs (2FA), et surtout les restrictions d'IP, restriction d'IP qui ne s'applique pour l'instant qu'au seul tableau de bord. En mode Entreprise il est possible de restreindre l'accès au client distant au seul dashboard. Ce qui veut dire qu'il ne sera pas accessible directement, et ce même si on dispose de son ID et mot de passe.
Ne pas proposer la restriction par IP de l'accès aux clients, c'est tôt ou tard s'exposer potentiellement au évènements (piratage, accès non autorisés) qui ont conduit Rustdesk à passer en mode panique et imposer une authentification GAFAM pour l'utilisateur de leur réseau public. Si une telle restriction était possible, il serait alors possible de router les connections via une passerelle privée ou un VPN.
Versions et tarification
Il existe 3 niveaux de tarification ainsi qu'une tarification personnalisée destinée aux grosses entreprises. Les paliers viennent d'évoluer, ainsi au delà de la version gratuite qui ne servira pas à grand chose, la version Pro couvre les aspects sécurité là ou les paliers suivant apportent des option de production et d'exploitation qui vont bien au delà de la simple prise de contrôle à distance.
- Free : accès aux fonctions de base uniquement pour un seul utilisateur et seulement 3 appareils connectés. Ce niveau pourrait convenir pour une utilisation personnelle de type Home Lab, mais la restriction à 3 appareil n'en fait qu'une solution de démonstration.
- Pro : avec 120 appareils gérables (jusqu'à 350) c'est la solution qui pourrait convenir à de petites sociétés de service informatique. La solution pour les petite sociétés de service.
- Business : Ici la majorité des restrictions sautent, mais le tarif est en rapport, tout en restant bien plus accessible que les leaders du marché, et sans options à tiroirs !
- Enterprise & MSP : Tarification à la demande pour les fournisseurs de services gérés et les organisations ayant des exigences d'achat, de revue de sécurité ou de volume. On est largement au delà du périmètre de cet article.
Souveraineté
Si installer son propre serveur garanti une certaine souveraineté, l'utilisation du tableau de bord reste une solution cloud hébergée sur des serveurs répartis entre les États-Unis et l'Europe. HopToDesk est édité par Begonia Holdings LLC (Wyoming, États-Unis. La juridiction légale qui régit le service, ses conditions d'utilisation et sa politique de confidentialité dépend donc directement du droit américain. Étant soumis au droit américain, HopToDesk tombe sous le coup de législations comme le Cloud Act.
Même si les flux de prise en main sont chiffrés de bout en bout (E2EE), si la conformité stricte au RGPD ou la souveraineté totale des données est un impératif, il faudra qu'ils fassent quelques progrès, et ils en sont conscients.
Précision de l'éditeur sur la Région UE
Lors de la création du compte, on peut choisir maintenant choisir l'Union Européenne comme région de données. Le compte est alors servi sur eu.dashboard.hoptodesk.com, et ses données de compte, d'appareils, de tickets et de configuration, y compris le stockage de fichiers et les sauvegardes chiffrées, sont stockées uniquement sur une infrastructure sous juridiction de l'UE. Un compte de cette région peut aussi sélectionner le « Réseau HopToDesk (UE uniquement) » dans les paramètres du tableau de bord : ses appareils qui exécutent l'application Windows, macOS ou Linux actuelle utilisent alors uniquement un serveur de signalisation en Allemagne et des serveurs de relais dans l'Union européenne. Voir les détails de sécurité, Data Protection et le DPA.
Conclusion
Le produit est francisé, il fonctionne bien et répond à pas mal de problématiques tout en incluant la base des fonctionnalités de Rustdesk avec une approche facile et très orientée utilisateur.. Il est encore jeune et mes échanges avec leur support ont permis de corriger pas de points et même d'obtenir rapidement des améliorations, preuve d'une équipe attentive aux souhaits de leurs clients. A voir sur la durée, mais globalement je suis plutôt confiant.