自签名ca证书

首先创建cert文件夹保存证书。

1
2
mkdir cert
cd cert

然后创建配置文件cert.cnf,注意如果时ip自签名就在your_IP填写自己的ip,如果是自签名域名就是在your_domain写自己的域名。

[dn]下CN字段是ca根服务器地址,alt_names下是ca验证的ip和域名地址,一般情况下这两个是一样的。

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
[req] 
prompt = no
default_bits = 4096
default_md = sha256
distinguished_name = dn
x509_extensions = v3_req

[dn]
C=CN
ST=Shanghai
L=Shanghai
O=TEST
OU=Testing Domain
CN=$your_IP or $your_domain
emailAddress=admin@localhost

[v3_req]
basicConstraints=CA:TRUE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage=serverAuth
subjectAltName=@alt_names

[alt_names]
IP.1=$your_IP
DNS.1=$your_domain

根据配置文件生成证书。

1
openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout cert.key -out cert.crt  -config cert.cnf

当前目录下生成两个文件cert.crt和cert.key,至此自签名步骤完成。

nginx反向代理

docker拉取nginx镜像。

1
docker pull nginx

新建一个容器获取config文件。

1
2
3
4
docker run -d  --name nginx nginx
docker cp nginx:/etc/nginx/nginx.conf ./nginx.conf
docker stop nginx
docker rm nginx

在config文件的http内加入如下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server{
listen 443 ssl;
server_name $your_ip or website;

ssl_certificate /cert/cert.crt;
ssl_certificate_key /cert/cert.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #安全链接可选的加密协议
ssl_prefer_server_ciphers on; #使用服务器端的首选算法

location / {
proxy_pass http://$your_proxy_ip:$your_proxy_port;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Accept-Encoding gzip;
}
}

使用nginx反向代理。

1
docker run -d --restart=always -p $your_port:443 --name nginx -v "$PWD"/nginx.conf:/etc/nginx/nginx.conf -v "$PWD"/cert:/cert nginx

更新nginx

1
2
3
4
#测试配置文件
docker exec nginx nginx -t
#更新nginx配置
docker exec nginx nginx -s reload