nginx实现https访问

古城微笑少年丶 2022-12-30 13:43 196阅读 0赞

HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面 。
下面先简要概述三种可以实现https访问方式,后面详细说本人实战经验。
有问题可以联系本人:1016401546,备注来意,否则不加

方式1:使用rewrite指令

  1. server {
  2. listen 80;
  3. server_name domain.com;
  4. rewrite ^(.*) https://$server_name$1 permanent;
  5. }
  6. server {
  7. listen 443 ssl;
  8. server_name domain.com;
  9. ssl on;
  10. ssl_certificate /etc/nginx/ssl/domain.com.crt;
  11. ssl_certificate_key /etc/nginx/ssl/domain.com.crt;
  12. # other
  13. }

如果此时nginx作为Tomcat的前端反向代理的话,需要将相应配置放在配置ssl的server块中。

方式2:使用return指令

  1. server {
  2. listen 80;
  3. server_name domain.com;
  4. return 301 https://$server_name$request_uri;
  5. }
  6. server {
  7. listen 443 ssl;
  8. server_name domain.com;
  9. ssl on;
  10. ssl_certificate /etc/nginx/ssl/domain.com.crt;
  11. ssl_certificate_key /etc/nginx/ssl/domain.com.crt;
  12. # other
  13. }

如果此时nginx作为Tomcat的前端反向代理的话,需要将相应配置放在配置ssl的server块中。

方式三:使用error_page指令
只允许HTTP来访问时,用HTTP访问会让Nginx报497错误,然后利用error_page将链接重定向至HTTPS上。

  1. server {
  2. listen 80;
  3. listen 443 ssl;
  4. server_name domain.com;
  5. ssl on;
  6. ssl_certificate /etc/nginx/ssl/domain.com.crt;
  7. ssl_certificate_key /etc/nginx/ssl/domain.com.crt;
  8. # other
  9. error_page 497 https://$server_name$request_uri;
  10. }

使用error_page指令时,将http和https的监听配置写在同一个server块中,对应的其他配置也需要在该server配置块中完成。
需要注意的是,此时需要将error_page指令语句写在最后,否则不能生效。

实战经验

以上方法可以实现将某个端口的所有链接跳到443端口上面,但是需要注意的是字体加粗的地方
拿方式1来说,需要将相应配置放在配置ssl的server块中的意思是说:包括反向代理,动静分离那些相关的配置都要写在443端口的sever里面。否则不能生效。
如果存在多个端口:如8080,8088这些,那么上述方法只能应用到其中1个端口。也就是说只能80跳到443或者8080跳到443。
而我们的客户要求是,可以通过以下形式访问:
对于8080端口: 可以通过下面方式访问

https://域名:8080
http://域名:8080

对于80端口:

https://域名
http://域名

也就是说一个端口需要同时支持http和https两种协议。

公司的架构访问方式是:

用户===》防火墙====》F5负载均衡====》nginx动静分离方向代理===》内网Tomcat

需求分析:
用户和nginx之间使用https,nginx和Tomcat之间的通信是用http。那么这样配置的话则不需要修改Tomcat的配置文件。比较方便,这样只需要修改nginx的配置文件即可。上面客户的要求即是我们需求,使8080端口和80端口同时支持http和https访问。
步骤1: server模块添加证书

  1. listen 8080 ssl;
  2. server_name aop.gd10010.cn;
  3. #注释下面配置,同时支持https和http访问
  4. #ssl on;
  5. ssl_certificate /data/nginx/sbin/aop_gd10010_cn_combin.cer;
  6. ssl_certificate_key /data/nginx/sbin/aop.gd10010.cn.key.unsecure;
  7. ssl_session_cache shared:SSL:1m;
  8. ssl_session_timeout 5m;
  9. ssl_ciphers HIGH:!aNULL:!MD5;
  10. ssl_prefer_server_ciphers on;

步骤2: server 模块最后添加下面代码(注意后面的端口号)

  1. #使用497状态重写到http上面
  2. error_page 497 = @497;
  3. location @497 {
  4. rewrite / $uri last;
  5. }
  6. #如果想只允许使用https访问,则打开server的ssl on;注释掉上面4行,打开下面一行。8080为对应的端口
  7. #error_page 497 https://$server_name:8080$request_uri;#注意变量后面的端口号
  8. }

步骤3: 其他配置参照普通配置即可(如反向代理,日志配置等)

