资讯专栏INFORMATION COLUMN

Git自由之章 - 关于SSH 公钥

IamDLY / 411人阅读

摘要:关于首先是一种网络协议,用于计算机之间的加密登录。第二种级别是基于公开密匙加密机制的安全验证。前者是私钥,注意保管,后者是公钥如下添加到登录之后。

简述

什么是 Git 的 ssh key?这个问题其实我也很困惑,所以我才专门分享这篇关于 ssh key 的文章,着重分析了解什么是 ssh key,它有什么用,怎么能用好它?本文主要由从网上收集资料加上自己的经验汇总而成的经验干货,可以说的实战经验之谈,但其中也有一些错漏,欢迎指正。

关于 ssh key

首先ssh是一种网络协议,用于计算机之间的加密登录。

我们使用ssh登录服务器时,一般常见的会使用用户名/密码方式登录,也可以使用ssh key实行免密码登录,一般现在这种方式被Git服务器使用的比较多。

简单来说,SSH提供了两种级别的安全验证:

第一种级别是基于密码的安全验证,知道账号和密码,就可以登陆到远程主机。

Team的开发工作中,就是使用这种方式登陆编译服务器,或者开发机器。因为是在内网中,这种级别的安全验证已经足够了。

第二种级别是基于Public-key cryptography (公开密匙加密)机制的安全验证。

原理如下图所示:

其优点在于无需共享的通用密钥,解密的私钥不发往任何用户。

即使公钥在网上被截获,如果没有与其匹配的私钥,也无法解密,所截获的公钥是没有任何用处的。

ssh key 的配置使用方案(一)

这是根据 Github 提供的 help 文档教程:

首先进到 .ssh 目录下:

$ cd ~/.ssh
# Checks to see if there is a directory named ".ssh" in your user directory

使用ssh-keygen产生新的key:

$ ssh-keygen -t rsa -C "your_email@example.com"
# Creates a new ssh key using the provided email. 
# Generating public/private rsa key pair.
# Enter file in which to save the key (/home/you/.ssh/id_rsa).

使用默认的文件名直接enter, 按提示输入密码(如果不提供密码,SSH将无密码连接,如果private key泄露可能会有安全问题):

Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type passphrase again]

密匙产生成功:

Your identification has been saved in /home/you/.ssh/id_rsa.
Your public key has been saved in /home/you/.ssh/id_rsa.pub.
The key fingerprint is:
01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com

上传public key到Github账户

登录github

点击右上方的Accounting settings图标

选择 SSH key

点击 Add SSH key

在出现的界面中填写SSH key的名称,填一个你自己喜欢的名称即可,然后将上面拷贝的~/.ssh/id_rsa.pub文件内容粘帖到key一栏,在点击“add key”按钮就可以了。

添加过程github会提示你输入一次你的github密码

设置SSH使用HTTPS的403端口

在局域网中SSH的22端口可能会被防火墙屏蔽,可以设置SSH使用HTTPS的403端口。

测试HTTPS端口是否可用:

$ ssh -T -p 443 git@ssh.github.com
Hi username! You"ve successfully authenticated, but GitHub does not
provide shell access.

编辑SSH配置文件 ~/.ssh/config 如下:

Host github.com
  Hostname ssh.github.com
  Port 443

测试是否配置成功:

$ ssh -T git@github.com
Hi username! You"ve successfully authenticated, but GitHub does not
provide shell access.
ssh key 的配置使用方案(二)

这里是利用ssh key实现免密码登录服务器

生成ssh key

ssh-keygen -t rsa -C "your name"

这样默认会在本地的~/.ssh目录下生成id_rsa,id_rsa.pub两个文件:

id_rsa是私钥。

id_rsa.pub是公钥。

使用ssh key

ssh key方式登录远程服务器

我们需要把id_rsa.pub拷贝到远程服务器的~/.ssh下面。

并改名为authorized_keys,这样我们就可以使用key的方式登录了。

$ ssh git@your.server.com
Enter passphrase for key "~/.ssh/id_rsa":

这样我们输入shh key的密码就可以登录了。

ssh key方式使用git clone代码

如果我们使用的是github/gitcafe, 只需要把id_rsa.pub的内容拷贝出来。

在github的setting里面添加即可, 我们就可以使用ssh 方式clone代码了。

//请修改为你自己的git地址
git clone git@github.com:chenyangcun/mydouban.git

多站点使用不同的ssh key

默认ssh登录时使用的是id_rsa文件,我们也可以指定其他文件。

首先我们生成不同的key:

ssh-keygen -t rsa -C "user1" -f user1
ssh-keygen -t rsa -C "user2" -f user2

我们生成user1,user2两个不同的ssh key,然后我们在.ssh下创建config文件。

输入:

Host company
  HostName company.com
  User git
  IdentityFile ~/.ssh/user1

Host github
  HostName github.com
  User git
  IdentityFile ~/.ssh/user2

这样访问company.com就会使用user1, 访问github.com就会使用user2。

同一站点使用不同的ssh key

我们有时候需要在同一站点使用不同的ssh key, 比如使用gitcafe的pages服务。

