下記処理を実行した際に、hoge2サーバーでは接続が行えたにもかかわらず、hoge1サーバーでは次のエラーが発生し接続が行えませんでした。
エラー内容
# client.connect(look_for_keys=False)なし
Exception has occurred: PasswordRequiredException
private key file is encrypted
# client.connect(look_for_keys=False)あり
Exception has occurred: SSHException
encountered RSA key, expected OPENSSH key
※ client.connect(look_for_keys=False)
を設定すると認証に失敗した際のエラーメッセージがより正確になるらしい。参考
実行コード
import paramiko
IP = '10.22.33.123'
PORT = '22'
USER = 'centos'
KEY_FILE = '/Users/user/.ssh/mykey.pem'
client = paramiko.SSHClient()
# Are you sure you want to continue connecting (yes/no)? 対応
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(IP, PORT, USER, pkey=rsa_key, timeout=5.0, look_for_keys=False)
stdin, stdout, stderr = ssh.exec_command(ls -l ')
原因
接続先サーバー側でsha1アルゴリズムが使用されていたため。
(sha1が使われていたのは、おそらくOpenSSHのバージョンが古いのが原因)
$ # hoge1サーバー(sha1)
$ ssh-keygen -lf ~/.ssh/authorized_keys
2048 SHA256:J7g4d2bhfn7I1/ufnvBiOqrccmjxggPf8Cd4aPOsTr8 centos@xxx (RSA)
$ # hoge2サーバー(sha2)
$ ssh-keygen -lf ~/.ssh/authorized_keys
2048 6b:8f:8f:12:b0:4a:ee:c5:83:b1:ac:cd:12:aa:ee:21 centos@xxx(RSA)
対応
client.connect
関数に引数disabled_algorithms=dict(pubkeys=['rsa-sha2-256', 'rsa-sha2-512'])
を追加する
import paramiko
IP = '10.22.33.123'
PORT = '22'
USER = 'centos'
KEY_FILE = '/Users/user/.ssh/mykey.pem'
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(IP, PORT, USER, KEY_FILE, timeout=5.0, look_for_keys=False,
disabled_algorithms=dict(pubkeys=['rsa-sha2-256', 'rsa-sha2-512']))
# ↑ 処理を追加
stdin, stdout, stderr = ssh.exec_command(ls -l ')