写在开始
开发完网站需要上线的一个重要步骤就是对网站进行HTTPS的改造,谁也不想自己的网站顶着个大红叉,提示说你的网站不安全,这令人非常难受。
这就要求开发者申请SSL证书,对网站进行HTTPS改造,使用HTTPS请求之后,就会提示安全,还能查看到网站所使用的SSL证书的详情,看着就让人身心舒畅。申请通配符证书说简单也简单,说难也许是找不到方法,不想折腾的话可以花钱解决,我找了许多资料才折腾出来,但免费的SSL证书一半只有三个月期限,最近SSL证书又要过期了,但当我打开之前的教程网站,它居然502了,我顿感不妙,觉得还是有必要自己记录一下这个过程。
什么是HTTPS,什么又是SSL证书?
本小节从RunNoob引用
HTTPS
超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种网络安全传输协议。具体介绍以前先来介绍一下以前常见的HTTP,HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的,也就是明文,因此使用HTTP协议传输隐私信息非常不安全。HTTP使用80端口通讯,而HTTPS占用443端口通讯。在计算机网络上,HTTPS经由超文本传输协议(HTTP)进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网络服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的具体描述如下:
- 浏览器将自己支持的一套加密规则发送给网站。
- 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
浏览器获得网站证书之后浏览器要做以下工作:
- 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
- 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
- 使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
网站接收浏览器发来的数据之后要做以下的操作:
- 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
- 使用密码加密一段握手消息,发送给浏览器。
- 浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下:
非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
HTTPS协议和HTTP协议的区别:
- https协议需要到ca申请证书,一般免费证书很少,需要交费。
- http是超文本传输协议,信息是明文传输,https 则是具有安全性的SSL加密传输协议。
- http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的 。
- HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议, 要比http协议安全。
SSL证书
从前面我们可以了解到HTTPS核心的一个部分是数据传输之前的握手,握手过程中确定了数据加密的密码。在握手过程中,网站会向浏览器发送SSL证书,SSL证书和我们日常用的身份证类似,是一个支持HTTPS网站的身份证明,SSL证书里面包含了网站的域名,证书有效期,证书的颁发机构以及用于加密传输密码的公钥等信息,由于公钥加密的密码只能被在申请证书时生成的私钥解密,因此浏览器在生成密码之前需要先核对当前访问的域名与证书上绑定的域名是否一致,同时还要对证书的颁发机构进行验证,如果验证失败浏览器会给出证书错误的提示。
SSL证书可以向CA机构通过付费的方式申请,也可以自己制作。
CA机构颁发的证书价格非常昂贵,而且有效期一般只有一年到三年不等(年数不同,价格也不同),过期之后还要再次交钱申请,因此一般只有企业才会申请证书。但是随着个人网站的增多,目前也有针对个人的SSL证书服务,价格相对便宜一些,国内的话400多块钱就能申请到一个,国外更是有免费的SSL证书可以申请。
在申请SSL证书时需要向CA机构证明自己对域名有所有权。
此外,一个证书一般只绑定一个域名,如果CA机构心情好的话,会免费再绑一个,比如你要申请域名时绑定的域名是 www.maisblog.cn,那么只有在浏览器地址是 https://www.maisblog.cn 的时候,这个证书才是受信任的,如果地址是https://iollab.maisblog.cn或者https://affine.maisblog.cn,那么这个证书由于访问的域名与证书绑定的域名不同,仍然会被浏览器显示为不受信任的。CA机构也提供申请通配符域名(例如,*.maisblog.cn),通配符域名相当于绑定了主域名下的所有域名,因此使用起来非常方便,但是价格也超级昂贵,一个通配符域名一年大概得5000块钱,只有企业才可以申请。免费的通配符证书也有,一般很难找到申请免费通配符证书的途径,我也是找了好久才成功。
所以综上,现在可以回答标题的问题“什么是HTTPS,什么又是SSL证书?”:HTTPS是通过SSL证书加密HTTP通信的协议,SSL证书用于验证网站身份并确保数据传输的安全性。
免费的通配符证书申请
本小节参考从haoji.me中参考,但博客现已提示502 Bad Gateway
免费的通配符证书提供了一个经济实惠的方式来保护多个子域,适用于成本敏感的小型网站和开发环境。它支持自动化申请和续期,减少了管理负担。然而,免费证书通常有效期较短(如90天),且某些浏览器或企业环境可能不完全信任。此外,免费证书通常缺乏高级功能或附加服务,如增强型验证(EV)或保险,因此可能不适合要求更高安全性的企业级应用。
通过acme.sh配置永久有效ssl证书
安装acme
将acme.sh安装到~/.acme.sh/目录,其会自动配置一个名叫acme.sh的alias。
curl https://get.acme.sh | sh
获取DNS解析密钥,为证明域名归属做准备
acme.sh支持阿里云、腾讯云、godaddy等数十种解析商的自动集成,这里以阿里云为例,其它的参考官方介绍。访问https://ram.console.aliyun.com/users/create,如果还没有创建过用户这里创建一个,选择使用永久AccessKey访问。千万记住,创建完一定要注意及时保存 AccessKey 信息,页面关闭后将无法再次获取。
进入用户,赋予操作DNS解析的权限,点击新增授权。
搜索云解析,将搜索出来的权限全部添加,然后确认授权即可。
生成SSL证书
首先需要使用acme来注册SSL厂商账号,acme.sh支持好几个ssl厂商,使用ZeroSSL厂商能够一行命令行就注册完毕。
source ~/.bashrc
acme.sh --register-account -m xxx@youremail.com --server zerossl
再在shell中指定上面获得的阿里云的操作密钥。
export Ali_Key=<key>
export Ali_Secret=<secret>
使用acme自动添加域名TXT解析,以证明域名的归属权,当证明完成后,会自动生成证书,时效为三个月。
acme.sh --issue -d maisblog.cn -d *.maisblog.cn --dns dns_ali
生成成功会提示你有四个文件,这四个文件就是生成的SSL证书。
如果是宝塔部署SSL的话,就很简单了,把域名.cer
的内容复制到证书(PEM格式)栏目中,把域名.key
的内容复制到密钥(KEY)栏目中,点击保存就部署成功了。
写在最后
听说acme有自动续约与自动部署的功能,但是我还没试过,下次到期的时候再试试。