将 PuTTY/ppk 私钥加载到 Paramiko 时出现“base64 解码错误:填充不正确”

Posted

技术标签:

【中文标题】将 PuTTY/ppk 私钥加载到 Paramiko 时出现“base64 解码错误:填充不正确”【英文标题】:"base64 decoding error: Incorrect padding" when loading PuTTY/ppk private key to Paramiko 【发布时间】:2019-01-28 01:45:57 【问题描述】:

我正在尝试在 Windows 10 上使用 paramikoSSHTunnelForwarder 创建 SSH 隧道

我已经与 PuTTY 建立了连接,并且连接没有问题..

每当我尝试与paramiko 建立连接时,我都会收到以下错误:

paramiko.ssh_exception.SSHException:base64 解码错误:不正确的填充

我尝试在开头和结尾使用 === ===... 填充 RSA 密钥(在示例中,1 x = 位于末尾,而 %4 == 0 ..

我也尝试过传入pem 文件和ppk 版本。

如何让 paramiko 接受密钥??

import paramiko
from io import StringIO

KEY = """-----BEGIN RSA PRIVATE KEY-----
AAABAQCHzDV+UbIfYV3IlpW6nTMSutC9IpDw7GYbTwctfaMfdckZLEIvbQY56Q7p
Dd8O0lAt74s6zqylJK8enCKzMKcZG09OZFy0agj7uXONh5vi00sa+vs3YnosxQwZ
QA4fYSVaGfTacHB00v0gYcjMqSaQs13nUM+dtn5xnDpKgS195OXy7XKEOIeip0al
QsTB1NbXualOJMREh+3MZC/uj56znvvTCTIjfpCbJkHIvYdrj4GXAom8e3bw8Uzl
ltWJiFXT2pJ31kkFfAjYyle/NpK01ISxDQP3y9F8YuObNVkSlppAYfj/rxHP+hfZ
LeHBQL9jM/Ok+7vBcwoQ1dynKvStAAAAgQDYGxL2O98peWp34lz0TbK86iGdOy0p
ZpcmuvjkmTgdQC/h16AZI5zwloHCO15jicsKU8Hzxf9SJw46R9jwXwIgWWM09HND
OTFQB+gnJQmVp5mO4Un2CIkVVyrnG9y/M9mXCKyxQY8YU7HGaE11iJCvpr9Q53GX
xjxT86Yk/y+s7QAAAIEAugCHIjSOFoNVssD4K3sDLFoP82cXgM7JaqnmeUZ780aw
rpvOFN1snUdY4sbTl+uln1SjvjHWLbWz4qsylsVwBVEDOqyXGcpJUMdnRJ4Y0Pjn
YOaC9tWO3dB936ITNMzPJuAJENJcRk4E3NdUx0n0ZUEflJwUxRSVXFeQutmTi0I8A
AACBALrWGeM7XrcJFJz+cw8p4nNDSRuZgBlDgSquqkEJ0cma7mGCUnq1gFy282LX
pFIDWuuhyERdSy0x1D5UMx34pbQg51MmjOrcMqfG0HpcR0Q/fHE0LVQc6bTCfCvN
sR9oHllLYJguW/Su2EsajM5PmniW0b+kMA51CPIXdPBDWtAQ=
-----END PRIVATE KEY-----"""

private_key_file = StringIO()
private_key_file.write(KEY)
private_key_file.seek(0)

print('\n\nlen(KEY)%4 ==', len(KEY)%4)
print()

mypkey = paramiko.RSAKey.from_private_key(private_key_file)

完整的追溯:

len(KEY)%4 == 0

Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\paramiko\pkey.py", line 306, in _read_private_key
data = decodebytes(b(''.join(lines[start:end])))
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\base64.py", line 553, in decodebytes
return binascii.a2b_base64(s)
binascii.Error: Incorrect padding

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "d:/GIT/Production_apps/deploy_data_files/connect_tosql.py", line 37, in <module>
mypkey = paramiko.RSAKey.from_private_key(private_key_file)
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\paramiko\pkey.py", line 227, in from_private_key
key = cls(file_obj=file_obj, password=password)
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\paramiko\rsakey.py", line 45, in __init__
self._from_private_key(file_obj, password)
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\paramiko\rsakey.py", line 173, in _from_private_key
data = self._read_private_key('RSA', file_obj, password)
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\paramiko\pkey.py", line 308, in _read_private_key
raise SSHException('base64 decoding error: ' + str(e))
paramiko.ssh_exception.SSHException: base64 decoding error: Incorrect padding

(出于安全原因,我更改了密钥中的一些随机字节,但长度和错误是相同的)

这是我在 PuTTY 中使用的 ppk 文件:

PuTTY-User-Key-File-2: ssh-rsa
Encryption: none
Comment: user_1@computer
Public-Lines: 6
AAAAB3NzaC1yc2EAAAABJQAAAQEAnQQd2g519EiUb+4dH8XDDagBWq/3lpFWD5Ng
TJlEnGAwhRsshtYPMvV5PXgJ6SMstRz4+/73nvJqe2SIHzBBNQeTsqQLMJqaYw5t
m6TMPkRO1zIyeAndQ8PV/TIQVEhTMGuZKJICBxP0rXEQLKOUl09kk3VwDlsCM1yj
ZiVcmZI7/Hyk2U6c0NGUUmpTSNQBraA8ZJ8tJJ28WTM1S4ogBpBjn3DP+hPlZI7h
Ek0gCc6XfwChOcRBY1kd3IHuC3fI51so+5ohcdILCflhODmAQZapNIP5dJudX3sd
6WWi/ibgQycJ+43Nricn0JxVDRzdOViJo2ZuA0Bte0wihVwoYw==
Private-Lines: 14
AAABAQCHzDV+UbIfYV3IlpW6nTMSutC9IpDw7GYbTwctfaMfdckZLEIvbQY56Q7p
Dd8O0lAt74s6zqylJK8enCKzMKcZG09OZFy0agj7uXONh5vi00sa+vs3YnosxQwZ
QA4fYSVaTzhacHB00v0gYcjMqSaQs13nUM+dtn5xnDpKgS195OXy7XKEOIeip0al
QsTB1NbXualOJMREh+3MZC/uj56znvvTCTIjfpCbJkHIvYdrj4GXAom8e3bw8Uzl
ltWJiFXT2pJ31kkFfAjYyle/NpK01ISxDQP3y9F8YuObNVkSlppAYfj/rxHP+hfZ
LeHBQL9jM/Ok+7vBcwoQ1dynKvStAAAAgQDYGxL2O98peWp34lz0TbK86iGdOy0p
ZpcmuvjkmTgdQC/h16AZI5zw6dHCO15jicsKU8Hzxf9SJw46R9jwXwIgWWM09HND
OTFQB+gnJQmVp5mO4Un2CIkVVyrnG9y/M9mXCKyxQY8YU7HGaE11iJCvpr9Q53GX
xjxT86Yk/y+s7QAAAIEAugCHIjSOFoNVssD4K3sDLFoP82cXgM7JaqnmeUZ780aw
rpvOFN1snUdY4sbTl+uln1SjvjHWLbWz4qsylsVwBVEDOqyXGcpJUMdnRJ4Y0Pjn
YOaC9tWO3dB936ITNMzPJuAJENJcR8H8NdUx0n0ZUEflJwUxRSVXFeQutmTi0I8A
AACBALrWGeM7XrcJFJz+cw8p4nNDSRuZgBlDgSquqkEJ0cma7mGCUnq1gFy282LX
pFIDWuuhyERdSy0x1D5UMx34pbQg51MmjOrcMqfG0HpcR0Q/fHE0LVQc6bTCfCvN
sR9oHllLYJguW/Su2EsajM5PmniW0b+kNA51CPIXdPBDWtAQ
Private-MAC: d44d6ad6590c05c04eb78770be16ee5e11f0802e

【问题讨论】:

你的钥匙错了。如果我将您的密钥字符串放入一个文件并尝试使用任何密钥工具(PuTTYgen、ssh-keygen)加载它,它就不起作用。相反,如果我生成一个新密钥,您的代码可以毫无问题地加载它。 @MartinPrikryl 我确实更改了该键的几个字符,如果我弄坏了它,我深表歉意。我使用的钥匙适用于腻子。您可以使用适合您的密钥编辑我的问题,以便我可以尝试吗? 我不必添加u(我认为只在python 2.7中)但密钥确实有效..我使用的密钥是用腻子生成的..当我尝试传入时整个文件(不仅仅是私钥'。我得到一个paramiko.ssh_exception.SSHException: not a valid RSA private key file 您的密钥有效!我已包含用于连接 PuTTY 的 PuTTY ppk 文件 【参考方案1】:

Paramiko 仅支持 OpenSSH 密钥格式。

您不能只使用 PuTTY 格式的密钥文件并添加 OpenSSH “标头”。这不会使密钥采用 OpenSSH 格式。

使用 PuTTYgen 将 PuTTY 密钥转换为 OpenSSH 密钥(转换 > 导出 OpenSSH 密钥)。

【讨论】:

以上是关于将 PuTTY/ppk 私钥加载到 Paramiko 时出现“base64 解码错误:填充不正确”的主要内容,如果未能解决你的问题,请参考以下文章

尝试加载证书的私钥时出现“指定的提供程序类型无效”CryptographicException

如何将 OpenSSL ECDSA 密钥加载到 C# 中?

Perl 和 .NET RSA 一起工作?从 Perl 公钥在 .NET 中加密?从 Perl 加载私钥?

无法加载私钥

在 Java 中加载 RSA 私钥(algid 解析错误,不是序列)

如何从 .key 文件加载私钥