如何在没有密码的情况下从 SSH2 到 OpenSSH 执行 SSH 和 SCP

在我们之前的文章中,我们讨论了如何设置基于 ssh 密钥的身份验证以在以下三种情况下执行 ssh 和 scp 无需密码:

  1. OpenSSH 到 OpenSSH
  2. OpenSSH 到 SSH2
  3. SSH2 到 SSH2

在本文中,我将解释如何在没有密码的情况下从 SSH2(本地主机)到 OpenSSH(远程主机)执行 ssh 和 scp。

1.识别本地主机和远程主机SSH版本

在此示例中,本地主机正在运行 SSH2,而远程主机正在运行 OpenSSH。

[zadmei.com@local-host]$ ssh -V
ssh: SSH Secure Shell 3.2.9.1 (non-commercial version) on i686-pc-linux-gnu

[zadmei.com@remote-host]$ ssh -V
OpenSSH_4.3p2, OpenSSL 0.9.8b 04 May 2006

2. 使用 ssh-keygen2 在本地主机上生成 SSH2 认证密钥对

在 SSH2 上,ssh-keygen 将是 ssh-keygen2 的软链接,如下所示。

[zadmei.com@local-host]$ ls -l /usr/local/bin/ssh-keygen
lrwxrwxrwx  1 root root 11 Jul 31  2006 /usr/local/bin/ssh-keygen -> ssh-keygen2

[zadmei.com@local-host]$ ssh-keygen
Generating 2048-bit dsa key pair
7 o.oOo..oOo.o
Key generated.
2048-bit dsa, zadmei@local-host, Sun Oct 19 2022 14:49:42 -0700
Passphrase : [Enter the password here]
Again      :
Private key saved to /home/zadmei/.ssh2/id_dsa_2048_a
Public key saved to /home/zadmei/.ssh2/id_dsa_2048_a.pub

公钥和私钥存储在主目录下的 .ssh2 文件夹中。 在本例中,它位于 /home/zadmei/.ssh2 下。

我们不应与任何人共享私钥

默认情况下 ssh-keygen2 生成 DSA(数字签名算法)密钥对。 我们还可以生成 RSA 密钥对,如下所示。

[zadmei.com@local-host]$ ssh-keygen -t rsa

3. 将 SSH2 公钥从本地主机复制到运行 OpenSSH 的远程主机

将本地主机: /home/zadmei/.ssh2/id_dsa_2048_a.pub 文件复制到远程主机: /home/zadmei/.ssh/id_dsa_1024_a.pub 。 在远程主机上执行 vi /home/zadmei/.ssh/id_dsa_1024_b.pub 并从本地主机复制公钥的内容。

[zadmei.com@remote-host]$ vi /home/jsmith/.ssh/id_dsa_1024_a.pub
---- BEGIN SSH2 PUBLIC KEY ----
Subject: jsmith
Comment: "2048-bit dsa, jsmith@local-host Sun Oct 19 2022 14:49:42 -070\0"
7ZTVd7H63VyVqBIqfmEBALVa6VKtALZkydlOiPasikEQfujH07tjW+OffaRufFDG0VQESj
5iGSvMtmBBj8wQxGlvJ/dayVqBvvHzMao8bwGC+HFUtH1un7uyIEwOqU1fNzEpghC97mIx
tIxJA7ZTVd7H63VIqmzlLbp/ZCd6bcJLvZEepMz96nlNB4NJ5UYIfdgXNhf/TrJD8COWQs
t6jsP6RG/WrpHi5iGSvMtmBBj8wQGHddexkRnf/o5YMFJZRo4Iwc7+bgYrIyywBZnfLL7T
RTk9TBfWzgJHy/y1tTtCMvVooWvFZbG5AiV3de63MxBaD0o68SASyXZzVM+MabXhjcdXFY
2vjq2vJxOzunEAAAAVAOTeOzDCnj3K5iGSvMtmBBj8wQGHAAABAA38sGpHEfSxLx5MjQci
dko1pKuV1W9rOK3y19A2J2N6rSdWYb7Zyzw8Gr7kTMWX1TP5WhRGCUhNRYnjI+4wgZIZdC
lfGdp8MGI3HBg9CAr702BOzRTMnW0aqsGjrbhcwhWaDgRymhBh++nGAhHxeWn4ApJ8F6kT
8HaAm3dFYXpHCaZ/xuKPXr4DFugGl8MRDU8TwioNE9kRi0Ko/kB5LTHuGhMPHGshMJeVGi
PQTrt9NAzgYyJeT9RB9VZadgElMvQ9S0+fo6ipOA==
---- END SSH2 PUBLIC KEY ----

4. 在本地主机上,创建 ~/.ssh2/identification 文件

在本地主机上创建以下文件。

[zadmei.com@local-host]$ vim ~/.ssh2/identification
IdKey id_dsa_2048_a

5. 在远程主机上,将 SSH2 公钥转换为 OpenSSH 公钥

这应该在运行 OpenSSH 的远程主机上执行。 只有 OpenSSH 可以在 OpenSSH 和 SSH2 格式之间来回转换密钥。

[zadmei.com@remote-host]$ ssh-keygen -i -f ~/.ssh/id_dsa_1024_a.pub > \
~/.ssh/id_dsa_1024_a_openssh.pub

