Posts Https信任证书申请与非信任证书生成方式, 适用于tls双向安全校验
Post
Cancel

Https信任证书申请与非信任证书生成方式, 适用于tls双向安全校验

1. 前言

根据Apple声明2017年元旦会禁用与停止在IOS平台使用HTTP协议与后端进行接口交互;促使后端的接口统一需要更换为HTTPS的协议,而且将来会是一大趋势,目前很多国内外大型网站也都陆续更换了HTTPS协议进行交互;所以本人正好利用这个机会进行学习并对工作当中所学到的内容进行整理,以便帮助后面的同学更方便进行学习与了解;如果有什么写的不准确的地方请给我留言,我会尽快进行修正,谢谢!

2. 说明

这里主要针对证书生成进行阐述,不会具体讲解SSL/TLS的基础理论;想要了解具体概念可以参考SSL/TLS图解;证书的生成方式取决于每个人具体的需求而不同;安全校验分为两种,单向与双向;分为受信任与非受信任(即浏览器显示的红色叉叉);

  1. 单向只需要服务器证书即可,客户端不需要额外提供任何证书即可访问;而双向不仅服务端需要证书而客户端也需要提供证书才可进行访问;
  2. 所谓的受信任就是需要找国际CA根信任机构或子机构签名过的,而非受信任就是自己充当CA机构角色给自己签名。

3. 注意

双向受信任证书生成的做法我这边暂时没弄,所以具体可以参考双向非受信任证书生成举一反三试一试;我想原理应该大致相同。

4. 样例环境

操作系统CentOs 7,网页服务器采用nginx/1.10.2。

5. 单向受信任证书生成

我这里找这家信任机构letsencrypt申请的证书,具体使用了一款工具certbot自动生成证书直接拿来使用,如果想手动的话直接打开这个机构网站走注册与申请流程即可。

5.1 注意

  1. 必须要使用一个域名来进行生成证书;

  2. 在生成证书过程中,信任机构会通过域名(http://ssl.nakedhub.cn/.well-known/acme-challenge/tJjLPXG_s_oCcsJDv2fScMZDGmHfWbbdt9vfaQusOtE )访问目录校验相关文件信息;

  3. 这个工具理论上只需要安装在某台专用主机上就可以了,以后方便证书统一管理;生成证书时需要访问的域名目录地址可以使用反向代理映射即可。

5.2 开始生成

具体安装方式与界面操作我就不贴出来了,直接参考certbot文档即可;打开图形界面后选择第一项输入域名信息;然后再下一步选择一个能被信任机构访问到的目录位置(这里参考注意点2与3)就可以了。

1
certbot certonly

5.3 Nginx核心配置

1
2
3
4
5
6
7
8
9
listen       443;
server_name  ssl.nakedhub.cn;
    
ssl on;
#方式一:不包含证书链(这种方式浏览器访问属于安全,某些操作系统通过curl识别非安全,因为CA机构证书链在操作系统不存在)
ssl_certificate /etc/letsencrypt/live/ssl.nakedhub.cn/cert.pem;
#方式二:包含证书链(浏览器访问正常,并且curl也识别安全)
ssl_certificate /etc/letsencrypt/live/ssl.nakedhub.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ssl.nakedhub.cn/privkey.pem;

6. 单向非受信任证书生成

主要采用openssl命令行进行操作生成证书。

6.1 生成CA证书

1
2
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

6.2 生成服务器证书

1
2
3
4
echo subjectAltName = DNS:ssl.nakedhub.cn >> extfile.cnf
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=ssl.nakedhub.cn" -sha256 -new -key server-key.pem -out server.csr
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf

注意:Chrome 浏览器会严格校验 subjectAltName 而 Safari 则不会,一定要把这个加上。

6.3 Nginx核心配置

1
2
3
4
5
6
listen       443;
server_name  ssl.nakedhub.cn;
    
ssl on;
ssl_certificate /home/certs/server-cert.pem;
ssl_certificate_key /home/certs/server-key.pem;

6.4 测试并查看结果

直接通过浏览器打开或curl看到结果,curl要加非受信任(–insecure)的选项,否则不会成功。

1
curl https://ssl.nakedhub.cn --insecure

7. 双向非受信任证书生成

双向方式生成CA证书与服务器证书和单向的相同,唯一不同的需要再生成客户端所需要的证书,只要通过同一个CA签名后就可以了。

7.1 生成客户端证书

1
2
3
openssl genrsa -out client-key.pem 4096
openssl req -subj "/CN=client" -sha256 -new -key client-key.pem -out client.csr
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem

7.2 Nginx核心配置

1
2
3
4
5
6
7
8
listen       443;
server_name  ssl.nakedhub.cn;
    
ssl on;
ssl_certificate /home/certs/server-cert.pem;
ssl_certificate_key /home/certs/server-key.pem;
ssl_client_certificate /home/certs/ca.pem; #CA证书
ssl_verify_client on; #需要客户端提供证书校验

7.3 利用CURL测试查看结果

证书位置最好使用绝对路径,相对路径也必须用(./)才能正确找到证书。

1
curl https://ssl.nakedhub.cn --cacert /home/certs/ca.pem --cert /home/certs/client-cert.pem --key /home/certs/client-key.pem

7.4 生成浏览器或JAVA可识别的证书

主要把已有的客户端证书转成PKCS12格式文件并输入此文件的密码锁即可,至于生成之后如何在浏览器导入并使用可以搜索一下Chrome/IE如何导入数字证书即可测试。

1
openssl pkcs12 -export -clcerts -in /home/certs/client-cert.pem -inkey /home/certs/client-key.pem -out ./client.p12

8. 查看证书信息

我们可以利用 openssl 查看证书的相关信息(如有效期、公司与IP地址信息),参考下面内容命令。

1
2
3
openssl x509 -in cert.pem -noout -text
openssl x509 -in cert.pem -noout -dates
openssl x509 -in cert.pem -noout -enddate

9. 参考资料

https://blog.imdst.com/nginx-ssl-shuang-xiang-ren-zheng-key-sheng-cheng-he-pei-zhi/

https://docs.docker.com/engine/security/https/

http://ustory.lofter.com/post/33be15_cddd2df

This post is licensed under CC BY 4.0

Git 常用的命令汇总

Ssh之传统方式接入分布式会话(spring session)篇

Comments powered by Disqus.