Physical Address:
ChongQing,China.
WebSite:
在我们进行网站搭建或者说是节点搭建时,经常会用到SSL证书,那么什么是SSL证书,为什么需要证书以及如何去申请证书,这篇文章就来简单记录一下。
在互联网早期,网页浏览都是通过http协议,而http本身是明文的,这就意味着任何一方只要截获到你的数据都可以轻松的获取客户端与服务端传送的内容。后来随着技术的发展,我们有了https,那么https其实就是在http的基础上通过ssl加密了关键信息,使得客户端与服务端的通信内容被加密,从而保障了数据安全。
什么是SSL:Secure Sockets Layer,用于保证互联网数据传输的安全性。
什么是TLS:Transport Layer Security,TLS其实是SSL的延申与增强。
无论是SSL还是TLS,其实都是在传输层与应用层之间对网络链接进行加密,本质上其实是一致的。
公钥与私钥:公钥和私钥是成对出现的,公钥顾名思义,就是内容公开的密钥,而私钥则是不被公开,为某一方私有的密钥。在使用公钥加密后,只有对应的私钥可以解密,同样的在使用私钥加密后,只有对应的公钥可以解密。
加密方式:主要分为对称加密和非对称加密,对称加密包括如DES,3DES与AES等,而非对称加密则包括ECC、RSA与DSA等。总的来说,非对称加密具有更高的安全性。
加密过程:简单来讲,就是客户端先向服务端索要公钥,拿到公钥后进行信息的加密处理然后发送给服务器,服务器再使用私钥来进行解密。为了保证这个公钥是可信的,将公钥放到数字证书内,只要数字证书可信(合法的CA、域名对应,有效期对应等),则公钥就是可信的。在实际使用过程中,使用证书中的公钥与私钥进行加密的行为其实只发生在双方连接过程中,在连接过程中通过协商产生会话密钥,通过会话密钥来真正加密通信的内容。
数字证书:就好比一个护照,可以用于标识证书持有者的一些信息。证书会由第三方的证书授权机构(Certification Authority,简称CA)进行颁布,证书内包含的信息包括公钥信息,证书持有者的身份信息,证书颁布者CA方的信息以及有效日期等。
我们通常说的acme一般是指acme脚本,用于方便快捷地申请证书。实际上acme自身是一种协议,其英文全称为Automated Certificate Management Environment,最早由Let‘s Ecrypt进行开发。
在这里我们引用acme仍特指acme脚本。Acme脚本在申请证书时支持多种系统环境,支持多个CA方,如Let‘s Encrypt、ZeroSSL、BuyPass等,同时还支持多种方式进行申请,具体包括:
备注:此处所列模式未详尽
首先我们需要获取acme脚本,在这里我们通过如下命令进行获取:
sudo curl https://get.acme.sh | sh
在获取过程中我们可以看到一些关键信息,其默认会检查系统工具,如cron等,如没有这些基础工具,是无法正常进行安装acme的。
安装之后效果如图所示:
在安装完成之后我们第一步要做的是修改默认CA,由于当前最新的acme是以ZerroSSL作为默认CA方的,而他家的证书存在数量限制,如果我们需要申请多个证书时会有些不方便,所以一般我会将默认CA方变更为Let‘sEncrypt,这样就没有证书数量的限制了,使用如下命令切换默认CA:
acme.sh --set-default-ca --server letsencrypt
切换默认CA后,我们开始正式的证书申请。
1.standalone模式
使用standalone模式需要有两个条件,一是安装socat工具,二是保证相应的http监听端口开放,默认为80端口。安装socat工具:
sudo apt install socat
在Ubantu系统中,默认是端口开放的,我们通过ufw进行防火墙的设置,一般情况下不需要进行额外的设定,但是不同的系统默认设置不一样,在申请证书前请自行检查是否有开放相关端口。
如以上条件满足,则使用如下命令进行证书申请:
acme.sh --issue -d example.com --standalone
当然如果80端口不能开放,但有其他的端口可以使用,可以使用–httpport port指定对应的端口,申请成功的效果如图:
2.standalone tls ALPN模式
如果你没有开放80端口,但是443端口是开放的,则可以使用如下命令进行申请,同时还可以指定证书类型
acme.sh --issue -d example.com --alpn --keylength ec-256
这里–keylenth用于指定证书加密类型,默认为RSA加密,长度为2048,可选参数包括2048,3072,4096,8192或者ec-256与ec-384。默认的RSA加密支持程度高,但是相比ECC效率会较低,大家可以根据自己需要进行选择。
3. DNS API模式
如果你的域名服务提供商提供了相应的API,你也可以使用DNS API进行申请 。一般比较推荐使用Cloudflare进行解析。使用Cloudflare提供解析,一来是整个解析都是免费的,解析速度也比较快,二来我们可以利用Cloudflare的CND为我们的网站增加CDN。而使用DNS API进行证书申请最大的好处在于,可以不用依赖任何端口完成证书申请。
使用Cloudflare DNS API进行证书申请,需要获取API Key以及对应的账户邮箱。Cloudflare的API key可在“我的个人资料”->”API 密钥“中进行查看。
获取API密钥后,需要导入相关环境变量,注意这里的CF_Key与CF_Email需要填写为你个人Cloudflare账户对应的:
export CF_Key=”sdfsdfsdfljlbjkljlkjsdfoiwje”
export CF_Email=xxxx@sss.com
之后通过如下命令完成申请:
acme.sh --issue -d example.com --dns dns_cf
4.Nginx模式
如果你的网站使用了Nginx作为web服务,那么可以使用Nginx模式进行申请。
acme.sh --issue -d example.com --nginx
该命令需要用到nginx.conf配置文件,acme会自动寻找。但有些时候可能会无法准确定位,此时可以通过指定nginx.conf进行申请
acme.sh --issue -d example.com --nginx /etc/nginx/nginx.conf
5.Apache模式
如果你的网站使用的是Apache而非Nginx,那么也可以通过Apache模式进行申请,使用如下命令进行申请:
acme.sh --issue -d example.com --apache
在证书申请成功后,acme会在cron定时任务内添加相关任务,保证证书每60天更新一次,这样就不用担心证书过期了。
更多的证书申请方式可以参考官方Wiki:
https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
上述内容其实只是证书的申请,在证书申请之后我们还需要进行安装。证书安装使用如下命令:
acme.sh --installcert \
-d example.com \
--ca-file /path/ca.cer \
--cert-file /path/example.com.cer \
--key-file /path/example.com.key \
--fullchain-file /path/fullchain.cer
其中/path为自定义路径。
如果你想将证书安装到Nginx与Apache环境下,可以使用如下命令:
Nginx:
acme.sh --install-cert \
--domain example.com \
--cert-file /path/to/cert/cert.pem \
--key-file /path/to/keyfile/key.pem \
--fullchain-file /path/to/fullchain/fullchain.pem \
--reloadcmd "sudo systemctl reload nginx.service"
Apache:
acme.sh --install-cert \
--domain example.com \
--cert-file /path/to/cert/cert.pem \
--key-file /path/to/keyfile/key.pem \
--fullchain-file /path/to/fullchain/fullchain.pem \
--reloadcmd "sudo systemctl reload apache2.service"
以上就是安装的过程了。
1.申请泛域名证书:本身acme支持申请泛域名证书,关于何为泛域名证书这里不做过多解释。申请泛域名证书时-d参数为*.example.com即可使n个三级域名(a.example.com,b.example.com,c.example.com…)都使用该证书。
2.查看当前系统环境下的所申请的证书信息,可以使用如下命令进行查看:
acme.sh --list
3.Acme脚本自动更新:Acme本身是存在版本迭代的,为了保证我们正常使用,最好是开启Acme自动更新,使用如下命令开启自动更新功能:
acme.sh --upgrade --auto-upgrade