HTTP学习笔记08 - 如何申请HTTPS证书


根据签发证书的CA的不同,证书可以分为2种:

  1. 由自己创建的CA签发的证书,通常叫做自签名证书;
  2. 由PKI的CA签发的证书,具有普遍可信的证书。

自签名证书

之前12306的证书就是一个自签名证书,所以浏览器第一次打开12306的官网时,会被提示不安全。但是现在已经改为由PKI签发的证书,可以正确通过浏览器的证书检查了。 但是,这并不意味着自签名证书就没有用。比如在内网中,为了测试或者部署内部服务,为了成本考虑,可以签发一些自签名证书,由于时内网环境,我们已经100%确认对方的身份,所以就不需要PKI来帮助我们校验证书是否正确。

使用openssl创建自签名证书:

制作CA证书:

1. 创建CA私钥:openssl genrsa -des3 -out ca.key 2048
2. 制作解密后的CA私钥:  openssl rsa -in ca.key -out ca_decrypted.key
3. 生成CA根证书:  openssl req -new -x509 -days 7305 -key ca.key -out ca.crt

制作生成网站的证书并用CA签名认证

假设域名是: seraphln.com

1. 生成域名的证书私钥: openssl genrsa -des3 -out seraph.com.pem 2048
2. 制作解密后的域名私钥: openssl rsa -in seraph.com.pem -out seraph.com.key
3. 生成签名请求: openssl req -new -key seraph.com.pem -out seraph.com.csr
  1. 用CA进行签名
openssl ca -policy policy_anything -days 36500 -cert ca.crt -keyfile ca.key -in test4scloud-cndns.cn.csr -out test4scloud-cndns.cn.crt

Tips:

如果执行签名时出现

I am unable to access the ./demoCA/newcerts directory

那么可以这么解决:

mkdir -p demoCA/newcerts
touch demoCA/index.txt
touch demoCA/serial
echo  "01" > demoCA/serial

然后重新执行步骤3.

操作完成之后,我们就使用我们自己创建的CA,给域名seraphln.com创建了一个证书。这个证书使用的非对称加密算法为rsa2048,有效期是10年。

免费的DV证书

由于内网环境下,我们可以无条件信任对方,所以自签名的HTTPS证书已经可以满足需求,但是到公网上,由于网络环境过于复杂,所以必须依赖PKI的CA签发的证书才能解决信任问题了。 目前比较常用的免费的DV证书应该就是letsencrypt的证书了。

使用letsencrypt的certbot签发一个https证书

安装certbot

certbot是letsencrypt提供的一个签发证书的工具。它的下载地址为: certbot。 在页面中选择自己网站所在服务器的操作系统和webserver之后,网站会给出安装方法。 例如:

webserver -> nginx
os -> ubuntu16.04

所对应的安装方法为:

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx

使用certbot签发证书

执行:

sudo certbot --nginx

按照提示的流程即可给指定的网站添加一张免费的HTTPS证书了。

验证证书

在certbot签发证书完毕之后,可以在浏览器打开网站,例如: https://seraphln.com 可以看到,在导航栏已经有一个安全锁的标识了。它表示网站被HTTPS保护了。

收费的OV,EV证书

目前市面上OV和EV证书都是收费的。而且价格不便宜。 在证书领域,比较知名的证书提供商有: 赛门铁克(前阵子老被google怼),comodo(百度云加速的合作伙伴)等等。

将证书部署到nginx

优化nginx:

  1. 优化nginx性能: 在http{}中加入:
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
keepalive_timeout 70;

根据官方文档描述,cache中的1m可以存放4000个session。 同时提高ssl session的过期时间会减少同一个客户端跟服务端进行ssl握手建联的次数,能显著提高服务端的响应能力。