想要创建两个站点,但是gitcafe上不允许不同的用户使用同一个ssh key。

我们在config文件里做相应的修改

Host gitcafe-site1
  HostName gitcafe.com
  User git
  IdentityFile ~/.ssh/user1

Host gitcafe-site2
  HostName gitcafe.com
  User git
  IdentityFile ~/.ssh/user2

然后我们更改git参考的远程地址

#site1
$ git remote remove origin 
$ git remote add origin git@gitcafe-site1:user1/user1.git

#site2
$ git remote remove origin 
$ git remote add origin git@gitcafe-site2:user2/user2.git

关键是把gitcafe.com改为gitcafe-site1和gitcafe-site2

如果使用hexo, 在hexo的config文件中,把deploy的远程地址改成gitcafe-site1这样的形式即可:

deploy:
type: git
repo: git@gitcafe-site1:user1/user1.git
ssh key 的配置使用方案(三)

这里以配置github的ssh key为例子。

1. 配置git用户名和邮箱

git config user.name "用户名"
git config user.email "邮箱"

在config后加上 --global 即可全局设置用户名和邮箱。

2. 生成ssh key

ssh-keygen -t rsa -C "邮箱"

然后根据提示连续回车即可在~/.ssh目录下得到id_rsa和id_rsa.pub两个文件,id_rsa.pub文件里存放的就是我们要使用的key。

3.上传key到github

clip < ~/.ssh/id_rsa.pub

复制key到剪贴板

登录github

点击右上方的Accounting settings图标

选择 SSH key

点击 Add SSH key

4. 测试是否配置成功

ssh -T git@github.com

如果配置成功,则会显示:

Hi username! You’ve successfully authenticated,
but GitHub does not provide shell access.

解决本地多个ssh key问题

有的时候,不仅github使用ssh key,工作项目或者其他云平台可能也需要使用ssh key来认证,如果每次都覆盖了原来的id_rsa文件,那么之前的认证就会失效。

这个问题我们可以通过在~/.ssh目录下增加config文件来解决。

下面以配置搜狐云平台的ssh key为例。

1. 第一步依然是配置git用户名和邮箱

git config user.name "用户名"
git config user.email "邮箱"

2. 生成ssh key时同时指定保存的文件名

ssh-keygen -t rsa -f ~/.ssh/id_rsa.sohu -C "email"

上面的id_rsa.sohu就是我们指定的文件名,这时~/.ssh目录下会多出id_rsa.sohu和id_rsa.sohu.pub两个文件,id_rsa.sohu.pub里保存的就是我们要使用的key。

3. 新增并配置config文件

添加config文件

如果config文件不存在,先添加;存在则直接修改:

touch ~/.ssh/config

在config文件里添加如下内容(User表示你的用户名)

Host *.cloudscape.sohu.com
    IdentityFile ~/.ssh/id_rsa.sohu
    User test

4. 上传key到云平台后台(省略)

5. 测试ssh key是否配置成功

ssh -T git@git.cloudscape.sohu.com

成功的话会显示:

Welcome to GitLab, username!

至此,本地便成功配置多个ssh key。

日后如需添加,则安装上述配置生成key,并修改config文件即可。

gitlab 上配置使用 ssh key

这里主要讲述在 gitlab 上配置使用 ssh key

客户端生成ssh-key

如果已经有sshkey,可用之前的。

在客户端执行命令 ssh-keygen -t rsa -C "for xxx"

-C 选项后是备注,可随意。

命令执行后会要求输入key存储的文件名和passphrase:

输入一个特有的文件名,否则使用默认的 id_rsa。

passphrase。不输入也可以。输入之后,提交的时候要输入这个passphrase

完成后在 ~/.ssh/ 会生成2个文件:

id_rsa 和 id_rsa.pub。(前者是私钥,注意保管,后者是公钥)

如下:

[huqiu@101 liaohuqiu]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/huqiu/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):

添加ssh-key到gitlab

登录之后: Profile Settings => SSH-Keys => Add SSH key。

输入之前生成的公钥,标题随意:

基本使用介绍

配置好sshkey之后,你就可以在命令行下使用git命令进行操作了。强烈建议使用命令行而不是使用图形界面客户端。

创建项目:

创建完成:

基本操作

clone(克隆)

add(跟踪)

commit(提交)

push(推送)

clone(克隆)

[huqiu@101 git]$ git clone git@git.liaohuqiu.net:huqiu/test.git
Cloning into "test"...
warning: You appear to have cloned an empty repository.
Checking connectivity... done

进入目录

[huqiu@101 git]$ cd test/
[huqiu@101 test]$ ll
total 0

创建一个文件

[huqiu@101 test]$ echo "### hello, test" > README.md

为项目配置用户名和邮箱,用户名和邮箱会进入到日志

[huqiu@101 test]$ git config user.name liaohuqiu
[huqiu@101 test]$ git config user.email liaohuqiu@gmail.com

add(跟踪),添加文件到本地库

[huqiu@101 test]$ git add README.md

*commit(提交)*
[huqiu@101 test]$ git commit -a -m "add README"
[master (root-commit) 1095bd8] add README
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

