When working with encrypted RSA private keys, developers often encounter two distinct error patterns:
// Classic bad passphrase error
openssl rsa -in encrypted.key
Enter pass phrase for encrypted.key:
unable to load Private Key
error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
// The more puzzling ASN1 error
openssl rsa -in encrypted.key
Enter pass phrase for encrypted.key:
unable to load Private Key
error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long
error:0D068066:asn1 encoding routines:ASN1_CHECK_TLEN:bad object header
The ASN1 header errors typically indicate one of several scenarios:
- The key file is corrupted (partial or malformed)
- The encryption format doesn't match what OpenSSL expects
- The key was generated with non-standard parameters
First, verify your key's basic structure:
file id_rsa
# Should return something like:
# id_rsa: PEM RSA private key
For a more thorough check:
openssl asn1parse -in id_rsa
# This helps identify where the ASN1 parsing fails
Option 1: Try alternative OpenSSL commands
# For PKCS#8 format
openssl pkcs8 -in id_rsa -topk8 -out id_rsa.decrypted
# For traditional PEM
openssl rsa -in id_rsa -out id_rsa.decrypted -traditional
Option 2: Reconstruct the key header
If the key has malformed headers, try adding standard PEM boundaries:
-----BEGIN RSA PRIVATE KEY-----
[your base64 key data]
-----END RSA PRIVATE KEY-----
When standard methods fail, consider these approaches:
# Attempt to extract raw ASN1 data
openssl asn1parse -in id_rsa -dump -strict
# Try parsing with different versions of OpenSSL
openssl1.0 rsa -in id_rsa -out id_rsa.decrypted
# Use ssh-keygen as an alternative
ssh-keygen -p -f id_rsa -m PEM
Remember that key corruption might require recreating the keypair if recovery attempts fail.
- Always back up keys in multiple formats (PEM, PKCS8, DER)
- Verify keys immediately after generation
- Consider using key management systems for critical infrastructure
When dealing with encrypted RSA private keys, we typically encounter two distinct error patterns:
# Classic bad passphrase error
openssl rsa -in encrypted.key
Enter pass phrase for encrypted.key:
unable to load Private Key
140256774473360:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
# The more puzzling ASN1 error
openssl rsa -in encrypted.key
Enter pass phrase for encrypted.key:
unable to load Private Key
139662870623888:error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long
Before attempting fixes, verify the key's basic structure:
# Check if the file contains BEGIN/END markers
grep -e "BEGIN" -e "END" id_rsa
# Verify basic ASN1 structure
openssl asn1parse -in id_rsa
The "header too long" ASN1 error typically indicates:
- File corruption during transfer (especially FTP in binary/text mode issues)
- Improper key generation using non-standard tools
- Mixed line endings in the key file
- Incomplete key data (partial transfers)
1. File Sanitization
First ensure proper file formatting:
# Convert DOS to Unix line endings
dos2unix id_rsa
# Remove any trailing whitespace
sed -i 's/[[:space:]]*$//' id_rsa
2. Alternative Decryption Methods
Try different OpenSSL command variants:
# Traditional RSA format
openssl rsa -in id_rsa -out decrypted.key
# PKCS8 format attempt
openssl pkcs8 -topk8 -in id_rsa -out decrypted.key -nocrypt
# Force PEM encoding
openssl rsa -in id_rsa -outform PEM -out decrypted.key
3. Key Reconstruction
If standard methods fail, extract components manually:
# Extract encrypted PEM payload
sed -n '/BEGIN/,/END/p' id_rsa > payload.pem
# Base64 decode the content
openssl base64 -d -in payload.pem -out payload.bin
# Analyze binary structure
hexdump -C payload.bin | head -20
For severely corrupted keys, consider:
# Brute-force ASN1 parsing with different offsets
for i in {0..10}; do
dd if=id_rsa of=trimmed.key bs=1 skip=$i
openssl rsa -in trimmed.key -check 2>/dev/null && break
done
- Always generate keys with standard tools:
ssh-keygen -t rsa -b 4096
- Use armored format when transferring keys:
gpg --armor --export-secret-key
- Verify checksums after transfer:
sha256sum id_rsa