安装了node环境之后,就开始部署代码的阶段了。
生成SSH公钥
大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。系统中的每个用户都必须提供一个公钥用于授权,没有的话就要生成一个。生成公钥的过程在所有操作系统上都差不多。
SSH 公钥默认储存在账户的主目录下的 ~/.ssh 目录下。
在该目录下查看 something 和 something.pub 来命名的一对文件,这个 something 通常就是 id_dsa 或 id_rsa。有 .pub 后缀的文件就是公钥,另一个文件则是密钥。假如没有这些文件,或者干脆连 .ssh 目录都没有,可以用 ssh-keygen 来创建。该程序在 Linux/Mac 系统上由 SSH 包提供。
ssh-keygen -t rsa -b 4096 -C "xxxx@xx.com"
生成了一对公私钥之后,要把共钥内容复制在git托管服务商那里(比如 github,bitbucket等等),具体如何操作参见服务商的文档。
将私钥添加到服务器上的 ssh-agent
eval "$(ssh-agent -s)"
ssh-add -k ~/.ssh/xxxx_rsa
之后就可以直接执行git clone了。
客户端证书验证
因为这次部署的是一个内部管理系统。为了安全性和后期管理的方便着想,我们使用了客户端向服务器发送证书来验证身份的方式登陆。
在创建客户端证书之前,我们需要自建一个CA(Certificate Authority)
首先我们来生成一个CA的密钥
openssl genrsa -out path/ca.key 2048
接着我们用这个 key 生成一个 CA 的证书
openssl req -new -x509 -key path/ca.key -out ca.crt
这里只是最简易版本的CA,如果想实现一个严谨的CA,请参考这篇文章 OpenSSL Certificate Authority
当然最好使用自己的 openssl 的 config 文件,组织好 CA 目录的层次,因为后期有很多管理命令会用到。
接着创建客户端证书,首先我们为客户端证书生成一个密钥
openssl genrsa -des3 -out path/users/user1.key 2048
接着使用这个密钥生成一个证书请求csr文件
openssl req -new -key path/users/user1.key -out path/users/user1.csr -config openssl.conf
然后使用ca的证书和key来签发这个客户端证书
openssl ca -in path/users/user1.csr -cert path/ca.crt -keyfile path/ca.key -out path/users/user1.crt -config openssl.conf
最后为客户端证书生成一个浏览器可识别的p12文件
openssl pkcs12 -export -clcerts -in path/users/user1.crt -inkey path/users/user1.key -out /path/users/user1.p12
最后在nginx的配置中加入这几个字段就可以实现客户端验证的功能了。
ssl_crl /;
ssl_client_certificate /etc/nginx/certs/ca.crt;
ssl_verify_client on;
如果需要作废一个客户端证书
openssl ca -revoke clients/carrie.crt
然后重新生成crl (证书废弃列表)
openssl ca -gencrl -out intermediate/crl/intermediate.crl.pem\
验证一下客户端证书是否被真的作废:
openssl verify -CAfile ca.crt demoCA/certs/bob@example.com.cert.pem
然后生成的 crl 文件上传服务器,并在nginx中加入ssl_crl 字段,地址指向服务器上的 crl 文件。