push(推送)

    [huqiu@101 test]$ git push origin master
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 230 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To git@git.liaohuqiu.net:huqiu/test.git
     * [new branch]      master -> master

提交完成后记录:

项目的文件情况:

关于 github与gitlab 多个 ssh key 的处理方案

这里主要是处理 github 的 ssh key 与 gitlab 的 ssh key 的冲突和相互覆盖问题

如果你以前用 github 的 ssh key ,后来又多了一个 gitlab 的账号,那么在绑定 gitlab 的 ssh key 的时候,你会发现 原来的 github 的 ssh key 被覆盖了,这就是问题所在,怎么能实现两者同时绑定呢:

在.ssh目录下新建一个config文件配置一下,就能解决gitlab与github的ssh key的冲突。

生成并添加第一个ssh key

cd ~/.ssh
ssh  ssh-keygen -t ras -C "youremail@yourcompany.com"

这时可以一路回车,不输入任何字符,将自动生成id_rsa和id_rsa.pub文件。

生成并添加第二个ssh key

$ ssh-keygen -t rsa -C "youremail@gmail.com"

注意,这时不能一路回车,否则邮箱将覆盖上一次生成的ssh key,给这个文件起一个名字, 比如叫 id_rsa_github, 所以相应的也会生成一个 id_rsa_github.pub 文件。

此时查看.ssh下的目录文件,发现多了id_rsa_github和id_rsa_github.pub两个文件。

添加私钥

$ ssh-add ~/.ssh/id_rsa
$ ssh-add ~/.ssh/id_rsa_github

修改配置文件

在 ~/.ssh 目录下新建一个config文件

touch config

并添加以下内容

# gitlab
Host gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa

# github
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_github

给github/gitlab上添加ssh key

查看ssh key执行cat id_rsa_github.pub内容,将文本内容拷贝到https://github.com/settings/ssh。

生成ssh key的方法可以去看官方教程,这里不再赘述。

测试

$ ssh -T git@github.com

如果输出:

Hi xuyuan923! You"ve successfully authenticated, 
but GitHub does not provide shell access.

说明成功的连上github了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21704.html

相关文章

  • Git自由之章 - 本地仓库的基本操作

    摘要:终端提示注意对生成定的秘钥进行重命名输入名称。如果某些文件已经被纳入了版本管理中,则修改是无效的。 简述 Git 是目前很流行的版本控制工具,很多开发团队在使用。本人也在使用这个工具,发觉相比于传统的SVN,确实好用很多,而且它还有很大的自由属性,这一点深得我的欣赏。这次的分享主要是分享关于Git的基础,关于本地仓库的基本操作。(不懂本地仓库的概念可以上网查一些关于 Git 的代码仓库...

    XFLY 评论0 收藏0
  • 从0开始学习 GitHub 系列之「向GitHub 提交代码」

    摘要:目前是每一台电脑的标准配置。而大多数服务器都会选择使用公钥来进行授权,所以想要在提交代码的第一步就是要先添加配置。添加成功之后,输入进行测试,如果出现以下提示证明添加成功了。 之前的这篇文章「从0开始学习 GitHub 系列之「Git速成」」相信大家都已经对 Git 的基本操作熟悉了,但是这篇文章只介绍了对本地 Git 仓库的基本操作,今天我就来介绍下如何跟远程仓库一起协作,教你们向 ...

    feng409 评论0 收藏0
  • git webhooks 实现自动拉取代码

    摘要:而利用的功能,能够让我们省去这一步,下面我就以码云的为例,实现服务端的代码自动同步部署。查看是哪个用户执行该命令参考文章使用脚本远程部署项目利用实现自动部署代码码云通过实现自动同步代码部署执行系统外部命令函数 当进行开发的环境在本地,而运行的环境要在服务端时,每一次提交代码都需要在服务端pull一次。而利用git的hooks功能,能够让我们省去这一步,下面我就以码云的webhooks为...

    marek 评论0 收藏0
  • 如何在服务器上搭建hexo博客

    原文链接 随着Vateral主题的开发接近了尾声,在对主题速度优化的时候发现之前用的githubpage问题多多:首先就是因为在国内的原因,访问速度本身就很慢,曾经有次加载一张16kb的图标时间耗费了26s!!?其次,在对资源做CDN托管加速时,域名是需要备案的,显然githubpage也是做不了的;所以果断舍弃了这个把hexo搭建到了我的阿里云服务器上 总体来说还是比把hexo搭建到github...

    MycLambert 评论0 收藏0
  • 在 CentOS 7 上搭建 Jenkins + Maven + Git 持续集成环境

    摘要:本文以部署项目为例,使用码云作为代码托管仓库,在上搭建持续集成环境。准备工作安装环境是基于开发的持续集成工具,需要在环境下运行。忽略它,继续执行即可。拷贝完成后,在应用服务器上执行的命令或脚本。其中所有在远程服务器上的操作都是通过完成的。 本文以部署 Spring boot + Maven 项目为例,使用码云作为代码托管仓库,在 CentOS 7 上搭建 Jenkins 持续集成环境。...

    sunny5541 评论0 收藏0

发表评论

0条评论

IamDLY

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<