我正在尝试使用 Paramiko 连接到 SFTP 站点。
"paramiko": {
"hashes": [
"sha256:6bef55b882c9d130f8015b9a26f4bd93f710e90fe7478b9dcc810304e79b3cd8",
"sha256:fedc9b1dd43bc1d45f67f1ceca10bc336605427a46dcdf8dec6bfea3edf57965"
],
"index": "pypi",
"version": "==3.0.0"
},
我有一个表单中的 .pem 文件
-----BEGIN OPENSSH PRIVATE KEY-----
data for the key
-----END OPENSSH PRIVATE KEY-----
值得一提的是,密钥是用密码加密的。
我尝试加载密钥文件,提供密码,效果很好
# Works great :)
mykey = paramiko.RSAKey.from_private_key_file(key_file_path, password=password)
self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# this explodes
self.ssh_client.connect(hostname=settings.ftp_host, username=username, pkey=mykey, port=22)
self.ftp = self.ssh_client.open_sftp()
paramiko.ssh_exception.PasswordRequiredException:私钥文件已加密
如果我将连接更改为
self.ssh_client.connect(hostname=settings.ftp_host, username=username, pkey=mykey, port=22, passphrase=password)
paramiko.ssh_exception.SSHException:OpenSSH 私钥文件检查不匹配
如果我尝试使用
key_filename
而不是 pkey
self.ssh_client.connect(hostname=settings.ftp_host, username=username, key_filename=key_file_path, port=22, passphrase=password)
ValueError:q 的长度必须恰好为 160、224 或 256 位
我能够使用 FileZilla 使用此密钥成功连接到 SFTP,我只是不确定我在 Paramiko 中做错了什么。
今天解决了这个问题。
我设置了 Paramiko 的日志记录,发现它默认尝试使用“rsa-sha2-512”
2023-02-16 10:01:46 - DEBUG - transport.py:1871 - paramiko.transport - _log() - Our pubkey algorithm list: ['rsa-sha2-512', 'rsa-sha2-256', 'ssh-rsa']
2023-02-16 10:01:46 - DEBUG - transport.py:1871 - paramiko.transport - _log() - Server did not send a server-sig-algs list; defaulting to our first preferred algo ('rsa-sha2-512')
禁用“rsa-sha2-512”和“rsa-sha2-256”,使 Paramiko 被迫使用“ssh-rsa”解决了该问题。
self.ssh_client.connect(hostname=settings.ftp_host, username=username, pkey=mykey, disabled_algorithms=dict(pubkeys=["rsa-sha2-512", "rsa-sha2-256"]))