因为客户需求,需要把原来的http换成https,还不能影像原来http的访问。
看了许多网上的资料,经过实践。我总结下相关步骤及怎么配置的。
第一步,把http换成https这里需要ssl证书
ssl证书生成,我接触的有2种免费方式。
第一种通过安装 OpenSSL(创建证书)。
优点:ssl证书生成简单
缺点:最后成功配置了该证书,http换成https。但是各浏览器是不承认该证书的,也会出现不安全的提示
示例:
对于我来说,太low了
第二种方式在阿里云上申请免费证书,有效期只有一年。各浏览器是承认该安全证书的。
萝卜蔬菜各有所爱。
如果你很懒, OpenSSL创建的通用证书已经给你创建好了,直接下载使用
链接: OpenSSL生成的ssl证书-WindowsServer文档类资源-CSDN下载
第一种通过 OpenSSL(创建证书)。
下载地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions
-
下载完成安装到 C:\OpenSSL-Win64
-
配置环境变量
-
在path变量后需要加入 %OPENSSL_HOME%
4.生成证书
在你的nginx下创建ssl文件夹 用于存放证书
打开服务器的cmd,进入到nginx下创建ssl文件夹下
运行证书生成命令:
openssl genrsa -des3 -out zs.key 2048
创建安全秘钥,安全秘钥输自己能记得到的。
再次输入自己刚才的秘钥。
创建 csr 证书
再次输入命令:
openssl req -new -key zs.key -out zs.csr
后面的内容按enter键跳过
这就创建完成了。这就是刚生成的证书
第二种通过阿里云平台生成证书
申请证书地址:https://yundun.console.aliyun.com/?spm=5176.12818093.ProductAndResource--ali--widget-product-recent.dre3.3be916d02OjeeC&p=cas#/certExtend/free
登录上阿里云后跳转至证书申请页面
后面会把相关的信息发到你的邮件里,根据邮件的步骤生成证书就可以了
我申请下来的证书,和openssl生成的证书有点差异,单不影响结果:
证书已经生成了,现在就是nginx配置了
nginx配置(必须对外开通443端口,互联网可以访问该端口 )
如果有原http访问项目的相关配置了,先别去动它。再创建一个nginx配置,免得把以前的项目搞砸了,如果对ssl不是很懂的话。配置没有问题了再把原的nginx干掉。
nginx.conf配置(这个是有原nginx项目配置的环境下,重新建的一个nginx 取名nginxssl):
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#隐藏nginx版本
server_tokens off;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#文件压缩
gzip on;
gzip_disable "msie6";
gzip_proxied any;
gzip_min_length 1k;
gzip_comp_level 4;
gzip_types text/plain application/x-javascript application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
server {
listen 443 ssl;
#填写你的域名或ip 多个用空格分开
server_name www.xxx.com 221.237.182.xxx;
#证书路径配置 我这里用的阿里云申请的证书 D:/soft/nginxssl/ssl/zs.csr
ssl_certificate D:/soft/nginxssl/ssl/8935916.pem;
#证书路径配置 我这里用的阿里云申请的证书 D:/soft/nginxssl/ssl/zs.key
ssl_certificate_key D:/soft/nginxssl/ssl/8935916.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
client_max_body_size 20M;#控制该server的所有请求报文大小
#后台接口访问配置
location ^~ /api {
proxy_pass http://localhost:8080/api;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#前端项目默认访问配置
location / {
root D:/soft/webfile/dist-jeeplus-ssl;
index index.html index.htm;
autoindex off;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.html?s=$1 last;
break;
}
}
#前端项目分流访问配置
location /ph {
alias D:/soft/webfile/dist-phone-ssl;
index index.html index.htm;
autoindex off;
}
}
}
nginx.conf配置(没有原nginx项目配置的环境下):
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#隐藏nginx版本
server_tokens off;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#文件压缩
gzip on;
gzip_disable "msie6";
gzip_proxied any;
gzip_min_length 1k;
gzip_comp_level 4;
gzip_types text/plain application/x-javascript application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
#HTTP配置
server {
listen 80;
#填写绑定证书的域名
server_name www.xxx.com;
#(第一种)把http的域名请求转成https 保留一种
return 301 https://$host$request_uri;
#(第二种)强制将http的URL重写成https 保留一种
rewrite ^(.*) https://$server_name$1 permanent;
}
#HTTPS使用SSL访问的配置
#
server {
listen 443 ssl;
#填写你的域名或ip 多个用空格分开
server_name www.xxx.com 221.237.182.xxx;
#证书路径配置 我这里用的阿里云申请的证书 D:/soft/nginxssl/ssl/zs.csr
ssl_certificate D:/soft/nginxssl/ssl/8935916.pem;
#证书路径配置 我这里用的阿里云申请的证书 D:/soft/nginxssl/ssl/zs.key
ssl_certificate_key D:/soft/nginxssl/ssl/8935916.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
client_max_body_size 20M;#控制该server的所有请求报文大小
#后台接口访问配置
location ^~ /api {
proxy_pass http://localhost:8080/api;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#前端项目默认访问配置
location / {
root D:/soft/webfile/dist-jeeplus-ssl;
index index.html index.htm;
autoindex off;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.html?s=$1 last;
break;
}
}
#前端项目分流访问配置
location /ph {
alias D:/soft/webfile/dist-phone-ssl;
index index.html index.htm;
autoindex off;
}
}
}