本文用到:OpenSSL(秘钥证书生成工具)、docker、docker-compose
利用OpenSSL创建自签证书
先创建一个文件夹,用来存放OpenSSL生成的一系列文件,切换到文件夹
创建本地私有密钥(key)和证书签名请求(csr),按提示输入相关信息就可以
openssl req -new -nodes -newkey rsa:2048 -keyout test.key -out test.csr
创建证书(crt)
openssl x509 -req -days 1460 -in test.csr -signkey test.key -out test.crt
利用docker-compose安装nginx
先贴上docker-compose.yml文件
version: "3"
services:
proxy:
image: nginx:1.14
container_name: nginx-https
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./logs/proxy:/var/log/nginx
- ./conf/proxy/conf.d:/etc/nginx/conf.d
- ./ssl:/etc/nginx/ssl
注意volumes部分把容器里的目录挂载到容器外,./的位置是yml文件所在的位置,注意要创建好对应的文件夹。conf存放nginx的配置文件,logs存放日志,ssl存放刚才OpenSSL生成的key文件和crt文件。这里贴上文件目录:
nginx-https
docker-compose.yml
conf
proxy
conf.d
default.conf
logs
proxy
access.log
error.log
ssl
test.key
test.crt
然后在yml文件所在目录执行命令启动容器
更改nginx配置
切换到配置文件所在目录
修改default.conf配置文件,这里贴上配置文件
server {
listen 443 ssl;
server_name 192.168.xxx.xxx;
ssl on; #开启SSL
ssl_certificate ssl/server.crt; #SSL证书
ssl_certificate_key ssl/server_no_passwd.key; #SSL密钥
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://192.168.xxx.xxx:8080;
}
}
server {
listen 80;
server_name 192.168.xxx.xxx;
return 301 https://$server_name$request_uri;
}
注意这里ssl_certificate和ssl_certificate_key正是证书和秘钥在容器内相对于default.conf配置文件的位置,server_name的ip要替成自己的,proxy_pass要换成自己的ip和网站的端口。
最后down掉容器再重新启动,让配置文件生效。这时候去浏览地址栏访问
https://192.168.xxx.xxx/
出现您的连接不是私密连接页面就意味着http已升级为https了,双击地址栏可以看出协议已变成了https。需要说明的是自签名的证书是不受浏览器信任的,用浏览器访问会提示不安全,需要点击高级-继续前往才能访问。