目录

SSL 证书

SSL Certificate

TLS (Transport Layer Security) 过去被称为 SSL(Secure Sockets Layer)。

SSL协议发布到3.1版本时,重新起了个名字叫TLS(1.0版本)。

在实际的应用中SSL和TLS是一样的。

SSL是一种安全协议,运行于TCP/IP层之上,使用户安全的加密数据和认证服务器/供应商的身份。

虽然你可以使用自签署证书来提供 https,但是由于自签署证书的不可靠性,真实用起来受到重重限制,特别是谷歌浏览器对于自签署证书的限制非常大。因此,简单获取免费、可靠 https 证书的手段你必须具备。

申请证书的时候是要提供主机名的,比如 www.ynthm.com,因为主机名是需要写进证书中的。还有一个种是只提供通配主机名而非具体主机名的,比如 *.ynthm.com,这种叫泛域名证书或者通配符证书,也就是只要是这个域下的所有二级域名都可以使用这个证书。

Let’s Encrypt

Let’s Encrypt —— 是一个由非营利性组织 互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构(CA),简单的说,就是为网站提供免费的 SSL/TLS 证书。

Let’s Encrypt颁发的HTTPS证书一般包括以下几个文件:

  • cert.key(PEM格式):私钥文件
  • cert.cer(PEM格式):证书文件
  • fullchain.cer(PEM格式):包含证书和中间证书

验证有两种方式,假如我现在申请的主机名是 www.ynthm.com

  • 第一种验证方式:Let’s Encrypt 会通过访问 http://www.ynthm.com/.well-known/acme-challenge 由客户端工具生成的验证文件,验证通过会在服务器上生成证书文件。因此你在使用客户端时需要指定你 web 服务器的根目录,这样它才能够在相应目录下生成验证文件;
  • 第二种验证方式:如果你申请的主机名并不对外,只是内部使用,或者你申请的是泛域名证书时,就可以使用第二个验证方式了。你需要在公网的 dns 域下面添加一条 TXT 记录,比如我就要在 *.ynthm.com 这个域下添加一个 TXT 记录,记录的内容客户端工具会给出。Let’s Encrypt 解析出来的 TXT 记录如果和客户端工具给出的一致,那么同样生成证书文件。

Let’s Encrypt 官方的客户端工具是 certbot

只要你懂得 ACME 协议,也可以写一个客户端工具

acme.sh

推荐指数:★★★★★ 免费证书类型:DV 域名型 免费证书品牌:Let’s Encrypt 免费通配符证书:支持 易操作性:一般 证书有效期: 90天 自动更新:支持 自动部署: 支持

acme.sh 是一个知名的用于申请Let’s Encrypt证书的开源项目,也是属于脚本类型,有比较详细的文档,支持自动化更新和自动化部署。唯一缺点,如果有更新后自动部署至多个节点的需求的话,acme.sh无法满足。如果你有一定的命令行使用经验,acme.sh使用起来还是非常方便,强烈推荐!关于更新后自动部署至多个节点的需求,建议使用下面介绍的ohttps。

OHTTPS

推荐指数:★★★★★ 免费证书类型:DV 域名型 免费证书品牌:Let’s Encrypt 免费通配符证书:支持 易操作性:简单 证书有效期: 90天 自动更新:支持 自动部署: 支持

ohttps 提供了类似于acme.sh的功能,不过提供了友好的管理界面,可申请Let’s Encrypt免费通配符类型证书,还提供了证书吊销、到期前提醒、自动更新、自动部署功能。另外比acme.sh增加了一些非常实用的功能,主要包括可自动部署至阿里云、腾讯云、七牛云的负载均衡、内容分发CDN、SSL证书列表等,并可自动部署至多个nginx容器中。如果你有在证书更新后自动部署至多个不同节点的需求,使用 ohttps 就对了,强烈推荐大家使用 ohttps 申请和管理 Let’s Encrypt 颁发的免费HTTPS证书。

证书过期

如果域名已经指向了 web 服务器,在浏览器上可以正常访问。如果域名正常,浏览器地址左边会有一个锁图标,如果有问题这个锁图标会提示不安全,点击这个地方就可以看到证书的详情。

当然可以使用 openssl 命令查看

1
2
3
openssl x509 -in signed.crt -noout -dates
openssl x509 -in /opt/nginx/ssl/ynthm.com/fullchain.cert.pem -noout -dates
openssl x509 -in /etc/nginx/ssl/fullchain.cert.pem  -noout -dates

https 双向认证

根证书:是生成服务器证书和客户端证书的基础,是信任的源头,也可以叫自签发证书,即CA证书。

服务器证书:由根证书签发,并发送给客户,让客户安装在浏览器里的证书。主要包含服务端的公钥、域名和公司信息,浏览器客户端会验证自己请求的地址是否和证书里面的地址是否相同。

客户端证书:由根证书签发,需要导入到服务器的信任库中。主要包含客户端公钥、域名和公司信息。

单向验证:如果是你客户端,你需要拿到服务器的证书,并放到你的信任库中;如果是服务端,你要生成私钥和证书,并将这两个放到你的密钥库中,并且将证书发给所有客户端。

双向验证:如果你是客户端,你要生成客户端的私钥和证书,将它们放到密钥库中,并将证书发给服务端,同时,在信任库中导入服务端的证书。如果你是服务端,除了在密钥库中保存服务器的私钥和证书,还要在信任库中导入客户端的证书。

服务器端密钥

1
2
3
4
# 生成服务器端私钥
openssl genrsa -out server.key 2048
# 生成服务器端公钥
openssl rsa -in server.key -pubout -out server.pem

客户端密钥

1
2
3
4
# 生成客户端私钥
openssl genrsa -out client.key 2048
# 生成客户端公钥
openssl rsa -in client.key -pubout -out client.pem

CA机构密钥(这一步是CA机构操作,这里演示过程)

1
2
3
4
5
6
# 生成 CA 私钥
openssl genrsa -out ca.key 2048
# X.509证书签署请求管理。
openssl req -new -key ca.key -out ca.csr
# X.509证书数据管理。
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt -days 3650

这里是填写,颁发者的信息,即CA机构的信息

颁发证书(这一步是CA机构操作,这里演示过程)

颁发证书,即签名服务器证书,生成crt文件

颁发服务端证书

1
2
3
4
# 服务器端需要向 CA 机构申请签名证书
openssl req -new -key server.key -out server.csr
# 向 CA 机构申请证书,签名过程需要 CA 的证书和私钥参与,最终颁发一个带有 CA 签名的证书
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt -days 3650

颁发客户端证书

1
2
3
4
# client 端
openssl req -new -key client.key -out client.csr
# client 端到 CA 签名
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt -days 3650

这里是填写,使用者的信息,即自己公司的信息。

生成pkcs12格式证书(这一步也不是必须,这里演示过程)

生成pkcs12格式证书(该格式证书包含CA证书,私钥和自己的证书)

在tomcat中实现双向认证有时需要pkcs12格式的证书(该证书包含根证书、服务器端或客户端的证书和密钥文件)

生成pkcs12服务器证书 server.p12,需要输入2次密码,设置密码为123456

1
openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 -name server -CAfile ca.crt -caname ca

生成pkcs12客户端证书 client.p12,需要输入2次密码,设置密码为123456

1
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name client -CAfile ca.crt -caname ca

注意:若要设置密码为空,不用输入密码,直接回车。

服务器端,将客户端证书导入为受信任的证书

1
keytool -import -trustcacerts -file client.crt -alias client -storepass 123456 -keystore client.jks