一、ssh简介

  1. SSH 工作原理

SSH(Secure Shell) 是一种加密的网络传输协议,可以在不安全的网络中为网络服务提供安全的传输环境。SSH 以非对称加密实现身份验证,通过C/S(client-server)模式来实现

具体交互见下图

centos ssh 加密算法 ssh加密算法配置_服务器

以githb为例:在我们上传代码到 github 服务器的过程中,github server 就会作为 SSH server 来接受客户端的请求,并返回 public key(即公钥) 给客户端。而客户端将会进行 public key 和 private key(即私钥)的匹配校验,最终建立连接

二、 ssh文件目录

centos ssh 加密算法 ssh加密算法配置_ssh_02

  1. git是私钥,git.pub是公钥,两者是一一对应的
  2. config:ssh的配置文件
  • 配置文件可分为多个配置区段,每个配置区段使用Host来区分。我们可以在命令行中输入不同的host来加载不同的配置段。
  • 对每一个配置项来说,首次获取的参数值将被采用,因此通用的设置应该放到文件的后面,特定host相关的配置项应放到文件的前面

常用配置项如下:

  • Host

Host配置项标识了一个配置区段。ssh配置项参数值可以使用通配符:*代表0~n个非空白字符,?代表一个非空白字符,!表示例外通配。我们可以在系统配置文件中看到一个匹配所有host的默认配置区段:

  • GlobalKnownHostsFile

指定一个或多个全局认证主机缓存文件,用来缓存通过认证的远程主机的密钥,多个文件用空格分隔

  • HostName

指定远程主机名,可以直接使用数字IP地址。

  • IdentityFile

指定密钥认证使用的私钥文件路径。默认为 ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 或 ~/.ssh/id_rsa 中的一个

  • Port

指定远程主机端口号,默认为 22 。

  • User

指定登录用户名。

  • UserKnownHostsFile

指定一个或多个用户认证主机缓存文件,用来缓存通过认证的远程主机的密钥,多个文件用空格分隔

  1. konwn_hosts:

A通过ssh首次连接到B,B会将公钥1(host key)传递给A,A将公钥1存入known_hosts文件中,以后A再连接B时,B依然会传递给A一个公钥2,OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。内容如下:

centos ssh 加密算法 ssh加密算法配置_ssh_03

  • 当A通过ssh登陆B时提示 Host key verification failed。原因是bash A的known_hosts文件中记录的B的公钥1 与 连接时B传过来的公钥2不匹配
  • 解决方法:
  • 方法一:删除A的known_hosts文件中记录的B的公钥(手动进行,不适用于自动化部署情形)
  • 方法二:修改配置文件(config),在ssh登陆时不通过known_hosts文件进行验证(安全性有所降低),修改完需重启机器
  • 修改config
添加以下两行代码:
StrictHostKeyChecking no 
UserKnownHostsFile /dev/null

三、配置多个SSH Key

  1. 在本地Git仓库生成两个不同的SSH Key
1.ssh-keygen -t rsa -C "email"
2.Generating public/private rsa key pair.
3.Enter file in which to save the key (~/.ssh/id_rsa):<不要直接回车,填写自己定义的名字,以区分不同的ssh key,生成两套ssh公钥和私钥>
4.Enter passphrase(empty for on passphrase):<直接回车,不然以后每次clone都要输入密码>
  1. 用不同的帐号,上传两个不同的证书。以github为例

读取*.pub的内容,粘贴到服务网站上。记住对应的用户名。

centos ssh 加密算法 ssh加密算法配置_github_04


3. 编辑~/.ssh/config文件。

Host gh_1
    HostName github.com
    IdentityFile ~/.ssh/gh_1
    PreferredAuthentications publickey
    User username1

Host gh_2
    HostName github.com
    IdentityFile ~/.ssh/gh_2
    PreferredAuthentications publickey
    User username2

要点在于Host与HostName的区别:

  • HostName:是填写真实的服务地址。 (域名或者ip)
  • Host:是填写别名,后面会用上。 (用于区分不同的ssh环境)
  • IdentityFile:填写的是证书的所在位置,你也可以把证书保存在任何地方。

原本我们在Web页面上复制的SSH URL,可以直接使用,例如:

git@github.com:name/repo.git

但是,现在根据你的帐号不同,需要自行替换:

  • git@gh_1:name/repo.git
  • git@gh_2:name/repo.git

至此配置完毕。

参考文章参考文章参考文章