博文記錄
Nginx 2019-09-23 18:35:18 2783 1

一.生成自签证书

如果有购买证书的,可忽略此步骤。

生成方法一:

即直接拿 CA 证书当网站证书用,不考虑授信、不同系统的规范、证书合法性问题。选择该方法快捷简单!

# 生成 CA 密钥
openssl genrsa -des3 -out ca.key 2048
# 生成无密码的 CA 密钥
openssl rsa -in ca.key -out ca.key.nopass
# 生成证书请求, 这一步随便写, CN 即是你的域名, 可以填泛域名 *.eller.top 等
openssl req -new -key ca.key.nopass -out server.csr
# 通过私钥给证书请求签名生成证书
openssl x509 -req -days 365 -in server.csr -signkey ca.key.nopass -out server.crt

生成方法二:

通过创建 CA 根证书,再创建网站终端证书请求,并通过 CA 证书签发网站终端证书,完整模拟流程,此步骤可以将 CA 证书加入系统根证书信任区,以后该 CA 签发的任何证书自动信任

1.放置 CA 签发扩展文件

重点:basicConstraints=CA:TRUE ,表明要生成的证书请求是 CA 证书请求文件

cat > ca.ext <<-EOF
basicConstraints=CA:TRUE
keyUsage=critical, keyCertSign
subjectKeyIdentifier=hash
EOF

2. 建立 CA 密钥

创建 ca.key 密钥文件

openssl genrsa -out ca.key 2048

3. 创建证书请求

openssl req -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=eller/OU=ELLER/CN=eller.ca" \
-key ca.key -out ca.csr

利用密钥创建证书签署请求文件

4. 签发 CA 证书

将证书签署请求文件,通过 ca.key 密钥进行签署,生成 ca.crt

CA 证书时间可以长一些,比如 10 年。

openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt  -extfile ca.ext

5. 放置网站终端扩展文件

重点是:basicConstraints=CA:FALSE, 表明要生成的证书请求文件是终端证书请求文件

多个域名:alt_names 按照规则填写多个域名或者 IP,如果没有这个参数会爆 "NET::ERR_CERT_COMMON_NAME_INVALID"

如需 IP 证书:在下方 IP.1 里面配置,多个复制一行将数字递增。

cat > eller.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage=serverAuth
subjectAltName=@alt_names

[alt_names]
DNS.1=*.eller.top
DNS.2=eller.top
IP.1=192.168.1.1
EOF

6.创建网站终端密钥

创建网站用到的 ca.key 密钥文件

openssl genrsa -out eller.top.key 2048

7.创建网站签署请求文件

通过网站密钥创建网站证书签署请求文件

openssl req -new \
-subj "/C=CN/ST=Guangdong/L=Guangzhou/O=ELLER BLOG/OU=ELLER/CN=*.eller.top" \
-key eller.top.key -out eller.top.csr

8.通过 CA 证书签署生成网站证书

通过自己的 CA 证书以及 CA 密钥签署网站证书申请文件,生成最终网站证书

时间建议 365 天, 过长的时间,Android 设备不会信任。

# 使用 ca 证书签发终端证书
openssl x509 -req -in eller.top.csr \
-CA ca.crt \
-CAkey ca.key  \
-CAcreateserial \
-out eller.top.crt \
-days 365 \
-sha256 \
-extfile eller.ext

# 续签
openssl x509 -req -in eller.top.csr \
-CA eller.top.crt \
-CAkey eller.top.key \
-CAserial ca.srl \
-out eller.top.crt \
-days 365 -sha256 \
-extfile eller.ext

9.检查网站证书

openssl x509 -in eller.top.crt -text -noout

二.配置 HTTPS

/mnt/cert/xxx 为证书 存放路径,自行更正。

listen       80;
listen       443 ssl;
ssl_certificate /mnt/cert/xxx/server.crt;#你的证书位置
ssl_certificate_key /mnt/cert/xxx/ca.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

三.强制 http 跳转 https

强制 http 请求跳转到 https 上,可以配置两个 server,然后进行 301 跳转。这里通过判断域名的方式,更直接简单。

if ($scheme = 'http') {
	return 301 https://$host$request_uri;
}

四.配置 wss(websocket)

给 websocket 长连接请求增加上 tls 保护,使其原本的 ws 变成 wss。

这里和 http 请求配置 tls 基本一致,需要在其基础上增加 http 协议头参数,如下:

location /wsapp/ {
    proxy_pass http://wsbackend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
}

如果不增加如上参数,反向代理时原本的 websocket 请求就当做 http 请求反馈给后端,导致无法定位到具体资源。从而致使前端收到响应 404.

五.问题记录

看不到证书路径

windows 上双击服务器证书,看不到证书路径问题:

  1. 没有安装 ca 证书,一般提示:无法找到该证书的颁发者。安装之后就正常。
  2. 就算安了 ca 证书,提示 “找不到证书路径” 类似等,终端证书签发错误导致,如下示例:
# 错误签发示例(这是签发 CA 的方式不能混用)
openssl x509 -req -days 365 -extfile eller.ext \
-signkey ca.key \
-in eller.csr \
-out eller.crt  \

# 正确签发示例
openssl x509 -req \
-CA ca.crt -CAkey ca.key -CAcreateserial  -days 365 -sha256 \
-extfile eller.ext \
-in eller.top.csr \
-out eller.top.crt

basicConstraints 区别

1. 生成证书请求文件的时候。读者可查看 openssl.cnf 中 [req] 字段中扩展字段是 v3_req,在 v3_req 中有个 basicConstraints 变量,

​ 当 basicConstraints=CA:TRUE 时,表明要生成的证书请求是CA 证书请求文件

basicConstraints=CA:FALSE 时,表明要生成的证书请求文件是终端证书请求文件;

2. 在签发证书的时候。签发终端证书的时候使用默认扩展字段 usr_cert,当签发 CA 证书的时候再命令行使用了 extensions 选项指定 v3_ca 字段。

在默认的 usr_cert 字段中 basicConstraints=CA:FALSE;表明要签发终端证书

而在 v3_ca 字段中 basicConstraints=CA:TRUE;表明要签发 CA 证书

引用自:https://www.cnblogs.com/gordon0918/p/5436012.html

安卓证书信任

如果只是浏览器使用,直接安装 CA 证书即可。

如果是想让 APP 信任,某些 APP 只信任系统级别 CA 证书,那需要 magisk 的 root。同样安装后通过 movecert 模块将用户区的证书移动到系统区。(有的模块不是移动而是复制)

# 模块大致逻辑
cp -f /data/misc/user/0/cacerts-added/* /etc/security/cacerts/

如果放置到系统 CA 信任区,虽然 APP 信任了,但是又会有新的问题,Chrome 不信任了。源自 Chrome 的新规定出现的提示:

ssl 证书凭证未依透明政策公开
Android NET::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED

解决这个问题的方法,就是在 magisk 的黑名单里将 Chrome 勾选即可(若需重启就重启),但其实此时的 curl xxx.com 也是不信任证书的,这个问题不能算是完美解决。

Profile Picture
就不写

- From Web - 2019-09-24 15:45

路过


media iamge
StudioEIM - 冒险者讲习所
0:00