将转换后的 OpenSSH 公钥从 ~/.ssh/id_dsa_1024_a_openssh.pub 文件复制到 authorized_keys 文件中,如下所示。

[zadmei.com@remote-host]$ vi ~/.ssh/authorized_keys
ssh-dss 5iGSvMtmBBj8wQdegAEBALVa6VKtALZkydlOiPasikEQfujH07tjW+OffaRufFD
G0VQESjq+YlVTWcXxStz0xGlvJ/dayVqBvvHzMao8bwGC+HFUtH1un7uyIEwOqU1fNzEpgh
C97s143S8zBcTAGtdegte3IqmlLbp/ZCd6bcJLvZEepMz96nlNB4NJ5UYIfdgXNhf/TrJD8
COWQst6jsP6RG/WrpHiI4QVDM6tZVZ4CnGjm1QPkRnf/o5YMFJZRo4Iwc7+bgYrIyywBZnf
LL7TRTk9TBfWzgJHy/y1tTtCMvVooWvFZbG5AiV3de63MxBaD0o68SASyXZzVM+MabXhjcd
XFY2vjq2vJxOzunEAAAAVAOTeOzDCnj3K5iGSvMtmBBj8wQGHAAABAA38sGpHEfSxLx5MjQ
dFYXpHCaZ/xuKPXr4DFugGl8MRDU8TwioNE9kRi0Ko/kB5LTHuGhMPHGshMJeVGiPQTrt9N
AzgYyJeT9RB9VZadgElMvQ9S0+fo6ipOA==

6.在远程主机上设置适当的权限到.ssh目录

在运行 openSSH 的远程主机上,确保设置以下权限。 没有这个,你会遇到各种 ssh 的奇怪问题。

[zadmei.com@remote-host]$ chmod 755 ~
[zadmei.com@remote-host]$ chmod 755 ~/.ssh
[zadmei.com@remote-host]$ chmod 644 ~/.ssh/authorized_keys

7.使用SSH密钥认证从本地主机登录到远程主机

如下所示执行从本地主机 (SSH2) 到远程主机 (OpenSSH) 的 ssh,以验证基于密钥的身份验证是否正常工作。

[zadmei.com@local-host]$ [You are on local-host here]

[zadmei.com@local-host]$ ssh -l zadmei remote-host
Host key not found from database.
Key fingerprint:
bitaz-navun-gogus-mptop-ljilk-qwlem-ftrtm-llmak-topok-zuiof-bnmix
You can get a public key's fingerprint by running
% ssh-keygen -F publickey.pub on the keyfile.
Are you sure you want to continue connecting (yes/no)? yes
Host key saved to /home/zadmei/.ssh2/hostkeys/key_22_remote-host.pub
host key for remote-host, accepted by jsmith Sun Oct 19 2022 15:06:42 -0700

Passphrase for key "/home/zadmei/.ssh2/id_dsa_2048_a" with comment "2048-bit
dsa, jsmith@local-host, Sun Oct 19 2022 14:49:42 -0700":[Enter password]
Last login: Sun Oct 19 14:01:48 2022 from 192.168.1.10

[zadmei.com@remote-host]$ [You are on remote-host here]

注意 :如果我们在从本地主机到远程主机执行 ssh 或 scp 时遇到以下错误,请参阅如何解决 SSH 上的算法协商失败问题以解决此问题。

[zadmei.com@local-host]$ ssh -l jsmith remote-host
warning: Authentication failed.
Disconnected; key exchange or algorithm negotiation failed
(Algorithm negotiation failed.)

在不输入密码的情况下,执行 ssh 和 scp 有两种方式:

  • 无密码:创建密钥对时,将密码留空。 使用此选项进行自动批处理。 例如 如果我们正在运行 cron 作业以在机器之间复制文件,这是合适的选择。 我们可以跳过此方法的后续步骤。
  • 使用密码和 SSH 代理:如果我们从命令行交互地使用 ssh 和 scp,并且我们不想每次执行 ssh 或 scp 时都使用密码,我不推荐使用前一个选项(无密码),因为 我们已经消除了基于 ssh 密钥的身份验证中的一级安全性。 相反,在创建密钥对时使用密码短语并使用 SSH 代理执行 ssh 和 scp,而不必每次都输入密码,如下面的步骤所述。

8. 在本地主机上启动 SSH 代理

SSH 代理将在后台运行以保存私钥并执行 ssh 和 scp,而无需多次输入密码。

[zadmei.com@local-host]$ ssh-agent $SHELL

9. 将私钥加载到本地主机上的 SSH 代理

[zadmei.com@local-host]$ ssh-add

Adding identity: /home/zadmei/.ssh2/id_dsa_2048_a.pub
Need passphrase for /home/zadmei/.ssh2/id_dsa_2048_a (2048-bit dsa,
zadmei@local-host, Sun Oct 19 2008 14:49:42 -0700).
Enter passphrase:[Enter your passphrase here]

10.从本地主机到远程主机执行SSH或SCP,无需输入密码

[zadmei.com@local-host]$ [You are on local-host here]

[zadmei.com@local-host]$ ssh -l jsmith remote-host
Last login: Sun Oct 19 14:20:48 2022 from 192.168.1.10

[zadmei.com@remote-host]$ [You are on remote-host here]