SSH Key WorksWith FileZilla: Not PuTTY

Abstract: Resolve PuTTY authentication failures after Raspberry Pi Bullseye upgrade by converting OpenSSH keys to PPK format.

Created: 2026-08-16 by
SSH keys function in FileZilla but fail in PuTTY after a Raspberry Pi upgrade to Bullseye because the two clients interpret OpenSSH-formatted private keys differently. FileZilla uses libssh, which natively supports the modern OpenSSH key format, whereas PuTTY requires conversion to its proprietary PPK format via PuTTYgen. This incompatibility often surfaces during OS upgrades where default SSH configurations or key generation methods change, leading to authentication errors specifically within the Windows-based PuTTY client while SFTP tools continue to work seamlessly.

Understanding the Key Format Discrepancy

The core issue lies in how SSH keys are stored and interpreted. When you generate an SSH key pair on a Linux system (like your Raspberry Pi) using standard tools like ssh-keygen, the private key is saved in the OpenSSH format by default. This format typically begins with -----BEGIN OPENSSH PRIVATE KEY-----. FileZilla, particularly versions running on Windows, utilizes the libssh library for its SFTP functionality. The libssh library is designed to be highly compatible with standard OpenSSH implementations, meaning it can read and use these modern key files directly without any additional steps. This is why your connection works perfectly when configuring the Site Manager in FileZilla under the "Logon Type" set to "Key file". PuTTY, however, operates on a different architecture. It does not use libssh as its primary engine for key handling in the same way. Instead, PuTTY expects private keys to be in its own proprietary .ppk (PuTTY Private Key) format. If you point PuTTY’s Pageant agent or the Connection > SSH > Auth settings to a raw OpenSSH-format key file, PuTTY will often reject it silently or throw an error such as "Unable to open key file" or "Invalid key format." This discrepancy becomes more apparent after a Raspberry Pi OS upgrade to Bullseye, as newer versions of OpenSSH may enforce stricter security defaults or change the default key storage locations, making the format mismatch more obvious if users haven't previously converted their keys.

Converting Your Key for PuTTY Compatibility

To resolve this, you must convert your existing OpenSSH private key into a PuTTY-compatible .ppk file. You do not need to generate a new key pair on the Raspberry Pi; you only need to transform the existing private key that already works with FileZilla. You will need the puttygen.exe utility, which is included in the standard PuTTY installation package. Follow these steps:
  1. Launch PuTTYgen: Open the Start menu and search for "PuTTYgen" or navigate to the directory where you installed PuTTY.
  2. Load the Existing Key: In the PuTTYgen window, click the Load button. By default, PuTTYgen might not show OpenSSH key files. Change the file type dropdown at the bottom from "PuTTY SSH-2 Keys" to "All Files" or "OpenSSH Private-Key Files".
  3. Select the Key File: Browse to the location of your Raspberry Pi private key (usually found in C:\Users\\.ssh\id_rsa or wherever you copied it from the Pi). Select the file and click Open.
  4. Save the New Key: Once loaded, PuTTYgen will parse the key and display the key fingerprint. Click Save private key. You will likely receive a warning about saving the key in unencrypted format; confirm this unless you wish to add a passphrase. Save the file with a .ppk extension (e.g., rpi_bullseye.ppk).
This new .ppk file is now compatible with PuTTY. You can discard the old method of trying to load the raw key file into PuTTY.

Configuring PuTTY to Use the Converted Key

With the .ppk file created, you need to ensure PuTTY uses it for authentication. Unlike FileZilla, which stores the key path in the site profile, PuTTY handles keys through the Pageant agent or direct session settings. Option A: Using Session Settings (Recommended for Single Connections) 1. Open PuTTY and enter your Raspberry Pi's IP address in the "Host Name" field. 2. Navigate to Connection > SSH > Auth in the left-hand category tree. 3. Under "Private key file for authentication," click Browse and select your newly created .ppk file. 4. Return to the Session category and save this configuration with a name (e.g., "Raspberry Pi Bullseye") so you don't have to reconfigure it every time. Option B: Using Pageant (For Multiple Sessions) If you frequently connect to multiple servers, loading the key into Pageant is more efficient. 1. Ensure Pageant is running (it usually runs in the system tray). 2. Right-click the Pageant icon in the taskbar and select Add Key. 3. Select your .ppk file. 4. Now, any PuTTY session configured to use SSH authentication will automatically try the key loaded in Pageant. You still need to ensure the correct username is specified in the Session settings under Connection > Data.

Raspberry Pi Bullseye Specific Considerations

The upgrade to Raspberry Pi OS Bullseye introduced changes to the SSH server configuration (/etc/ssh/sshd_config). While most default settings remain backward compatible, it is worth verifying that public key authentication is enabled. Check the following lines in your sshd_config file on the Raspberry Pi:
  • PubkeyAuthentication yes
  • AuthorizedKeysFile .ssh/authorized_keys
