跳转至

ssh

Tip

但凡涉及到加密连接,几乎都有 ssh 的身影,这里就单独写一篇文章来记录她。

在计算机网络应用层中,我们介绍了安全外壳协议 SSH。基于该协议,工程师开发了加密传输程序——ssh,作为客户端和服务器之间的加密连接工具。

连接方式

ssh 支持「密码」和「密钥」两种连接方式:

  • 密码连接可以在服务器端禁用,一般不怎么用,因为相对不安全;
  • 密钥连接相对常用,也可以设置额外的密码 (Passphrase)。

密钥连接

考虑到密钥连接的场景更多,这里我们重点介绍密钥连接。其核心逻辑是:

  1. 利用 ssh 程序在客户端生成一对密钥(公钥和私钥);
  2. 将公钥上传到服务端;
  3. 在客户端利用 ssh 程序和服务端进行加密连接。

下面是详细流程。

客户端生成密钥对

Bash
ssh-keygen /c/User/<user_name>/.ssh/<key_file_name>
# 之后设置 passphrase,这一步是可选的
# 之后需要重复一次 passphrase

生成默认配置且不带 Passphrase 的密钥对

上传公钥至服务器

在服务器的新建 ~/.ssh/authorized_keys 文本文件,将公钥中的内容复制进去并保存:

Bash
echo "<your_public_key> <local_user_name>@<local_computer_name>" >> authorized_keys

Tip

authorized_keys 可以存放多个公钥,以供多人连接使用。公钥末尾的 <local_user_name>@<local_computer_name> 可以自定义。

修改文件和文件夹的权限与属主:

Bash
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chown -R <user_name>:<group_name> ~/.ssh

客户端测试 ssh 连接

Bash
ssh -i </path/to/private_key> <user_name>@<ip_address>

FAQ

ssh config

如果自定义了密钥文件名,那么使用某些基于 ssh 的程序可能会报「找不到私钥」的错,此时就需要配置服务和私钥的对应关系。

例如,Git 在使用 SSH 协议和远程仓库进行交互时,就需要通过 ssh 进行加密,如果我们自定义了密钥文件名,Git 就会找不到对应的私钥从而交互失败。

我们可以在 ~/.ssh/config 中进行配置。一个连接的配置样例如下:

Bash
Host CODING                            # 远程名称(自定义)
    HostName e.coding.net              # 远程服务器的域名或 IP
    Port 7890                          # 连接端口(默认 22)
    User git                           # 登录用户名
    IdentityFile ~/.ssh/<private_key>  # 本地私钥路径

私钥 too open 问题

如果你的私钥不是通过 ssh-gen 生成的,请确保私钥文件的权限为 400 或 600,否则 ssh 将忽略该私钥,因为权限过高,ssh 会认为这不安全,警告如下:

Bash
Permissions 0644 for '<your_private_key>' are too open,
It is required that your private key files are not accessible by others.
This private key will be ignored,
load key "<your_private_key>": bad permisions
Permission denied (publickey)

只需要使用 chmod 命令将私钥权限修改为 400 或 600 即可:

Bash
chmod 600 </path/to/your_private_key>