Nginx+SpringBoot配置SSL证书,实现https访问
从http到https需要申请ssl证书。
阿里云有免费的ssl证书,买了一个测试。
步骤
我的环境为nginx+springboot。springboot中不配置ssl,只需要配置nginx即可。
- 首先,在服务器控制台打开443端口。默认的网站都是80端口,https默认为443端口
- 在域名控制台建好用来测试的二级域名,用一级域名当然也可以。
- 申请ssl证书,验证的时候,按照网站提示的要求,在域名那里填相应的记录就好。
- ssh连接到服务器,配置nginx.conf文件。
- 测试配置文件nginx.conf是否正确。/usr/local/nginx/sbin/nginx -t (nginx安装的目录/sbin/nginx -t)。
- 当填写完,测试过,没有错误信息的时候,重启nginx。/usr/local/nginx/sbin/nginx -s reload
一些错误
- nginx 报错 : [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
因为nginx 1.15 及以后的版本,不需要再写 ssl on; 了。需要把ssl on 改为listen 443 ssl;
如果还不行,那就是服务器的443端口没有打开。
- 配置文件中不要直接复制百度到的。出现这个错误,nginx: [emerg] unknown directive " " in /usr/local/nginx/conf/nginx.conf,是因为复制到的空格的原因。需要删除空格重新写。
源码
贴上我的https的部分的配置文件(每个二级域名都需要一个这种配置):
# http -> Https 如果使用的http协议访问,重定向到https访问
server {
listen 80;
server_name xxx.xxx; # 域名
add_header Strict-Transport-Security max-age=15768000;
return 301 https://$server_name$request_uri;
}
# Https 的配置,除了有注释的地方,其他地方和我一样即可
server {
listen 443 ssl; # 老版本是ssl on;较新的为listen 443 ssl;
server_name xxx.xxx; # 域名
keepalive_timeout 10m;
ssl_certificate cert/xxx.xxx.pem; # 申请的证书,把证书和秘钥上传到nginx.conf的同级目录cert的目录下
ssl_certificate_key cert/xxx.xxx.key; # 秘钥
ssl_session_timeout 24h;
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://127.0.0.1:8080; # 反向代理到本机的8080端口,8080端口的那个服务器不需要任何关于https的配置。
proxy_redirect off;
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 $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}