如何使用 ppk 公钥通过 python Paramiko 进行 ssh 连接
Posted
技术标签:
【中文标题】如何使用 ppk 公钥通过 python Paramiko 进行 ssh 连接【英文标题】:How to ssh connect through python Paramiko with ppk public key 【发布时间】:2012-01-13 01:08:48 【问题描述】:我正在使用Paramiko 通过 ssh 连接到服务器。
基本身份验证运行良好,但我不明白如何使用公钥连接。
当我连接 putty 时,服务器会告诉我:
Using username "root".
Authenticating with public key "rsa-key@ddddd.com"
Passphrase for key "rsa-key@ddddd.com": [i've inserted the passphrase here]
Last login: Mon Dec 5 09:25:18 2011 from ...
我用这个 ppk 文件连接到它:
PuTTY-User-Key-File-2: ssh-rsa
Encryption: aes256-cbc
Comment: rsa-key@dddd.com
Public-Lines: 4
[4 lines key]
Private-Lines: 8
[8 lines key]
Private-MAC: [hash]
使用基本身份验证,我得到的错误(来自日志)是:
DEB [20111205-09:48:44.328] thr=1 paramiko.transport: userauth is OK
DEB [20111205-09:48:44.927] thr=1 paramiko.transport: Authentication type (password) not permitted.
DEB [20111205-09:48:44.927] thr=1 paramiko.transport: Allowed methods: ['publickey', 'gssapi-with-mic']
我尝试包含该 ppk 文件并设置为 auth_public_key,但没有成功。
你能帮帮我吗?
【问题讨论】:
paramiko 使用 openssh 格式的密钥。由于密钥是加密的,因此您还需要先解密密钥。使用 ssh-agent 会让事情变得更容易,paramiko 可以自动检查代理密钥。 【参考方案1】:好的,@Adam 和@Kimvais 是对的,Paramiko 无法解析 .ppk 文件。
所以要走的路(也感谢@JimB)是将 .ppk 文件转换为 OpenSSH 私钥格式;这可以使用PuTTYgen 来实现,如here 所述。
那么连接起来就很简单了:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('<hostname>', username='<username>', password='<password>', key_filename='<path/to/openssh-private-key-file>')
stdin, stdout, stderr = ssh.exec_command('ls')
print stdout.readlines()
ssh.close()
【讨论】:
强制警告:不要使用AutoAddPolicy
,除非您不关心安全性。这样你就失去了对 MITM 攻击的保护。有关正确的解决方案,请参阅***.com/q/10670217/850848#43093883。【参考方案2】:
对我来说,我这样做:
import paramiko
hostname = 'my hostname or IP'
myuser = 'the user to ssh connect'
mySSHK = '/path/to/sshkey.pub'
sshcon = paramiko.SSHClient() # will create the object
sshcon.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # no known_hosts error
sshcon.connect(hostname, username=myuser, key_filename=mySSHK) # no passwd needed
很适合我
【讨论】:
这不是公钥,是私钥。 确实,“key_filename”字段需要私钥。使用 OpenSSH 公钥,程序会发出此异常:paramiko.ssh_exception.SSHException: not a valid OPENSSH private key file 如果您有 RSA 密钥对的密码,则像这样连接 ssh.connect('在 Puttygen 中创建 Paramiko 支持的有效 DSA 格式私钥。
点击转换然后导出 OpenSSH 密钥
【讨论】:
【参考方案4】:@VonC 对(已删除)重复问题的回答:
如果如评论所述,Paraminko 不支持 PPK 密钥,则官方解决方案(如此处所示)将使用 PuTTYgen。
但您也可以使用Python library CkSshKey 直接在您的程序中进行相同的转换。
见“Convert PuTTY Private Key (ppk) to OpenSSH (pem)”
import sys import chilkat key = chilkat.CkSshKey() # Load an unencrypted or encrypted PuTTY private key. # If your PuTTY private key is encrypted, set the Password # property before calling FromPuttyPrivateKey. # If your PuTTY private key is not encrypted, it makes no diffference # if Password is set or not set. key.put_Password("secret") # First load the .ppk file into a string: keyStr = key.loadText("putty_private_key.ppk") # Import into the SSH key object: success = key.FromPuttyPrivateKey(keyStr) if (success != True): print(key.lastErrorText()) sys.exit() # Convert to an encrypted or unencrypted OpenSSH key. # First demonstrate converting to an unencrypted OpenSSH key bEncrypt = False unencryptedKeyStr = key.toOpenSshPrivateKey(bEncrypt) success = key.SaveText(unencryptedKeyStr,"unencrypted_openssh.pem") if (success != True): print(key.lastErrorText()) sys.exit()
【讨论】:
以上是关于如何使用 ppk 公钥通过 python Paramiko 进行 ssh 连接的主要内容,如果未能解决你的问题,请参考以下文章
在 Mac 终端中使用 PPK 文件通过 SSH 连接到远程连接 [关闭]