一、创建SSL相关证书

1.安装Nginx(这里为了测试使用yum安装,实际看具体情况)

  1. [root@localhost ~]# yum install nginx -y #默认yum安装已经支持SSL,如果是自己编译的可以通过 nginx -V 查看当前Nginx是否支持SSL
  2. [root@localhost ~]# cd /etc/nginx/
  3. [root@localhost nginx]# mkdir ssl
  4. [root@localhost nginx]# cd ssl/

2.生成一个RSA密钥

  1. [root@localhost ssl]# openssl genrsa -des3 -out nginx.key 1024 #实际使用中看服务器性能,如果足够好也可以使用4096位秘钥
  2. Generating RSA private key, bit long modulus
  3. .......++++++
  4. ...++++++
  5. e is (0x10001)
  6. Enter pass phrase for nginx.key: #输入密码,自定义,不少于4个字符
  7. Verifying - Enter pass phrase for nginx.key: #确认密码

3.生成一个证书请求

  1. [root@localhost ssl]# openssl req -new -key nginx.key -out nginx.csr
  2. Enter pass phrase for nginx.key: #输入刚刚创建的秘密码
  3. You are about to be asked to enter information that will be incorporated
  4. into your certificate request.
  5. What you are about to enter is what is called a Distinguished Name or a DN.
  6. There are quite a few fields but you can leave some blank
  7. For some fields there will be a default value,
  8. If you enter '.', the field will be left blank.
  9. -----
  10. Country Name ( letter code) [XX]:CN #国家名称
  11. State or Province Name (full name) []:ShangHai #省
  12. Locality Name (eg, city) [Default City]:ShangHai #市
  13. Organization Name (eg, company) [Default Company Ltd]:ACBC #公司
  14. Organizational Unit Name (eg, section) []:Tech #部门
  15. Common Name (eg, your name or your server's hostname) []:*.mydomain.com #注意,此处应当填写你要部署的域名,如果是单个则直接添加即可,如果不确定,使用*,表示可以对所有mydomain.com的子域名做认证
  16. Email Address []:admin@mydomain.com #以域名结尾即可
  17.  
  18. Please enter the following 'extra' attributes
  19. to be sent with your certificate request
  20. A challenge password []: #是否设置密码,可以不写直接回车
  21. An optional company name []: #其他公司名称 可不写

4.创建不需要输入密码的RSA证书,否则每次reload、restart都需要输入密码

  1. [root@localhost ssl]# openssl rsa -in nginx.key -out nginx_nopass.key
  2. Enter pass phrase for nginx.key: #之前RSA秘钥创建时的密码
  3. writing RSA key

5.签发证书(由于是测试自己签发,实际应该将自己生成的csr文件提交给SSL认证机构认证)

  1. [root@localhost ssl]# openssl x509 -req -days -in nginx.csr -signkey nginx.key -out nginx.crt
  2. Signature ok
  3. subject=/C=CN/ST=ShangHai/L=ShangHai/O=ACBC/OU=Tech/CN=*.mydomain.com/emailAddress=admin@mydomain.com
  4. Getting Private key
  5. Enter pass phrase for nginx.key: #RSA创建时的密码

二、配置Nginx

1、修改配置文件(注意域名,特别是443)

  1. # For more information on configuration, see:
  2. # * Official English Documentation: http://nginx.org/en/docs/
  3. # * Official Russian Documentation: http://nginx.org/ru/docs/
  4.  
  5. user nginx;
  6. worker_processes auto;
  7. error_log /var/log/nginx/error.log;
  8. pid /run/nginx.pid;
  9. # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
  10. include /usr/share/nginx/modules/*.conf;
  11.  
  12. events {
  13. worker_connections 1024;
  14. }
  15.  
  16. http {
  17. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  18. '$status $body_bytes_sent "$http_referer" '
  19. '"$http_user_agent" "$http_x_forwarded_for"';
  20. access_log /var/log/nginx/access.log main;
  21.  
  22. sendfile on;
  23. tcp_nopush on;
  24. tcp_nodelay on;
  25. keepalive_timeout 65;
  26. types_hash_max_size 2048;
  27.  
  28. include /etc/nginx/mime.types;
  29. default_type application/octet-stream;
  30.  
  31. include /etc/nginx/conf.d/*.conf;
  32. server {
  33. listen 80 default_server;
  34. listen [::]:80 default_server;
  35. server_name test.mydomain.com; #配置自己的域名 注意要以自己申请证书时填写的域名一致
  36. root /usr/share/nginx/html;
  37.  
  38. # Load configuration files for the default server block.
  39. include /etc/nginx/default.d/*.conf;
  40.  
  41. location / {
  42. }
  43.  
  44. error_page 404 /404.html;
  45. location = /40x.html {
  46. }
  47.  
  48. error_page 500 502 503 504 /50x.html;
  49. location = /50x.html {
  50. }
  51. }
  52.  
  53. # Settings for a TLS enabled server.
  54. server {
  55. listen 443 ssl http2 default_server;
  56. listen [::]:443 ssl http2 default_server;
  57. server_name test.mydomain.com; #与申请时的域名保持一致,否则会报错
  58. root /usr/share/nginx/html;
  59.  
  60. ssl_certificate "/etc/nginx/ssl/nginx.crt"; #
  61. ssl_certificate_key "/etc/nginx/ssl/nginx_nopass.key";
  62. ssl_session_cache shared:SSL:1m;
  63. ssl_session_timeout 10m;
  64. ssl_ciphers HIGH:!aNULL:!MD5;
  65. ssl_prefer_server_ciphers on;
  66.  
  67. # Load configuration files for the default server block.
  68. include /etc/nginx/default.d/*.conf;
  69.  
  70. location / {
  71. }
  72.  
  73. error_page 404 /404.html;
  74. location = /40x.html {
  75. }
  76.  
  77. error_page 500 502 503 504 /50x.html;
  78. location = /50x.html {
  79. }
  80. }
  81.  
  82. }

#配置简介

  1. ssl_certificate证书其实是个公钥,它会被发送到连接服务器的每个客户端,ssl_certificate_key私钥是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取。当然私钥和证书可以放在一个证书文件中,这种方式也只有公钥证书才发送到client
  2. ssl_session_timeout 客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m30分钟甚至4h
  3. ssl_protocols指令用于启动特定的加密协议,nginx1..131..12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1. TLSv1.,TLSv1.1TLSv1.2要确保OpenSSL >= 1.0. SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。
  4. ssl_ciphers选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。这里指定的是OpenSSL库能够识别的写法,你可以通过 openssl -v cipher RC4:HIGH:!aNULL:!MD5’(后面是你所指定的套件加密算法) 来看所支持算法。
  5. ssl_prefer_server_ciphers on设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。

2.启动服务

  1. [root@localhost nginx]# nginx -t
  2. nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
  3. nginx: configuration file /etc/nginx/nginx.conf test is successful
  4. [root@localhost nginx]# echo "This test page" > /usr/share/nginx/html/test.html #创建一个测试页面
  5. [root@localhost nginx]# systemctl restart nginx

3.测试

绑定 test.mydomain.com域名对应的IP到客户端

使用HTTP协议访问

使用HTTPS协议访问

有个警告,正常,应用我们的证书没有经过认证,点击高级,点击继续前往

 从结果看,HTTPS配置成功

4.有时候我们希望无论是HTTP或者HTTPS协议都通过HTTPS访问,可以做如下配置

  1. server {
  2. listen default_server;
  3. listen [::]: default_server;
  4. server_name test.mydomain.com;
  5. root /usr/share/nginx/html;
  6.  
  7. # Load configuration files for the default server block.
  8. include /etc/nginx/default.d/*.conf;
  9. return 301 https://$server_name$request_uri; #在80监听端口 配置跳转

在使用HTTP协议访问,为避免缓存的影响,我们可以换一个浏览器

输入URL后回车,跳转到HTTPS了, 点击高级-->接受风险并继续

结果为:

三、配置Nginx使用HTTPS代理后端Tomcat服务

1.下载Tomcat,并测试是否访问正常

  1. [root@localhost nginx]# cd /mnt/
  2. [root@localhost mnt]# tar xf apache-tomcat-7.0..tar.gz
  3. [root@localhost mnt]# cd apache-tomcat-7.0./bin/
  4. [root@localhost bin]# ./startup.sh
  5. [root@localhost bin]# curl -I http://172.16.150.132:8080 #如果在他为200 OK则正常

2.配置Nginx代理到Tomcat

Nginx代理可以分为两种情况

1.全代理

2.只代理动态请求,静态请求本地或者代理到其他静态服务器上,即动静分离

我们先配置第一种情况:全代理

  1. [root@localhost bin]# cd /etc/nginx/
  2. [root@localhost nginx]# vim nginx.conf
  3. server {
  4. listen ssl http2 default_server;
  5. listen [::]: ssl http2 default_server;
  6. server_name test.mydomain.com;
  7. root /usr/share/nginx/html;
  8.  
  9. ssl_certificate "/etc/nginx/ssl/nginx.crt";
  10. ssl_certificate_key "/etc/nginx/ssl/nginx_nopass.key";
  11. ssl_session_cache shared:SSL:1m;
  12. ssl_session_timeout 10m;
  13. ssl_ciphers HIGH:!aNULL:!MD5;
  14. ssl_prefer_server_ciphers on;
  15.  
  16. # Load configuration files for the default server block.
  17. include /etc/nginx/default.d/*.conf;
  18.  
  19. location / {
  20. proxy_pass http://localhost:8080; #使用proxy_pass 直接代理
  21. }
  22.  
  23. [root@localhost bin]# cd /etc/nginx/
  24. [root@localhost nginx]# vim nginx.conf
  25. [root@localhost nginx]# systemctl restart nginx

访问测试一下,直接使用HTTP协议

没有问题

动静分离配置

  1. [root@localhost nginx]# vim nginx.conf
  2. location / { #删除之前的8080代理
  3. index index.html index.htm;
  4. }
  5.  
  6. location ~ \.(jsp|jspx|do|action)(\/.*)?$ {
  7. proxy_set_header real_ip $remote_addr;
  8. proxy_pass http://localhost:8080;
  9. }
  10.  
  11. [root@localhost nginx]# nginx -t
  12. [root@localhost nginx]# systemctl restart nginx

访问HTML文件

访问JSP文件

3.生产其他常见配置

  1. proxy_set_header Host $http_host; #避免http请求中丢失Host头部的情况下Host不被重写的失误
  2. proxy_set_header X-Forwarded-For $http_x_forwarded_for; #代表客户端,也就是HTTP的请求端真实的IP
  3. proxy_set_header X-Real-IP $remote_addr; #将$remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip
  4.  
  5. add_header Access-Control-Allow-Origin *; #表示允许访问的外域请求
  6. add_header Access-Control-Allow-Headers X-Requested-With; #首部字段用于预检请求的响应。其指明了实际请求中允许携带的首部字段。
  7. add_header Access-Control-Allow-Methods GET,POST,OPTIONS; #首部字段用于预检请求的响应。其指明了实际请求所允许使用的 HTTP 方法。
  8. add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"; #防止中间人攻击
  9. add_header X-Frame-Options:ALLOW-FROM http://www.growingio.com; # 避免点击劫持 (clickjacking) 的攻击
  10. add_header X-Content-Type-Options nosniff; #不允许浏览器任何猜测的行为
  11.  
  12. ssi on; #开启SSI
  13. ssi_silent_errors on;
  14. ssi_types *;
  15.  
  16. proxy_redirect http:// $scheme://; #修改从被代理服务器传来的应答头中的"Location"和"Refresh"字段,将http修改为https
  17. port_in_redirect on; #告诉nginx,遇到跳转的时候,不要加上自己的端口号
  18.  
  19. #可配置参数由openssl 的ciphers定义  openssl ciphers -v #查看支持的配置参数
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';

ssl_stapling on; #启用或禁用 服务器对OCSP响应的装订 #检验证书合法性的在线查询服务
  ssl_stapling_verify on; #启用或禁用服务器对OCSP响应的验证

  1. #如果启用了ssl_stapling,则以file PEM格式 指定具有受信任CA证书的证书,用于验证客户端证书和OCSP响应。 顺序为 站点证书、中间证书(1张或多张)、根证书
    ssl_trusted_certificate /path/to/file;
  2.  
  3. #使用Diffie-Hellman方法让访问者的浏览器和服务器安全的交换密钥 
    #使用 openssl dhparam -out /usr/ssl/dhparam.pem 2048 命令生成需要的pem文件 其中默认为1024位
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
  4.  
  5. 网站SSL配置检查:
    https://www.ssllabs.com/ssltest/ https://myssl.com/myssl.com

Nginx自建SSL证书部署HTTPS网站的更多相关文章

  1. Nginx配置SSL证书部署HTTPS网站(颁发证书)

    一.Http与Https的区别HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高 ...

  2. Nginx配置SSL证书部署HTTPS网站

    1.购买ssl证书 购买网站:沃通 2.上传证书到nginx服务器,然后进行解压. 解压后的的效果: [root@bubidev-ng3 nginx]# pwd/etc/nginx [root@bub ...

  3. SSL证书部署HTTPS站点Apache/Nginx配置

    SSL证书及HTTPS协议 SSL 证书是一种数字证书,它使用 Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道,从而实现:1.数据信息在客户端和服务器之间的 ...

  4. [转] Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程

    一.HTTPS 是什么? 根据维基百科的解释: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合 ...

  5. Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程

    一.HTTPS 是什么? 根据维基百科的解释: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合 ...

  6. Nginx配置SSL证书部署HTTPS方法

    1.申请域名,绑定服务器ip(我申请的是阿里云服务器,以下就此为例) 2.可以在阿里云上免费申请SSL证书(下载证书,后续会用到) 3.在服务器中配置证书 在服务器上安装Nginx 将下载好的证书上传 ...

  7. 【踩坑】Nginx上配置ssl证书实现https访问

    昨天开始为域名挂上ssl证书,使得可以以https去访问服务器.按照网上所介绍的配置Nginx,然而一直访问不了网站. 第二天排查了一早上,发现不单要配置Nginx,阿里云上安全组要开启443端口,并 ...

  8. IIS - 自动申请、部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议)

    IIS - 自动申请.部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议) 2017-12-19发布:hangge阅读:161   一.HTTPS 协议介绍 1,什么是 HTTP ...

  9. 我们在部署 HTTPS 网站时,该如何选择SSL证书?

    我们在部署 HTTPS 网站时,该如何选择SSL证书? 首次部署HTTPS网站的同学对选择什么样的SSL证书多多少少都有点迷茫. 这里考虑的因素确实不少:是否支持多域名.泛域名,价格,信息泄露的保额, ...

随机推荐

  1. 图解servlet

    You can see the following illustration to better understand the lifecycle of the Servlet. When the r ...

  2. 机器学习常见的几种评价指标:精确率(Precision)、召回率(Recall)、F值(F-measure)、ROC曲线、AUC、准确率(Accuracy)

    原文链接:https://blog.csdn.net/weixin_42518879/article/details/83959319 主要内容:机器学习中常见的几种评价指标,它们各自的含义和计算(注 ...

  3. 用Python程序批量删除excel里面的图片

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Rhinoceros PS:如有需要Python学习资料的小伙伴可以 ...

  4. JAVA语言的环境搭建

    1.下载JDK 下载地址 https://www.oracle.com/technetwork/java/javase/downloads/index.html 2.安装JDK 傻瓜式的安装,一直点击 ...

  5. Flask(Jinja2) 服务端模板注入漏洞(SSTI)

    flask Flask 是一个 web 框架.也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序.这个 wdb 应用程序可以使一些 web 页面.博客.wiki.基于 we ...

  6. linux软件管理-RPM

    目录 linux软件管理-RPM RPM的基础概述 RPM包安装管理 linux软件管理-RPM RPM的基础概述 rpm:RPM全称RPM Package Manager缩写,由红帽开发用于软件包的 ...

  7. 关于APICloud与DCloud的我的一些看法

    最近因为项目需要,研究了一下市场较为流行的四种移动开发平台:Wex5.APPcan.Dcloud.APICloud,Wex5因为界面UI较为老旧,且语法和js有较大出入,APPcan不开源等缘故,主要 ...

  8. Java面试题-基础篇二(干货)

    11.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用 ...

  9. Cooperation、Collaboration与Coordination的区别

    Cooperation.Collaboration与Coordination的区别 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. Coopera ...

  10. nginx代理ambassador,再转到mlfow-tracking服务

    这个服务的代理,相对于服务网关来说,有些典型, 今天调通了,作个记录. 一,nginx配置 upstream ai_ambassador { ip_hash; server 1.2.3.4:30080 ...