Catalog
  1. 1. 自签名证书
    1. 1.1. 1. 直接生成服务器秘钥和证书
    2. 1.2. 2. 通过自己的ca签发证书
  2. 2. 浏览器验证提示
自签名证书

自签名证书

可通过下面两种方式来签发证书。

1. 直接生成服务器秘钥和证书

1
2
//或者合并成一条命令
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout key.pem -out cert.pem -days 30

这里就生成了私钥 key.pem 和证书 cert.pem。

2. 通过自己的ca签发证书

1
2
3
4
5
6
7
8
9
10
// 生成 ca 私钥
openssl genrsa -des3 -out ca.key 4096
// 生成 ca 根证书
openssl req -x509 -new -nodes -key ca.key -sha256 -days 365 -out ca.crt
// 生成服务器私钥
openssl genrsa -out host.key 4096
//生成证书请求,这一步会要求输入一些信息。 COMMON NAME 字段需要填入域名或者 IP
openssl req -new -key host.key -sha256 -out host.csr
// 通过 ca 签发证书, cert.ext 文件内容在下面
openssl x509 -req -in host.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out host.crt -days 30 -sha256 -extfile cert.ext

这里就生成了证书文件 host.crt, 与 host.key 一起发布到站点。这种方式的好处是,只要将 CA 根证书设置为受信任后,那么通过这个 CA 签发的证书都是信任的了,方便增加新的证书。

准备文件 cert.ext。增加这个文件是因为我在使用过程中,即使将 CA 加入了浏览器信任的根证书(解决了ERR_CERT_INVALID错误),浏览器还会弹出一个 ERR_CERT_COMMON_NAME_INVALID 的错误,这个错误的含义是访问域名域名与证书中的 COMMON NAME 不一致,而实际上我确认了访问域名和证书的 COMMON NAME 是一致的(我使用的域名是假的,通过 hosts 配置的)。这个问题没有解决,所以有了下面这个替代方案,只能通过 IP 来访问(只能通过IP访问,否则还是会报错)。

1
2
3
4
5
6
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName

[ SubjectAlternativeName ]
IP.1=192.168.1.1(这里填上站点机器的IP)

浏览器验证提示

如果没有将 CA 根证书或者签发证书设置为受信任。那么浏览器可能就弹出一个风险提示,点击继续访问(其实就是跳过验证证书)。而一些SDK则会报错,一般会提供参数设置来跳过证书的验证。如果是作为测试用的话,直接跳过验证还是最方便的,除非没有这样功能的参数时,才考虑去签发证书。

Author: 42
Link: http://blog.ikernel.cn/2020/06/28/%E8%87%AA%E7%AD%BE%E5%90%8D%E8%AF%81%E4%B9%A6/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.

Comment