Ensure that PubkeyAuthentication is set to yes. Also, verify that the permissions on the .ssh directory and the authorized_keys file are correct. The .ssh directory should be 700 (drwx------), and the authorized_keys file should be 600 (-rw-------). Incorrect permissions are a common cause of SSH key failures, especially after an OS upgrade where file ownership or permissions might have been reset or migrated incorrectly. If you recently moved your user account or home directory structure, ensure that the authorized_keys file contains the corresponding public key from your original key pair. You can verify the public key content by running cat ~/.ssh/id_rsa.pub on the Pi and comparing it to the key shown in PuTTYgen. For further assistance with related SSH configuration issues, you may find the following resources helpful: Raspberry Pi 5: Can't SSH as a PIServer via Public Key from Windows 10 discusses similar public key rejection scenarios on newer hardware. Additionally, Can't connect to SSH on a Raspberry PI provides broader troubleshooting steps for connectivity issues that may overlap with permission problems.

Frequently Asked Questions

Why did my SSH keys stop working after the Bullseye upgrade?

The upgrade likely changed default SSH configurations or key formats, exposing the incompatibility between PuTTY's expected PPK format and the standard OpenSSH format. FileZilla continued to work because its underlying library supports OpenSSH keys natively, masking the issue until you tried using PuTTY.

Can I use the same key file for both FileZilla and PuTTY without converting?

No, PuTTY cannot directly read OpenSSH-format private keys. You must convert the key using PuTTYgen to create a .ppk file. However, you can keep the original OpenSSH key for FileZilla and Linux command-line access, using the converted version only for Windows/PuTTY workflows.

Is it safe to save the converted PPK file without a passphrase?

It is less secure than using a passphrase, but it is a common practice for automated scripts or convenience. If security is a concern, add a passphrase during the "Save private key" step in PuTTYgen. Note that if you add a passphrase, Pageant will prompt you for it upon startup, or you must specify it in PuTTY's Auth settings depending on your setup.

What if PuTTYgen fails to load my key file?

Ensure you changed the file type filter in PuTTYgen from "PuTTY SSH-2 Keys" to "All Files" or "OpenSSH Private-Key Files." If it still fails, the key file might be corrupted or encrypted in a way PuTTYgen doesn't support. Try copying the key content to a new file and ensuring there are no extra characters or line breaks at the end of the file.

How do I check if my authorized_keys file is correct?

Run cat ~/.ssh/authorized_keys on the Raspberry Pi. The content should match the public key generated alongside your private key (usually ending in .pub). Ensure the file permissions are exactly 600 and the parent .ssh directory is 700 using chmod.

Latest News

How to Display Output of xterm Command in Terminal Screen using Cron

Resolve the inability to display xterm output in a terminal screen from cron by redirecting logs or using wall instead of insecure X11 workarounds.

Read More
Expose Local Server on VPS Preserving Real Client IPs (OS Level)

Resolve VPS logging showing only gateway IPs by configuring reverse proxies to forward real client addresses via X-Forwarded-For headers.

Read More
How to Clear Recent Files History in Linux without Deleting Actual Files?

Clear recent files history in Linux by deleting ~/.local/share/recently-used.xbel without removing the actual files.

Read More
Best HDD Copy Strategy: Manually Syncing and Rewriting Scratch

Resolve data drift between two 4TB hard drives by using rsync with the --delete flag to manually sync and rewrite scratch data for an exact mirror.

Read More
Understanding Bash Prompt Abbreviations: An Overview

Resolve repetitive typing errors by creating and persisting Bash aliases in the .bashrc file for improved command-line efficiency.

Read More
Free Tools and Methods to Log Real-Time Performance Details in Task Manager

Log real-time CPU and memory metrics to CSV files using Windows Performance Monitor Data Collector Sets to troubleshoot system slowness.

Read More
Contact Qatar Airways Customer Service: Phone Number, Help Center, and More

Resolve urgent Qatar Airways reservation issues like flight changes and baggage claims using the US phone number +1801-855-5905 or online self-service tools.

Read More
Windows 11: Alt Codes Displaying Wrong Characters - Solutions

Resolve Windows 11 Alt codes showing wrong characters by verifying the US keyboard layout and enabling Num Lock.

Read More
Run Programs with Elevated Privileges: A Comprehensive Guide

Eliminates the need to type sudo for frequent administrative tasks by configuring .bashrc aliases or functions.

Read More
Dynamically Changing Dates in Excel Formulas Using Cells

Eliminate manual date updates in Excel by using cell references to create dynamic formulas that automatically adjust calculations when input dates change.

Read More
Granting Edit Access to a Specific Excel Sheet in an Office 365 User Email ID-Based Login

Excel Online lacks native sheet-level permissions, so users must split workbooks or use worksheet protection to isolate edit access for specific tabs.

Read More
Creating Network Load on Local Wi-Fi from One PC

