若依http转https遇到的坑
坑1:nginx日志出现以下错误
nginx: [emerg] cannot load certificate "/www/ssl/fullchain.pem": PEM_read_bio_X509_AUX() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
上面这个问题参考别人的经验主要有两个解决方法
①pem文件的编码格式不对,要转成UTF-8。我是在阿里云直接下载的证书,编码格式用Natepad++看了一下就是正确的。
②nginx的配置文件中的key和pem路径位置弄反了
我的情况没有能用以上方法解决,尝试了很多次都没有用,最后发现是key和pem证书的存放路径问题。首先在拉取nginx镜像的时候,需要进行挂载该证书存放的目录路径,才能正确找到证书的位置,不然会一直报下面这个错误。
cannot load certificate "/usr/local/nginx/ssl/*.pem": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/usr/local/nginx/ssl/*.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)
其次我的证书存放路径只能是这个 /etc/nginx/cert,如果在服务器的/etc目录找不到文件的话就自己新建一个对应的文件(我就是自己新建的),将证书放入cert文件夹下,重新启动就可以了。如果放在其他路径下,虽然能找到,但是会一直报上面的那个错误。
坑2:nginx配置文件没问题,但是一直不能成功
nginx配置文件在80端口中不添加 rewrite ^(.*)$ https://$host$1 permanent;
就能正常访问,添加这句转向https就会访问不了,且nginx日志没有报错。这个主要原因还是因为443端口没有开放!
可能大家都还挺疑惑的,明明在阿里云服务器或者其他服务器上已经配置开放443端口,为啥还说是443端口没开放。我也是小白一个,后面弄了好久才发现在拉取创建本地nginx镜像的时候我们就得开放443端口,否则一直都不能成功。下面是我拉取镜像的操作
docker run --name ruoyinginx -p 80:80 -p 443:443
-v /root/ruoyi/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /root/ruoyi/nginx/conf/cert:/etc/nginx/cert
-v /root/ruoyi/nginx/html:/usr/share/nginx/html
-v /root/ruoyi/nginx/logs:/var/log/nginx
-d nginx
nginx配置文件(开启https+域名访问)
worker_processes 1;
events {
worker_connections 1024; }
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
client_max_body_size 100m;
server {
#配置HTTPS的默认访问端口为443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
#如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
listen 443 ssl;
#填写证书绑定的域名
server_name 你的域名地址# ;
ssl_certificate /etc/nginx/cert/文件名.pem;
ssl_certificate_key /etc/nginx/cert/文件名.key;
ssl_session_timeout 5m;
#表示使用的加密套件的类型
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/html/dist;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /profile/
{
alias /home/ruoyi/uploadPath/;
}
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://你的域名地址+端口 ;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name 你的域名地址#
charset utf-8;
rewrite ^(.*)$ https://$host$1 permanent;
}
include /etc/nginx/conf.d/*.conf;
}