1.写在前面
让我们想象一下这个场景
一天,你买了一个域名。可能是正式的com,也可能是便宜的top,xyz什么的。
总之,你终于可以把域名挂在你的网站上面了。
但是,因为没有https,你和网站的数据全程明文发送,包括用户名和密码。
好吧,于是你选择搞一个证书。你去了阿里云之类的服务商看一下。
我去,这价格是你域名的多少倍了。
你决定自己给自己签一张10年的证书算了,但是这样你的浏览器就要红温(警告)了。
于是,在心灰意冷下,你搜索免费证书,看到了这篇文章(可能吧)。
2.了解证书
这里是科普部分,想看部署的可以去下一节。
我们知道,http协议是明文传输。为了安全,有了https。
HTTPS 的安全性主要依赖于 SSL/TLS 协议的密钥交换过程。
- 浏览器请求(Client Hello):浏览器向服务器发送一个消息,包含支持的加密算法和一个随机数。
- 服务器响应(Server Hello):服务器选择加密算法,返回一个随机数和它的数字证书(包含公钥)。
- 浏览器验证证书:浏览器验证服务器证书的有效性和真实性。
- 生成预主密钥(Pre-Master Secret):浏览器生成一个随机的预主密钥,并使用服务器的公钥加密后发送给服务器。
- 服务器解密:服务器用自己的私钥解密预主密钥。
- 生成对称密钥:浏览器和服务器使用两个随机数和预主密钥生成会话密钥。
- 加密通信:使用会话密钥进行对称加密通信,确保数据传输的安全性。
证书中包含服务器的公钥,浏览器可以使用这个公钥加密生成的随机密钥(预主密钥),然后发送给服务器。只有持有对应私钥的服务器才能解密这个随机密钥,确保密钥交换的安全性。
证书的类型有DV、OV、EV。
- 域名验证证书(Domain Validation, DV):
- 特点:验证证书申请者对域名的所有权,验证过程快速简单。
- 适用场景:适用于个人网站、小型企业网站等不需要高度信任的场合。
- 企业验证证书(Organization Validation, OV):
- 特点:在验证域名所有权的基础上,还需要验证申请者的企业身份信息。
- 适用场景:适用于需要用户信任的中型企业和组织网站。
- 扩展验证证书(Extended Validation, EV):
- 特点:验证最为严格,需要详细审核企业身份和运营情况,验证时间较长。
- 适用场景:适用于金融机构、大型电商、政府机构等需要高度信任的场合。
知道自己该选什么证书了吧 (你也没得选,怎么可能给你免费的OV、EV ( ̄▽ ̄)” )
那么,我们以Let’s Encrypt为证书提供商演示。
3.获取证书
为什么选择Let’s Encrypt?
因为它可以签更多子域名,我记得zerossl好像才给主域名和www子域名
你可以随便打开几个别人的博客看看,有些就是Let’s Encrypt的证书 (比如我)
好了,首先,我们需要在服务器安装certbot。这是一个自动签发证书的软件。
对于Debian系,首先安装snap
apt install snapd
RHEL系
yum install snapd
然后再用snap安装certbot
snap install --classic certbot
什么?你问我为什么不加sudo?因为我是root战神,而且我相信你现在也是ssh挂root。
ln -s /snap/bin/certbot /usr/bin/certbot
执行完这些,就可以运行certbot命令了。
certbot获取证书首先要验证你的域名,比如网站目录验证、DNS验证这些。
网站在docker里或者没建好会影响网站目录验证,这里以DNS验证为例。
建议写好DNS记录后再申请。
sudo certbot certonly --manual --preferred-challenges=dns -d <你的域名>
这里输入你的邮箱
让你阅读什么条款,选Y
是否允许给你发垃圾邮件,看你的情况。
验证环节,在你的DNS里加一条TXT记录,指向_acme-challenge.<你的域名>
内容就是中间那一串东西,Let’s Encrypt和cloudflare合作了。所以如果你是在cloudflare的DNS,应该会很快。
等一会后按回车。
申请成功,证书和私钥在/etc/letsencrypt/live/那里。
其实你也可以事先自己生成私钥,然后写一份csr申请的。
至于配置,因为apatch和nginx有不同的配置方法。这里以nginx为例。
4.配置
编辑你的nginx.conf,其实主要就这三个。
ssl_certificate /www/sites/www.trfcutt.top/ssl/fullchain.pem;
ssl_certificate_key /www/sites/www.trfcutt.top/ssl/privkey.pem;
ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;
在你的server块里找到这些,没有的可以去复制粘贴网上的。
ssl_certificate改成证书位置,ssl_certificate_key改成私钥位置。
第三个是支持的算法。
成功的话,就可以用https进了。