Generate sustained Wi-Fi bandwidth load from a single PC using a VM SFTP server to test router stability and throughput.

Read More
Changing the Default Editor for Batch Files in Windows 11's File Explorer

Resolve the issue of batch files opening in Notepad by changing the default editor to a preferred application like VS Code.

Read More
Gain WiFi Connection Minutes Before Losing it by Changing MAC Address

Bypass MAC address filtering to restore WiFi connectivity temporarily when a device is blocked by network administrators.

Read More
Photos Folders Turned Black: Troubleshooting Picture Applications on Windows

Resolve black screens in Windows Photos by resetting the app, updating graphics drivers, and repairing system files.

Read More
Troubleshooting High CPU Temperature Values: A Step-by-Step Guide

Resolve high CPU temperatures and thermal throttling by monitoring with Speedfan, cleaning dust from cooling components, and replacing degraded thermal paste.

Read More
Make cURL establish TLS connection with CA unknown

Resolve cURL TLS connection failures with unknown or self-signed certificates by using the --insecure flag to bypass CA validation.

Read More
Troubleshooting Incorrect Network Metrics Values in Grafana, Prometheus, InfluxDB, and Telegraf

Fix incorrect network metrics in Grafana, Prometheus, InfluxDB, and Telegraf by verifying interface selection, resolving unit mismatches, and handling counter resets.

Read More
Start Another Terminal Window (cmd.exe) Windows Repair/Troubleshoot

Provides step-by-step instructions to access the Windows Command Prompt via bootable media for advanced system repair and troubleshooting.

Read More
Thinkpad P1 Gen 6: Sudden Thunderbolt 3 Dock USB-C Charging Stopped Working

Resolve sudden Thunderbolt 3 dock USB-C charging and internet failure on ThinkPad P1 Gen 6 by updating firmware, resetting the dock, and adjusting power settings.

Read More
ASUS Windows 11 Laptop: Internet Connection Issue with Hotspot

Resolve ASUS Windows 11 laptop spinning wheel issue when connecting to mobile hotspot by resetting network stack, disabling IPv6, and adjusting power settings.

Read More
Developing iOS Project with Firebase: Logging in and Sending Push Notifications

Integrates Firebase to enable secure user authentication and push notifications in iOS applications.

Read More
Troubleshooting Bash Script with Suspected Issues of Spaces, Dashes, Filenames and Quoting

Resolve Bash script failures caused by word splitting, globbing, and special characters in filenames by applying proper quoting techniques.

Read More
Populating OneDrive Folder for Local Backup without Affecting Remote Files

Prevent OneDrive from deleting remote files during Windows reinstallation by unlinking the account or using symbolic links to isolate local data.

Read More
Force First Frame as Keyframe Without Re-encoding: A Quick Solution

Resolve inaccurate seeking and playback glitches by re-encoding video to ensure the first frame is a valid keyframe.

Read More
Find Information in Database Using WSL (Ubuntu) on Windows-10

Resolve database connection issues from WSL Ubuntu on Windows 10 by configuring client tools and network access to query remote or local servers.

Read More
Configuring a New Router with Different Networks: One Family, One Guest

Resolve IP conflicts and isolate guest traffic by configuring a second router with a distinct subnet via its WAN port.

Read More
Quickly Open Multiple Stock Websites with a Single Command

Solve the problem of manually opening multiple stock research websites by creating a single command to launch them simultaneously on Windows, macOS, or Linux.

Read More
Improved Adobe Acrobat Search Experience: Access Advanced Search with Ease

Access advanced search filters like case sensitivity and regex in Adobe Acrobat by clicking More Options in the Find bar.

Read More
Port Forwarding VM via OpenVPN: A Comprehensive Guide

Configure OpenVPN server and iptables to forward specific ports from VPN clients to a virtual machine's internal IP address.

Read More
Understanding Partitions in the 1980s: A Look Back at MS-DOS and Master Boot Record

Explains how the Master Boot Record and partition table enabled MS-DOS to manage multiple disk volumes on a single physical drive.

Read More
Windows 10 Enterprise: Keyboard Not Detected in Managed Organization with Admin Privileges

Resolve Windows 10 Enterprise keyboard detection failures caused by Group Policy restrictions, driver corruption, or USB enumeration errors.

Read More
Can't Find x86_64 Versions of Applications on MacOS arm64 (M1)

Resolve missing x86_64 app issues on M1 Macs by installing Rosetta 2 and reinstalling apps as universal binaries.

Read More
How to Hide Installation Source for an Android App

Manage Android app installation source visibility by using USB transfers or file managers to reduce browser traces and isolate data via work profiles.

Read More
Connecting Momentus 4200.2 ST9808210A Hard Drive via USB Cable

Resolve inability to access Seagate Momentus 4200.2 ST9808210A hard drive by connecting it via USB using a compatible SATA-to-USB adapter and configuring the disk in Windows.

Read More