内网环境下将nginx的http改为https
1、需求
内网且不连接外网的情况下使系统平台满足---安全传输(http-https协议)
2、生成证书
编写脚本
vim gen-ssl.sh
将脚本内容粘贴,wq保存退出
#!/bin/sh
# create self-signed server certificate:
read -p "Enter your domain [www.example.com]: " DOMAIN
echo "Create server key..."
openssl genrsa -des3 -out $DOMAIN.key 2048
echo "Create server certificate signing request..."
SUBJECT="/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN"
openssl req -new -subj $SUBJECT -key $DOMAIN.key -out $DOMAIN.csr
echo "Remove password..."
mv $DOMAIN.key $DOMAIN.origin.key
openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.key
echo "Sign SSL certificate..."
openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt
注:
执行脚本gen-ssl.sh
chmod a+x gen-ssl.sh
./gen-ssl.sh
执行中会提示输入输入1次域名和4次密码
执行完毕后会生成以域名为名称且后缀为 crt、csr、key、origin.key 四个文件
3、拷贝证书到nginx中
将证书放在指定位置,记住证书的绝对路径(之后要配置在nginx.conf中)
如果nginx是docker容器,可以使用命令将宿主机的文件拷贝到容器中,或者挂载容器的目录到宿主机再进行操作
这里使用拷贝方式
先查出容器id
docker ps | grep nginx
从宿主机拷贝,需要将后缀为crt与key的文件拷贝到容器中的 /etc/nginx/ssl 中:
docker cp <域名>.crt <容器id>:/etc/nginx/ssl
docker cp <域名>.key <容器id>:/etc/nginx/ssl
4、修改配置文件
修改nginx.conf,这里以我的配置为例,要在监听86端口的服务上改变成https:
server {
listen 86;
# 以下3行配置ssl,开启并指定后缀为crt与key的绝对路径
ssl on;
ssl_certificate /etc/nginx/ssl/<域名>.crt;
ssl_certificate_key /etc/nginx/ssl/<域名>.key;
location / {
...
}
}
# 重新加载nginx配置文件,检查是否配置有误
nginx -s reload
# 启动nginx
./nginx
#如果是容器启动
docker restat <容器id>
5、验证
登录服务验证
以chrome访问原来的http网址提示:
400 Bad Request
The plain HTTP request was sent to HTTPS port
以https访问提示:
!您的连接不是安全连接
点击高级,继续访问,大功告成!
不是安全连接的原因是因为浏览器并没有信任我们新添加的自己生成的证书,但是已经实现了加密访问。
6、其他
查看docker容器元数据命令
docker inspect <容器id>
结果往上翻可以查看以下标签:
"Mounts": []
其中"Source"与"Destination"的内容分别是宿主机的路径与对应挂载的容器内路径
脚本中的以下命令:
openssl genrsa -des3 -out $DOMAIN.key 2048
des3:生成的密钥使用des3方式进行加密
-out filename:将生成的私钥保存至filename文件,若未指定输出文件,则为标准输出
2048:指定要生成的私钥的长度,默认为1024,必须为命令行的最后一项参数。
注:测试长度为1024配置完nginx后reload加载配置文件会报以下错误:
nginx:SSL: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small
意思是私钥长度太短,所以从1024改成2048重新生成即可