内容提要私钥登陆
用图示意生成私匙分发公钥Github的SSH认证通过SSH认证提交代码多仓库多账号备份代码参考资料
私钥登陆
日常SSH认证[1],主要有两种方式:
一个是账号密码;
另一个是。
注意
其实并不是,只不过运维给我们开通权限的时候总是问我们提供,就被大家误以为是。实际上认证的时候是用,用的是签名(签名用,验签是用)。
多数大公司SSH登陆方式是:先通过登陆跳板机,再穿梭到其他主机。
自动读取私钥
当我们输入:时,会自动读取文件(这个文件就是),以这个验证身份。
用图示意
如图有三步,后续文字想详讲它们。
提醒: 上图表明,如果要保证第3步能成功登录服务器,必须事先在第2步把公钥放置到服务器的文件里面。
生成私匙
为了申请登陆服务器,运维通常会要求我们提供自己的。我们需要生成,然后把保密,把给运维。你可能会问:为什么运维不帮你生成呢?然后把给你,你放到位置不就行了么?的确是可以的。只不过那样就失去安全意义了。你的都交给运维了,那你的账号做了些破坏性操作时,并不能证明操作人就是你。
生成,用命令就好:
$ ssh-keygen
按提示,输入必要信息。最后私钥生成到 ~/.ssh/id_rsa,公钥是 ~/.ssh/id_rsa.pub
注意
如果您担心直接放在本机的文件怕别人看见,您还可以给加个口令(就是查看它的时候,需要输入一个口令)。另外通常私钥文件的访问权限是(只有文件的owner才能)。
分发公钥
假设有两个Linux主机,分别命名叫C和S,现在要从C登陆到S上。如何配置?
私钥文件: 在C的中要保存“私钥”,文件名为。
分发公钥: 在S的文件中得追加C的。
catid_rsa.pub >> ~/.ssh/authorized_keys
注意:是C的,是S的。
更新权限:在S的 ~/.ssh 执行chmod 0600 *
Github的SSH认证
通过SSH认证提交代码
往GitHub 提交代码,通常有两种协议:SSH和HTTPS。其中HTTPS需要我们输入或配置账号和密码进行认证,而SSH方式都是通过认证。为此,需要在settings页设置SSH Public Key(把刚才生成的~/.ssh/id_rsa.pub内容拷贝到网页表单中),如图:
假设一个叫alice的账号,在GitHub 上创建了一个hello-world项目,那么它的git地址是:
当在本地执行命令的时候,默认就会读取私钥进行签名,以便服务端验证。
多仓库多账号备份代码
上节说了默认读取文件,那如何指定读取别的文件呢?什么时候需要读取别的私钥文件呢?
我们知道git是去中心化的,除了能够离线工作外,还能备份到多个远程仓库。比如可以同时备份到国外的,或;再有国内的或。我们构造了个例子:
本地一份代码,想同时备份到3个远程仓库,其中:
Resp#1是github.com的alice账号
Resp#2依然在github.com上,但账号换成了bob
Resp#3备份到国内的coding.net上,也用alice账号
在本地生成两对密钥对,分别是alice(包括和)和bob(包括和),并把公钥填写到三个远程仓库上。
在本地Local仓库,编辑文件,增加节点内容:
配置完后,再查看远程仓库,就多出3个了:
关键问题来了,当执行的时候,系统是如何选择对应的私钥文件的呢?
细心的同学会发现:
Resp#1的URL地址是,主机部分是;
而Resp#2的URL地址是,主机部分却是,它不是一个真正意义上的主机名,公网是不承认的。的确,它是一个!
这个在哪里配置呢?答案是SSH Config文件,即:。
这里插播下SSH Config的语法知识:
Hostgithub.comgithub-alice#主机别名:可以跟真实主机名相同,还可以有多个别名,以空格隔开。
HostNamegithub.com#真实主机名:必选参数,可以是域名或IP。
Port22#端口号:可选参数,默认值22
Usergit#用户名:用于认证的用户名,github的SSH方式,用户名必须是git,而不是alice或bob
PreferredAuthenticationspublickey#认证方式:可选参数
IdentityFile~/.ssh/id_rsa_alice#私钥文件:默认是~/.ssh/id_rsa,若用其他,必须在此指定
按这个语法知识,编辑文件,添加内容:
# 多仓库多账号备份
Host github.com github-alice
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_alice
Host github-bob
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_bob
Host git.coding.net coding-alice
HostName git.coding.net
Port 22
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_alice
接着指定Push指令:
$ gitpush github-alice master
$ gitpush github-bob master
$ gitpush coding-alice master
以为例解释下,git客户端看到会在里面选出远程git仓库地址:
github-bobgit@github-bob:bob/hello-world.git (fetch)
github-bobgit@github-bob:bob/hello-world.git (push)
接着从中提取出主机名,这个主机名需要查本地别名表,查到:
Host github-bob
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_bob
它真实的主机名是,账号是,私钥文件是。
最后简单总结下备份:
多仓库备份需求:为防丢失或加速,一份代码既想放GitHub,又想放国内的coding。通常一个人只需生成一对密钥对,在两个不同网站,填写同一个公钥。但有时候,可能各种原因,被迫多个密钥对。
Git Remote 支持主机别名:设置git remote的URL地址时,主机名可以是非真实域名或IP,可以是别名。这个别名可在SSH Config中定义。
为主机别名指定私钥:在SSH Config中定义主机别名,并为其指定真实主机域名或IP,同时指定私钥文件。
参考资料
Java SSH 工具包(JSCH) 深入浅出
JSCH Demo 代码
如何配置private key 登陆方式?
免密登陆: ssh-keygen,ssh-copy-id和authorized_keys
如何通过SSH访问mysql ?
跳板机: 登陆跳板机时,需要动态密码
SSH Tunnel 隧道
反向隧道
SSH 正向/反向隧道
SSH 隧道
多层 SSH隧道
配置多份GitHub SSH密钥
Github邮箱账号隐私与GitLog冲突
一条命令同时Push多个仓库
领取专属 10元无门槛券
私享最新 技术干货