程序员如何在 HTTPS 中高效配置通配符证书?| 技术头条
作者 | 阿文
责编 | 郭芮
HTTPS 并不是一个新鲜玩意......2017年1月1日起,苹果公司强制使用HTTPS 协议传输,其开发者必须使用 HTTPS 进行数据传输;2017年2月份,谷歌为了推进 HTTPS 的在网络上的应用,表示 Chrome 浏览器会将用户访问的 HTTP 页面标记为“不安全”——近几年,互联网巨头们都在极力地推广 HTTPS,目的就是为了保证数据安全。
现在,微信小程序也要求必须使用 HTTPS 协议,新一代的 HTTP/2 协议的支持也需以 HTTPS 为基础。
为什么巨头都放弃了 HTTP?
这要从 HTTP 这个协议本身说起。HTTP 是一个明文传输的协议,其协议设计时并没有提供数据加密的机制,因此在数据传输过程中,你的数据就相当于是在“裸奔“,这样带来的问题就是很容易被不法分子劫持。
HTTP 最容易被运营商劫持。当我们访问一个 HTTP 网站,其数据要经过运营商的网络进行数据传输,在传输过程中,运营商可以对 HTTP 协议进行劫持,修改 html 代码,在其中插入 JS 或 DOM 牟利。
除了运营商劫持之外, 通过 HTTP 协议进行数据传输还容易被攻击者监听和中间人攻击,从而获取网站帐户和敏感信息等。
HTTPS 的优势
因为 HTTP 协议不安全,因此有了 HTTPS,多了个 S,就多了一份安全。
HTTPS 是利用 SSL/TLS 来对 HTTP 数据包进行加密传输,这样一来,数据在传输过程中就不再是“裸奔”了。
HTTPS 提供了:
内容加密建立一个信息安全通道,来保证数据传输的安全;
身份认证确认网站的真实性;
数据完整性防止内容被第三方冒充或者篡改。
HTTPS 的信任继承基于预先安装在浏览器中的证书颁发机构,简称 CA。浏览器默认都会内置一些 CA 机构的根证书,只有可信任的 CA 机构颁发的证书,浏览器才会信任。
Let's Encrypt
Let's Encrypt 是一个是非营利性的互联网安全研究组(ISRG),它提供了一个免费、自动化和开放的证书颁发机构。目前 Let's Encrypt 已为 1.5亿个网站提供 SSL 证书。
Let's Encrypt 的优势:
免费:拥有域名的任何人都可以零成本获得可信证书;
自动:在Web服务器上运行的软件可以与其交互,以便轻松获取证书,安全地配置它以供使用,并自动进行续订;
安全:无论是在CA方面还是通过帮助网站运营商正确保护其服务器;
透明:所有颁发或撤销的证书将被公开记录,供任何人查阅;
开放:自动发布和续订协议将作为其他人可以采用的开放标准发布;
合作:就像基础互联网协议本身一样,是一项让社区受益的共同努力。
通过 Let's Encrypt 签发一个证书,目前其证书的生命周期为 90天,当证书快过期时,会自动向 Let's Encrypt 服务器发送续签申请,再续签一个周期。这一优势是其他按年签发免费证书无法提供的。
Let's Encrypt 之所以能够实现自动签发证书,实际上是依赖其提供的证书自动续签协议 ACME,目前IETF已将ACME协议标准化为RFC 8555。此外Let's Encrypt 还提供通配符证书,并且还是免费提供的,这也是在 CA 中少有的。
通过 ACME 协议,我们可以实现全自动化的管理证书,对于证书的操作,我们只需要做一次,后续的升级续签完全无需人工干预。
我们可以通过 acme.sh 这个开源项目来进行证书的签发和自动升级。acme.sh 是一个纯 SHELL 实现 ACME 协议的脚本。
使用 acme.sh 签发一个证书
首先,我们需要安装脚本:
curl https://get.acme.sh | sh
acme.sh 提供了多种方式来进行证书的签发,例如 DNS 模式、独立模式、Apache 模式、Nginx模式等等。
以 DNS 模式为例,我们签发一个证书:
acme.sh --issue --dns -d example.com -d www.example.com -d cp.example.com
如果需要签发一个通配符证书,我们可以这样:
acme.sh --issue --dns -d example.com -d *.example.com
脚本会发送请求到 CA 机构,CA 机构会要求你对域名进行认证,即需要你添加 TXT 记录来认证域名所有权。认证通过后,执行如下命令签发即可:
acme.sh --renew -d example.com
此外,该脚本最大的优势是支持自动API 集成,上述案例通过 DNS 方式签发证书需要手工干预,你需要到域名解析商添加TXT 记录,这对于做自动持续集成来说很不方便。因此acme.sh 提供了多家域名厂商的 API 集成,经过简单的配置即可完全自动化进行域名申请和域名解析的添加以及续签。
具体的使用方法可以参考说明文档(https://github.com/Neilpang/acme.sh/tree/master/dnsapi)。
以 Googaddy 为例,我们获取 AK 和 SK后执行:
export GD_Key=""
export GD_Secret=""
然后签发证书:
脚本会在120秒内调用域名解析商的接口自动添加域名解析然后完成认证。
签发完的证书会保存在 ~/.acme.sh/ 目录下,它包含以下几个文件:
通常建议加载证书选择公钥文件为fullchain.cer 的公钥文件,这样避免一些浏览器无法识别根证书或中间证书从而导致浏览器报错,例如提示证书不受信任。
接下来,在你的 Web 服务器进行证书的配置即可:
listen 443 http2 ssl;
server_name www.awen.me awen.me;
index index.html index.htm;
ssl_certificate /usr/local/nginx/ssl/awen.me.rsa.cer;
ssl_certificate_key /usr/local/nginx/ssl/awen.me.rsa.key;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!KRB5:!aECDH:!EDH+3DES;
ssl_prefer_server_ciphers on;
热 文 推 荐
☞ 套路贷+套路培训,IT 培训机构造假术大公开 | 程序员有话说
☞ 好莱坞大片! 为躲避死亡威胁, 只用15步, 这个密码朋克大叔就从世界"消失"了...
☞ Python 爬取蔡徐坤的 10 万转发数据,竟是假流量?
System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"