Nginx怎么配置SSL证书(图文版、ssh工具版)
博主的教程使用到了 SSH连接工具,建议你也下载一个,博主用的XT(免费),不一定要一样,但是思路一样!!如果你是手敲指令的大佬,那你就按照下面的思路手敲指令
首先得先去申请ssl,其次你的nginx是能正常访问的,一步一步来。
默认你前面两步已经完成了。无论你是怎么获取到的ssl,你都要下载nginx服务器的对应证书
下载解压之后现在你有两个文件了,分别是 .pem 和 .key 一个是证书一个是秘钥
然后创建一个 名为cert的文件夹 把你的这两个文件放到这个文件夹中,(cert这个文件夹我是喜欢放在跟nginx文件夹同级的,但是如果你是docker部署的nginx,那你就把cert放在nginx文件夹下)
然后配置ssl,能正常用的nginx ,你应该已经配置了一个 server
现在要nginx.conf里面再配置多一个server(放在下面了可以复制),意思是你原本能正常用的配置不用管,在那基础上把下面这个server配置复制过去把里面的内容改成你自己的,例如我的域名是cctt.com
server {
#HTTPS的默认访问端口443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
listen 443 ssl;
#填写证书绑定的域名
server_name cctt.com;
#填写证书文件的绝对路径
ssl_certificate /usr/local/cert/moumou_certificate.pem;
#填写证书私钥文件的绝对路径
ssl_certificate_key /usr/local/moumou_private.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
#表示优先使用服务端加密套件。默认开启
ssl_prefer_server_ciphers on;
location / {
root html/dist; # 关键修改:你的项目存放的地方
index index.html index.htm;
}
}
修改完后保存,检测配置文件是否正确
sudo /usr/local/nginx1/sbin/nginx -t -c /usr/local/nginx1/conf/nginx.conf
如果是下面这样则为成功。
如果是下面这个问题,那就是缺少了或者没启动ngx_http_ssl_module,要重新编译一下nginx
首先注释掉 你 nginx.conf 刚才配置的关于ssl的server,不然你后面会报错
接着cd进你的nginx解压的地方也就是源码包,不是你的安装路径,这是两个地方,反正你看到nginx文件夹里面有objs这个文件夹就对了
输入下面的指令,这里的 /usr/local/nginx 才是你的nginx的安装路径
./configure --prefix=/usr/local/nginx1 --with-http_ssl_module
如果你是用XT你可以右键复制绝对路径
输入指令之后会修改源码包的配置
修改完之后, make 一下重新弄成新的 nginx启动器,输入make之后,它会一直在编译,等它编译完。
现在你先停止nginx,如果你根本就没启动就跳过这一步。
下面的 /usr/local/nginx1/sbin/nginx 要改成你自己nginx的安装路径
sudo /usr/local/nginx1/sbin/nginx -c /usr/local/nginx1/conf/nginx.conf -s stop
接着回到刚才的nginx源码包的地方,打开objs文件夹,把里面的nginx这个文件复制到nginx安装路径的sbin文件夹里面(覆盖掉原本的)步骤如下,
把重新编译好的nginx下载下来
然后把它拖到nginx安装路径的sbin里面
到这里基本上就成了,你只需要 cd 进 nginx 的sbin文件夹里面
输入
./nginx -V
看到下图这样就是成功
接下来要记得把刚才注释掉的关于 ssl的server取消掉注释
再检查一下配置文件是否正确,记得下面的路径要改成你自己的安装路径
sudo /usr/local/nginx1/sbin/nginx -t -c /usr/local/nginx1/conf/nginx.conf
显示ok就是没问题
接下来启动nginx即可 !!记得路径改成你自己的
sudo /usr/local/nginx1/sbin/nginx -c /usr/local/nginx1/conf/nginx.conf
教程到此结束!
-------------------------------------------------------------------------------------------------------------------------------- nginx.conf 完整配置(经供参考)
里面ssl的server块的逻辑是这样的
用户第一次访问你的域名,如果它没有加https的话,nginx自动重定向到https。但是每一次的重定向都会有被拦截的风险,所有加上了 HSTS,它会防止协议降级攻击,意思是。只要你访问过一次,以后都是https来访问,不会重定向,而是直接升级。
# HSTS(告诉浏览器“今后都走 HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
这行的指令分别的意思是
-
Strict-Transport-Security:告诉浏览器,从现在开始的一段时间里,只能通过 HTTPS 访问本域名。
-
max-age=31536000:该策略的有效期是 31,536,000 秒(即 365 天)。在此期间,浏览器即使用户手动输入或点击了
http://
链接,也会自动把请求“升级”成https://
,不再发明文 HTTP 请求。 -
includeSubDomains:不仅对主域名()生效,也对子域名(例如
api.mall2.cctt.cc
、www.mall2.cctt.cc
等)同样强制启用 HTTPS。 -
always(Nginx 参数,不是 HSTS 本身的一部分):确保无论响应状态码(200、301、404、500……)如何,Nginx 都会把这个头加上。默认情况下,
add_header
只对 2xx/3xx 响应生效,加了always
之后即便是错误页也会携带 HSTS。
#user nobody;
worker_processes auto;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
upstream producer{
least_conn; # 连接数最少的服务器优先(负载均衡策略)
server 你的后端地址 weight=1 max_fails=1 fail_timeout=5;
}
sendfile off;
gzip on;
fastcgi_buffers 8 62k;
fastcgi_buffer_size 62k;
client_body_buffer_size 1024k;
client_max_body_size 20M;
client_header_buffer_size 1024k;
server_names_hash_bucket_size 128;
map_hash_bucket_size 64;
## Start: Timeouts ##
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 30;
send_timeout 10;
keepalive_requests 10;
## End: Timeouts ##
map $http_upgrade $connection_upgrade{
default upgrade;
'' close;
}
server{
listen 80;
server_name 你的域名或者ip;
#第一次重定向到https
return 301 https://你的域名$request_uri;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
#HTTPS的默认访问端口443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
listen 443 ssl;
#填写证书绑定的域名
server_name 你的域名;
#填写证书文件的绝对路径
ssl_certificate 你的ssl证书.pem;
#填写证书私钥文件的绝对路径
ssl_certificate_key 你的ssl.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
# HSTS(告诉浏览器“今后都走 HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
#表示优先使用服务端加密套件。默认开启
ssl_prefer_server_ciphers on;
root /home/web/dist; # 关键修改:你的项目存放的地方
index index.html index.htm;
location / {
try_files $uri $uri/ @router;
}
location @router {
rewrite ^.*$ /index.html last;
}
location /prod-api/ {
proxy_pass http://producer/;
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 30;
proxy_set_header Host $host:$server_port;#获取访问IP
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /oauth/other/wxLogin/callback {
proxy_pass http://localhost/dev-api/oauth/other/wxLogin/callback;
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 1;
proxy_set_header Host $host:$server_port;#获取访问IP
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
proxy_buffer_size 64k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}