由于前端需要https访问,所以后端配置ssl,但自定义的证书,好像只支持https://localhost访问,但项目最终是要部署到服务器上的,所以一定要支持https ip访问。所以准备通过nginx配置ssl服务器,来反向代理
其中的业务逻辑:
前端——>nginx 通过https访问
nginx——>后端 通过http访问
1、安装OpenSSL
先到http://slproweb.com/products/Win32OpenSSL.html 去下载OpenSSL(根据系统选择32位或者64位版本下载安装)。
然后安装在F:\OpenSSL-Win64下。
然后配置环境变量。在系统环境变量中添加环境变量:
变量名:OPENSSL_HOME
变量值:F:\OpenSSL-Win64\bin;
(变量值为OPENSSL安装位置下的bin目录)
并在 Path变量 结尾添加一条: %OPENSSL_HOME%
2、下载安装nginx
下载最新的稳定版本即可
可以参考我先前的一篇文章:
https://blog.****.net/qq_41603102/article/details/82429124
3、生成证书
1、在Nginx安装目录中创建ssl文件夹用于存放证书。
2、然后到ssl目录下,打开cmd
3、创建私钥
在命令行中执行命令:
openssl genrsa -des3 -out test.key 1024 # test文件名是自己随便起即可
输入密码后,再次重复输入确认密码。记住此密码,后面会用到。
4、创建csr证书
在命令行中执行命令:
openssl req -new -key test.key -out test.csr
其中key文件为刚才生成的文件。
执行上述命令后,需要输入一系列的信息。输入的信息中最重要的为Common Name,这里输入的域名即为我们要使用https访问的域名 ,比如我输入的是localhost。其它的内容随便填即可。
以上步骤完成后,ssl文件夹内出现两个文件:test.csr 和 test.key
5、去除密码
在加载SSL支持的Nginx并使用上述私钥时除去必须的口令,否则会在启动nginx的时候需要输入密码。
复制test.key并重命名为test.copy.key。
在命令行中执行如下命令以去除口令:
openssl rsa -in test.copy.key -out test.key
然后输入密码,这个密码就是上文中在创建私钥的时候输入的密码。
6、生成crt证书
在命令行中执行此命令:
openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt
至此,证书生成完毕。我们发现,ssl文件夹中一共生成了4个文件。下面,配置https服务器的时候,我们需要用到的是其中的test.crt和test.key这两个文件。
4、修改Nginx的nginx.conf配置文件
我的这个文件在F:\Program Files\nginx-1.14.2\nginx-1.14.2\conf目录下。用任意一个编辑器(如Sublime Text之类)打开这个nginx.conf文件。
找到HTTPS server配置的那一段(即包含有listen 443 ssl配置那一段)。我们发现这段代码被注释掉了。所以,首先我们把该段代码前面的#号去掉。然后分别修改其中的ssl_certificate和ssl_certificate_key配置项为刚才所生成的test.crt和test.key这两个文件的目录。并配置server_name为localhost。修改后的该段配置如下:
#HTTPS server
server {
listen 443 ssl;
server_name localhost;
ssl_certificate F://Program Files//nginx-1.14.2//nginx-1.14.2//ssl//test.crt; # 这个是证书的crt文件所在目录
ssl_certificate_key F://Program Files//nginx-1.14.2//nginx-1.14.2//ssl//test.key; # 这个是证书key文件所在目录
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
注意一下那两个证书的文件路径的写法。
5、重启nginx
因为修改了配置文件,所以要重新加载配置文件 执行如下命令:
nginx -s reload
发现报错
路径好像有问题,所以修改路径
#ssl_certificate F://Program Files//nginx-1.14.2//nginx-1.14.2//ssl//test.crt;
#ssl_certificate F:/Program Files/nginx-1.14.2/nginx-1.14.2/ssl/test.crt;
#ssl_certificate F:\Program Files\nginx-1.14.2\nginx-1.14.2\ssl\test.crt;
ssl_certificate F:\\Program Files\\nginx-1.14.2\\nginx-1.14.2\\ssl\\test.crt;
把上面4个全试了一边,最后尴尬的发现,没有一个成功的~~
怎么办呢?还是有办法的
把刚才的配置还原
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
然后重启nginx,发现
它这报错信息中,提到从conf文件夹中找不到cert.pem。那我们换个思路,我们把上面的test.cet,test.key文件放到conf文件夹下,这样就能找到了
ssl_certificate test.crt;
ssl_certificate_key test.key;
然后重启,发现成功!
这时候,在浏览器地址栏输入https://localhost并回车。
这时候,你可能看到“您的连接不是私密连接”的提示,单击页面中的“高级”,并接着单击“继续前往m.test.com(不安全)”,就可以看到Nginx的欢迎界面了。说明https服务器已经配置成功了。
ps:执行nginx -s reload命令:
nginx: [error] OpenEvent("Global\ngx_reload_6252") failed (2: The system cannot find the file specified)
错误原因:
Nginx 尚未启动导致,执行 start nginx 命令开启Nginx即可
6、反向代理springboot项目
继续修改配置文件:
#HTTPS server
server {
listen 443 ssl;
server_name localhost;
#ssl_certificate cert.pem;
#ssl_certificate_key cert.key;
ssl_certificate test.crt;
ssl_certificate_key test.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://127.0.0.1:8086; # spring boot 项目的端口号
# 固定写法-------------
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;
}
}
打开浏览器,输入https://10.167.xx.xx/meeting/test
注意:10.167.xx.xx是你本机的IP地址
这样我们就可以实现 https通过ip来访问后端springboot项目了
这样http就能通过https协议访问了,那么问题来了?
如何使ws,wss协议那怎么办呢?
参考:
https://mobilesite.github.io/2017/03/11/windows-nginx-https-config/
https://segmentfault.com/a/1190000016760251