我的大部分配置
有些配置可能对你们是多余的,正常配置不用变,就添加证书和几条配置信息就可以了。

  1. user nobody nobody;
  2. worker_processes auto;
  3. error_log logs/error.log notice;
  4. pid logs/nginx.pid;
  5. worker_rlimit_nofile 655350;
  6. events {
  7. use epoll;
  8. worker_connections 65535;
  9. }
  10. http {
  11. include mime.types;
  12. add_header X-Frame-Options "SAMEORIGIN";
  13. default_type application/octet-stream;
  14. server_tokens off;
  15. sendfile on;
  16. tcp_nopush on;
  17. tcp_nodelay on;
  18. client_max_body_size 8m;
  19. keepalive_timeout 60;
  20. gzip on;
  21. include proxy.conf;
  22. include ban_ip.conf;
  23. upstream backend {
  24. #ip_hash;
  25. server 10.111.100.77:8080 max_fails=3 fail_timeout=10s;
  26. server 10.111.100.78:8080 max_fails=3 fail_timeout=10s;
  27. keepalive 60;
  28. }
  29. server {
  30. listen 80;#把80端口的链接跳转到443
  31. listen 443 ssl;
  32. server_name xxx.xxx.cn;#证书的域名
  33. #注释下面一行,使同时支持https和http访问
  34. #ssl on
  35. ssl_certificate /data/nginx/sbin/xxxxx.cer;#证书的路径
  36. ssl_certificate_key /data/nginx/sbin/xxxxx.unsecure;
  37. ssl_session_cache shared:SSL:1m;
  38. ssl_session_timeout 5m;
  39. ssl_ciphers HIGH:!aNULL:!MD5;
  40. ssl_prefer_server_ciphers on;
  41. access_log off;
  42. location ~ /gd.*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
  43. proxy_pass http://backend;
  44. #此处省略部分配置(具体配置看按照公司原本http配置即可)。。。。
  45. }
  46. location ~ gd {
  47. proxy_pass http://backend;
  48. #此处省略部分配置(具体配置看按照公司原本http配置即可)。。。。
  49. }
  50. error_page 500 502 503 504 /busy.html;
  51. location = /busy.html {
  52. root html;
  53. }
  54. #使用497状态重写到http上面
  55. error_page 497 = @497;
  56. location @497 {
  57. rewrite / $uri last;
  58. }
  59. }
  60. upstream backend_daily {
  61. #ip_hash;
  62. server 10.111.100.73:8080 max_fails=6 fail_timeout=20s;
  63. server 10.111.100.74:8080 max_fails=7 fail_timeout=20s;
  64. keepalive 60;
  65. }
  66. server {
  67. listen 8080 ssl;
  68. server_name xxx.xxx.cn;
  69. #注释下面配置,同时支持https和http访问
  70. #ssl on;
  71. ssl_certificate /data/nginx/sbin/xxx.cer;
  72. ssl_certificate_key /data/nginx/sbin/xxx.unsecure;
  73. ssl_session_cache shared:SSL:1m;
  74. ssl_session_timeout 5m;
  75. ssl_ciphers HIGH:!aNULL:!MD5;
  76. ssl_prefer_server_ciphers on;
  77. access_log off;
  78. #此处省略部分配置(具体配置看按照公司原本http配置即可)。。。。
  79. location ~ /gd.*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
  80. proxy_pass http://backend_daily;
  81. #此处省略部分配置。。。。
  82. }
  83. location ~ gd {
  84. proxy_pass http://backend_daily;
  85. #此处省略部分配置。。。。
  86. }
  87. location = /robots.txt {
  88. return 400;
  89. }
  90. error_page 404 500 502 503 504 403 405 = /busy.html;
  91. location = /busy.html {
  92. root html;
  93. }
  94. #使用497状态重写到http上面
  95. error_page 497 = @497;
  96. location @497 {
  97. rewrite / $uri last;
  98. }
  99. #如果想只允许使用https访问,则打开server的ssl on;注释掉上面4行,打开下面一行。8080为对应的端口
  100. #error_page 497 https://$server_name:8080$request_uri;#注意变量后面的端口号
  101. }
  102. }

配置完成后先用

./nginx -t 检查配置文件是否通过,若果通过则可以直接重载。
重载后验证业务即可。切记,修改配置文件前记得先备份!

然后发现可以用下面两种方式访问:
80端口:

http://域名
https://域名

8080端口:

http://域名:8080
https://域名:8080

这样就可以实现http和https协议同时并存了。

发表评论

表情:
评论列表 (有 0 条评论,196人围观)

还没有评论,来说两句吧...

相关阅读