ssh-key用法

ssh-key对于Linux重度用户可是一个牛逼东西,简化登陆流程,可谓神器!

github

生成ssh-key可以免密码进入仓库,参考github官方教程

确认重名key

一、首先看看有没有之前生成的旧key

ls -al ~/.ssh

若有旧ssh-key,可以选择删除,也可以后来生成时候指定产生新文件名

生成key

# Generate public/private rsa key pair.
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# passphrase可以不用设置,设置了的话,每次用ssh都要输入

假设生成的自定义ssh-key为私钥 ~/.ssh/id_rsa_github 和 公钥 id_rsa_github.pub。

提示:ssh-keygen支持生成多种类型的key,如以下例子,详见ssh-keygen的帮助命令

1
2
3
4
ssh-keygen -t rsa -b 4096
ssh-keygen -t dsa
ssh-keygen -t ecdsa -b 521
ssh-keygen -t ed25519

本地添加私钥

首先重新生成hostname

ssh-keygen -R github.com

使得ssh-agent后台运行:

eval "$(ssh-agent -s)"

出现Agent pid XXXX这样的提示之后:

ssh-add ~/.ssh/id_rsa_github

远端添加公钥

打开公钥:【注意是公钥!!】

cat id_rsa_github.pub

将内容拷贝至https://github.com/settings/ssh中,这个key成为完全控制每一个仓库commit权限,要谨慎保存,泄露的话你的github说不定仓库被人清空了。

联机验证登录

ssh -T git@github.com

添加到本机缓存中,然后github提示You've successfully authenticated。
然后你的deploy key页面的钥匙图标变成绿色,代表可以使用了

改用ssh推送

修改你的本地仓库中的config

vi .git/config
# 注释掉https
# url = https://github.com/USERNAME/REPO_NAME.git
# 更换为ssh,注意有个冒号
url = git@github.com:USERNAME/REPO_NAME.git

+安全提示:+

强烈建议每一个仓库对应一个key,而不是用一个权限无穷大的key,风险太大。
每个仓库的key可以在下面地址设置:

https://github.com/USERNAME/REPO_NAME/settings/keys

试一下git push,是不是可以自动推送了。

自动登陆VPS

首先确保vps上面的iptables规则允许22端口入站出站

PC机子执行

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

如私钥保存为~/.ssh/id_rsa_myhost,则修改config

vi ~/.ssh/config
# 添加
Host myhost
 User root
 Hostname 111.222.111.222
 Port 22
 ServerAliveInterval 30
 IdentityFile ~/.ssh/id_rsa_myhost
 

上传公钥到你的vps

scp ~/.ssh/id_rsa_myhost.pub root@111.222.111.222:/root/.ssh/

登陆到vps添加公钥记录

cd ~/.ssh
cat id_rsa_myhost.pub >> authorized_keys
service ssh restart

修改权限,防止被他人看见密钥内容

# PC机子和VPS都要设置
chmod 700 ~/.ssh/* 

这样在PC就能使用一句话登陆ssh或者scp传文件了

ssh myhost
scp /tmp/test.txt myhost:/tmp/

安全设置:对于已经开启了公私鈅登陆的主机,可以禁用密码登陆,效果是:使用密码无权进入

vi /etc/ssh/sshd_config

# 仅允许root用户使用公私鈅登陆(不允许密码登陆)
PermitRootLogin prohibit-password

# 禁止一切用户使用密码登陆(这个选项根据个人实际设置,默认值是yes)
PasswordAuthentication no

TC自动部署hexo

可以自动更新博客,这个TC原本的目的不是这样的。
TC原本是代码集成平台,居然用成了博客自动更新机,真是大材小用。

首先关联github账户到travis-CI,然后勾选博客的源代码项目,不是github.io项目。
接下来完成ssh的绑定和.travis.yml修改

在Cloud9上面的虚拟主机操作。因为集成了npm环境。

安装travis:

gem install travis
travis login --auto

上传密钥到cloud9,然后放到项目里面,例如我的项目是github.com/aaa/bbb,私钥名称id_rsa_github

mv id_rsa_github aaa/bbb/
cd aaa/bbb
touch .travis.yml
travis encrypt-file id_rsa_github --add

最后把私钥删除了,留下了这个加密后的私钥。

新建一个ssh配置文件:

vi ssh_config
# # #
Host github.com
  User git
  StrictHostKeyChecking no
  IdentityFile ~/.ssh/id_rsa
  IdentitiesOnly yes

修改travis脚本

vi .travis.yml
# 输入内容
language: node_js
node_js:
- 4.2 
branches:
only:
- master
- test
before_install:
- openssl aes-256-cbc -K $encrypted_f88d79a9e3f2_key -iv $encrypted_f88d79a9e3f2_iv -in .travis/id_rsa.enc -out ~/.ssh/id_rsa -d
- chmod 600 ~/.ssh/id_rsa
- eval $(ssh-agent)
- ssh-add ~/.ssh/id_rsa
- cp .travis/ssh_config ~/.ssh/config
- mkdir temp_lxc
- cd temp_lxc
install:
- npm install -g hexo-cli
- npm install hexo --save
- hexo init
- npm install hexo-deployer-git --save
before_script:
- cp -R ../source ./
- cp -R ../themes ./
- cp ../_config.yml ./
- git config --global user.name 'lixingcong'
- git config --global user.email 'lixingcong@live.com'
script:
- hexo clean
- hexo d -g

实际上,这个文件非常灵活,我是折腾很久才摸索出来的。每个人肯定不一样。我的是以自己的仓库改的,我的仓库地址:my_hexo_blog

How to work? 向my_hexo_blog推送的同时,自动更新lixingcong.github.io。

如果遇到问题,可以谷歌关键词“Travis CI Hexo”得到很多结果,可供参考

GPG签名

直接生成,填入正确信息,还有密码(可选),按Github官方教程操作即可。

gpg --gen-key

生成过程需要大量随机字节。可以动鼠标还有打字。时不时在GPG生成界面按一下Enter提醒它。

查看GPG

gpg --list-keys
# 记下 第一行的公钥2048/A8F99211后面的这个A8F99211
# 后面用到它:<public GPG key>

将公钥导入到github中,将本地提交打上tag

git config --global user.signingkey <public GPG key>

其中 < public GPG key >为上面你记下的公钥

备份GPG:(包括公钥,私钥,信赖库)

gpg -a --export user@mail.com > ~/public-gpg.key
gpg -a --export-secret-keys user@mail.com > ~/secret-gpg.key
gpg --export-ownertrust > ~/ownertrust.txt

还原GPG(导入私钥时自动导入公钥)

gpg --import ~/secret-gpg.key
gpg --import-ownertrust ~/ownertrust.txt

git提交commit时候进行签名

# 配置git
git config --global user.signingkey <public GPG key>

# 对tag进行GPG签名。参数-s
git tag -a -s v2.0 -m "SIGN-MY-TAG"