上周看nginx视频,中间看到https的部署,发现了很多自己一直以来都能接触到,但是完全不了解的专业名词。于是暂停视频,花了三天的时间,吧https相关的协议原理和证书类型都了解一下。

周末重写了https的工作原理,今天快下班没事,吧https部署写一下。之后就要开始撸ansible了。

证书类型

目前主流的SSL证书主要分为DV SSL 、 OV SSL 、EV SSL。

数字证书 DV SSL OV SSL EV SSL
用户建议 个人 组织、企业 大型企业、金融机构
公信等级 一般
认证强度 网站真实性 组织及企业真实性 严格认证
安全性 一般
可信度 常规 高(地址栏绿色)

要购买或者签发SSL证书,需要先在本地生成CSR,其中包含域名、所有人、位置等,然后根据CSR签发对应的证书。

自签证书

CentOS系统已经安装了openssl,可以用来生成自签证书,但是这种证书由于其CA不在主机的受信任列表,只能用来做加密,无法提供任何验证,而且需要在浏览器中手动确认。

1
2
3
4
5
6
#生成私钥
openssl genrsa -idea -out mansur.key 1024
#生成证书申请请求CSR
openssl req -new -key mansur.key -out mansur.csr
#使用私钥签发证书
openssl x509 -req -days 3650 -in mansur.csr -signkey mansur.key -out mansur.crt
1
2
#直接生成符合苹果ATS规范的证书和对应私钥
openssl req -days 3650 -x509 -sha256 -nodes -newkey rsa:2048 -keyout mansur.key -out mansur_apple.crt

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@CentOS7-copy tmp]#   openssl req -days 3650 -x509 -sha256 -nodes -newkey rsa:2048 -keyout mansur.key -out mansur_apple.crt
Generating a 2048 bit RSA private key
....+++
.........................................................................................................................+++
writing new private key to 'mansur.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Chaoyang
Organization Name (eg, company) [Default Company Ltd]:NBMABLOG
Organizational Unit Name (eg, section) []:Net
Common Name (eg, your name or your server's hostname) []:nbma.info
Email Address []:i@nbma.info

[root@CentOS7-copy tmp]# ll
总用量 12
-rw-r--r-- 1 root root 1391 4月 17 10:14 mansur_apple.crt
-rw-r--r-- 1 root root 1704 4月 17 10:14 mansur.key

Let’s encrypt免费证书

Let's encrypt可以签发免费的DV证书,常用于个人网站,但是其证书有效期只有三个月,需要手动续租。
具体怎么签发,还有待研究,github上有很多脚本可以实现。
签发完成后会得到四个文件

cert.pem #网站证书
chain.pem #链证书
fullchain.pem #网站证书+链证书
privkey.pem #私钥

nginx配置

不想写注释了,就这么看吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server
{
listen 80;
listen 443 ssl http2;
server_name nbma.info;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/nbma.info;

#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;

#HTTP_TO_HTTPS_START
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END

ssl_certificate fullchain.pem;
ssl_certificate_key privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;

#SSL-END

#.....
}

证书

另外,做完上面这些发现有个问题,这些证书有的是.key格式,还有crt、pem等,专门查了一下,其实在unix中证书的这几个扩展名无所谓。他不过是一串字符串。但是,对于证书而言,他有两种不同的编码格式需要注意;
首先所有的证书都是满足X.509标准的,这个标准定义了证书中应该包含哪些内容,具体需要查看RFC5280
在这个标准之下,不同的操作系统或者中间件常用的编码方式也不一样:

PEM - Privacy Enhanced Mail,打开看文本格式,以”—–BEGIN…”开头, “—–END…”结尾,内容是BASE64编码.
查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout
Apache和Linux服务器偏向于使用这种编码格式。

DER - Distinguished Encoding Rules,打开看是二进制格式,不可读.
查看DER格式证书的信息:openssl x509 -in certificate.der -text -noout -inform der
Java和Windows服务器偏向于使用这种编码格式.

更多有关证书的说明,请查阅参考文档:
那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)