Browser-based SSH toolkit for developers, students, and sysadmins. It generates
SSH keys, hardened sshd_config files, client-side ~/.ssh/config entries, and
SSH tunnel commands.
Everything runs in the browser. There is no backend, no database, no cookies, no analytics, and no tracking. Sensitive SSH data should never leave the user's machine.
Live site: https://sshtoolkit.otaviomiranda.com.br
| Tool | Route | Purpose |
|---|---|---|
| Tunnel Builder | /tunnels |
Build SSH tunnel commands with visual diagrams. |
| Server Hardening | /hardening |
Generate hardened sshd_config output with presets and a security score. |
| Client Config | /config |
Build, import, preview, copy, and download ~/.ssh/config entries. |
| Key Generator | /keygen |
Generate Ed25519 and RSA key pairs with Web Crypto. |
- Static Astro site. The browser is the runtime.
- No API calls are needed for any tool.
- No user SSH key, config, hostname, command, or generated file is sent to a server by the app.
- The generated output is shown locally and can be copied or downloaded from the browser.
- You can verify this by opening DevTools and checking the Network tab while using the tools.
The Client Config tool builds a ~/.ssh/config file from editable host cards.
Each card can be collapsed, removed, reordered with drag-and-drop, copied through
the final output, and included in a downloaded config file.
Supported basic fields:
HostHostNameUserPortIdentityFileProxyJump
Supported advanced fields:
ForwardAgentIdentitiesOnlyAddKeysToAgentHostKeyAliasStrictHostKeyCheckingUserKnownHostsFileLogLevelIgnoreUnknownRequestTTYServerAliveIntervalServerAliveCountMaxLocalForwardRemoteForwardSendEnvSetEnvRemoteCommandExitOnForwardFailure
Generation behavior:
- Empty values are omitted.
Port 22is omitted because it is the SSH default.ForwardAgentandExitOnForwardFailureare emitted asyesornowhen set.RequestTTY autois omitted because it is the default UI state.- Multiline fields emit one directive per non-empty line.
- Unknown imported directives are preserved and emitted through
extraOptions.
Import behavior:
- The import modal accepts an existing
~/.ssh/configpasted as text. Key valueandKey=valuesyntax are both accepted.- Blank lines and comments are ignored.
- Lines before the first
Hostblock are ignored. - Known directives populate dedicated fields.
- Unknown directives, for example
CanonicalizeHostname yesandConnectTimeout 10, are preserved as extra options.
The current Client Config workflow includes a practical ProxyJump recipe and preview helpers for bastion/private-host setups.
Click the Receita ProxyJump prática card on /config to load:
Host bastion
HostName bastion.example.com
User deploy
IdentityFile ~/.ssh/id_ed25519
Host prod-db
HostName 10.0.10.20
User deploy
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ProxyJump bastion
HostKeyAlias prod-db-privateExpected visible behavior:
- Both
bastionandprod-dbhost cards are created and opened. - The
prod-dbcard shows the visual chainVocê -> bastion -> prod-db. - The generated config keeps
IdentitiesOnly yes,ProxyJump bastion, andHostKeyAlias prod-db-private. - ProxyJump command previews appear for
prod-db. - Copy buttons work for the final config and each generated preview.
Expected command previews from the recipe:
ssh prod-db
ssh -J bastion -i ~/.ssh/id_ed25519 deploy@10.0.10.20
scp -o ProxyJump=bastion -i ~/.ssh/id_ed25519 ./local-file deploy@10.0.10.20:/remote/path/
rsync -av -e 'ssh -J bastion -i ~/.ssh/id_ed25519' ./local-file deploy@10.0.10.20:/remote/path/ProxyJump edge cases:
- A comma-separated value such as
bastion-edge,bastion-inneris rendered as separate hops in the chain. - The raw
ProxyJumpvalue is preserved in the generated config and in direct command previews. ProxyJump noneis preserved in the generated config, but it is treated as no active jump for chain visualization and command previews.- Nested jump-host aliases are resolved in the visual chain. For example, if
appjumps toinnerandinnerjumps toedge, the route is displayed asVocê -> edge -> inner -> app. - Circular jump-host references are guarded and marked in the chain.
- Command previews are hidden for wildcard, negated, comma-separated, or
multi-alias
Hostpatterns because those are not concrete SSH targets. - Preview commands are practical templates. Replace placeholder paths such as
./local-fileand/remote/path/before usingscporrsync.
The Tunnel Builder creates SSH commands, autossh commands, equivalent
~/.ssh/config blocks, and visual diagrams for tunnel direction.
Supported tunnel types:
- Local forward:
-L localPort:remoteHost:remotePort - Remote forward:
-R remotePort:localHost:localPort - Dynamic SOCKS proxy:
-D localPort
Supported SSH options:
- SSH server, optional user, optional non-default port.
- Optional private key through
-i. - Optional jump host through
-J. -Nfor no remote shell.-ffor background mode.-Cfor compression.ExitOnForwardFailure=yes.ServerAliveIntervalandServerAliveCountMax.- Multiple tunnels in a single command.
Use-case cards load examples for:
- Remote database access through a local forward.
- Exposing a local development server through a remote forward.
- Browsing through a remote SOCKS proxy.
The Server Hardening tool generates an sshd_config and an application script.
It is designed for review before copying the generated file to a server.
Presets:
- Paranoid: public-key-only defaults, root login disabled, forwarding disabled.
- Balanced: secure general-purpose defaults with TCP forwarding enabled.
- Permissive: lab/testing defaults with more features enabled.
Config areas:
- Authentication: port, root login, public key auth, password auth, keyboard-interactive auth, challenge-response auth, empty passwords, authentication methods, max auth tries, login grace time, and PAM.
- Access control:
AllowUsers,AllowGroups,DenyUsers, andDenyGroups. - Network:
ListenAddress,AddressFamily, client alive settings, andUseDNS. - Security: X11 forwarding, agent forwarding, TCP forwarding, stream local forwarding, gateway ports, tunnel permission, user environment, user RC, strict modes, session limits, startups, and log level.
- Banners:
PrintMotd,PrintLastLog, andBanner.
Review helpers:
- Security score from 0 to 100 with grade
AthroughF. - Warnings for dangerous, risky, or informational choices.
- Copy button for the generated
sshd_config. - Download button for
sshd_config. - Download button for
apply-sshd.sh, which backs up the current config, runssshd -t, and restarts the service when the generated config is valid.
The Key Generator creates SSH key pairs locally with the Web Crypto API.
Supported key types:
- Ed25519, recommended for modern systems.
- RSA 2048 for compatibility.
- RSA 4096 for RSA-specific setups that want a larger key.
Generated output:
- Private key.
- Public key.
- SHA256 fingerprint.
- Equivalent
ssh-keygencommand. ssh-copy-idinstall command.- File permission commands for
~/.ssh, private key, public key, andauthorized_keys.
Download behavior:
- Public key downloads as
id_ed25519.puborid_rsa.pub. - Private key downloads as
id_ed25519orid_rsa. - ZIP download includes the private key, public key, and
README.txtsetup instructions.
Important limitation:
- Generated keys are currently not encrypted with a passphrase. Protect the downloaded private key and never share it.
Use this checklist to review the current behavior before merging a PR.
git fetch origin
git switch codex/proxyjump-client-config-stack
npm install
npm test
npm run build
npm run dev -- --host 127.0.0.1 --port 4321Open http://127.0.0.1:4321/config/ and verify:
- Clicking
Receita ProxyJump práticacreatesbastionandprod-db. - The generated config matches the recipe shown in this README.
- The visual route is
Você -> bastion -> prod-db. - The
ssh,scp, andrsyncpreviews match the commands shown above. - Expanding advanced options on
prod-dbshowsIdentitiesOnly yesandHostKeyAlias prod-db-private. - Setting
ProxyJumptononekeepsProxyJump nonein the generated config and hides the visual chain and previews. - Setting
ProxyJumptobastion-edge,bastion-innerdisplays separate hop nodes and keeps the raw comma-separated value in the direct command preview. - Importing a host with
IdentitiesOnly,AddKeysToAgent,LogLevel,IgnoreUnknown,SendEnv,SetEnv,StrictHostKeyChecking,UserKnownHostsFile, andHostKeyAliasfills dedicated fields and regenerates them as first-class directives. - Adding an unrelated unknown option still preserves it in generated output.
- A wildcard host such as
*.prodcan keepProxyJumpin generated config, but does not show command previews.
Then spot-check the other routes:
/keygen: generate an Ed25519 key, verify fingerprint/public/private outputs, copy buttons, individual downloads, ZIP download, install command, and permission commands./hardening: switch each preset, verify score/warnings update, copy the generated config, and downloadsshd_configplusapply-sshd.sh./tunnels: load each use-case card, verify the diagram, SSH command,autosshcommand, equivalent config block, and copy buttons.
The current ProxyJump Client Config stack does not implement:
Matchblocks.- Bastion server hardening recipes.
PermitOpenor jump-only user generation.- Ansible previews.
- SFTP previews.
- Cloud-provider alternatives.
- MFA, SSO, RBAC, audit/session recording, or governance workflows.
- A site redesign.
- Backend services.
Requirements:
- Node.js >= 22.12.0
Commands:
npm install
npm run dev
npm test
npm run buildProject stack:
- Astro 6.x
- TypeScript 5.x
- Web Crypto API
- fflate for ZIP generation
- Vitest
- GitHub Pages
Otavio Miranda - otaviomiranda.com.br