Nginx自建SSL证书部署HTTPS网站
一、创建SSL相关证书
1.安装Nginx(这里为了测试使用yum安装,实际看具体情况)
- [root@localhost ~]# yum install nginx -y #默认yum安装已经支持SSL,如果是自己编译的可以通过 nginx -V 查看当前Nginx是否支持SSL
- [root@localhost ~]# cd /etc/nginx/
- [root@localhost nginx]# mkdir ssl
- [root@localhost nginx]# cd ssl/
2.生成一个RSA密钥
- [root@localhost ssl]# openssl genrsa -des3 -out nginx.key 1024 #实际使用中看服务器性能,如果足够好也可以使用4096位秘钥
- Generating RSA private key, bit long modulus
- .......++++++
- ...++++++
- e is (0x10001)
- Enter pass phrase for nginx.key: #输入密码,自定义,不少于4个字符
- Verifying - Enter pass phrase for nginx.key: #确认密码
3.生成一个证书请求
- [root@localhost ssl]# openssl req -new -key nginx.key -out nginx.csr
- Enter pass phrase for nginx.key: #输入刚刚创建的秘密码
- You are about to be asked to enter information that will be incorporated
- into your certificate request.
- What you are about to enter is what is called a Distinguished Name or a DN.
- There are quite a few fields but you can leave some blank
- For some fields there will be a default value,
- If you enter '.', the field will be left blank.
- -----
- Country Name ( letter code) [XX]:CN #国家名称
- State or Province Name (full name) []:ShangHai #省
- Locality Name (eg, city) [Default City]:ShangHai #市
- Organization Name (eg, company) [Default Company Ltd]:ACBC #公司
- Organizational Unit Name (eg, section) []:Tech #部门
- Common Name (eg, your name or your server's hostname) []:*.mydomain.com #注意,此处应当填写你要部署的域名,如果是单个则直接添加即可,如果不确定,使用*,表示可以对所有mydomain.com的子域名做认证
- Email Address []:admin@mydomain.com #以域名结尾即可
- Please enter the following 'extra' attributes
- to be sent with your certificate request
- A challenge password []: #是否设置密码,可以不写直接回车
- An optional company name []: #其他公司名称 可不写
4.创建不需要输入密码的RSA证书,否则每次reload、restart都需要输入密码
- [root@localhost ssl]# openssl rsa -in nginx.key -out nginx_nopass.key
- Enter pass phrase for nginx.key: #之前RSA秘钥创建时的密码
- writing RSA key
5.签发证书(由于是测试自己签发,实际应该将自己生成的csr文件提交给SSL认证机构认证)
- [root@localhost ssl]# openssl x509 -req -days -in nginx.csr -signkey nginx.key -out nginx.crt
- Signature ok
- subject=/C=CN/ST=ShangHai/L=ShangHai/O=ACBC/OU=Tech/CN=*.mydomain.com/emailAddress=admin@mydomain.com
- Getting Private key
- Enter pass phrase for nginx.key: #RSA创建时的密码
二、配置Nginx
1、修改配置文件(注意域名,特别是443)
- # For more information on configuration, see:
- # * Official English Documentation: http://nginx.org/en/docs/
- # * Official Russian Documentation: http://nginx.org/ru/docs/
- user nginx;
- worker_processes auto;
- error_log /var/log/nginx/error.log;
- pid /run/nginx.pid;
- # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
- include /usr/share/nginx/modules/*.conf;
- events {
- worker_connections 1024;
- }
- http {
- 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 /var/log/nginx/access.log main;
- sendfile on;
- tcp_nopush on;
- tcp_nodelay on;
- keepalive_timeout 65;
- types_hash_max_size 2048;
- include /etc/nginx/mime.types;
- default_type application/octet-stream;
- include /etc/nginx/conf.d/*.conf;
- server {
- listen 80 default_server;
- listen [::]:80 default_server;
- server_name test.mydomain.com; #配置自己的域名 注意要以自己申请证书时填写的域名一致
- root /usr/share/nginx/html;
- # Load configuration files for the default server block.
- include /etc/nginx/default.d/*.conf;
- location / {
- }
- error_page 404 /404.html;
- location = /40x.html {
- }
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- }
- }
- # Settings for a TLS enabled server.
- server {
- listen 443 ssl http2 default_server;
- listen [::]:443 ssl http2 default_server;
- server_name test.mydomain.com; #与申请时的域名保持一致,否则会报错
- root /usr/share/nginx/html;
- ssl_certificate "/etc/nginx/ssl/nginx.crt"; #
- ssl_certificate_key "/etc/nginx/ssl/nginx_nopass.key";
- ssl_session_cache shared:SSL:1m;
- ssl_session_timeout 10m;
- ssl_ciphers HIGH:!aNULL:!MD5;
- ssl_prefer_server_ciphers on;
- # Load configuration files for the default server block.
- include /etc/nginx/default.d/*.conf;
- location / {
- }
- error_page 404 /404.html;
- location = /40x.html {
- }
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- }
- }
- }
#配置简介
- ssl_certificate证书其实是个公钥,它会被发送到连接服务器的每个客户端,ssl_certificate_key私钥是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取。当然私钥和证书可以放在一个证书文件中,这种方式也只有公钥证书才发送到client。
- ssl_session_timeout 客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h。
- ssl_protocols指令用于启动特定的加密协议,nginx在1..13和1..12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1. TLSv1.,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0. ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。
- ssl_ciphers选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。这里指定的是OpenSSL库能够识别的写法,你可以通过 openssl -v cipher ‘RC4:HIGH:!aNULL:!MD5’(后面是你所指定的套件加密算法) 来看所支持算法。
- ssl_prefer_server_ciphers on设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
2.启动服务
- [root@localhost nginx]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@localhost nginx]# echo "This test page" > /usr/share/nginx/html/test.html #创建一个测试页面
- [root@localhost nginx]# systemctl restart nginx
3.测试
绑定 test.mydomain.com域名对应的IP到客户端
使用HTTP协议访问
使用HTTPS协议访问
有个警告,正常,应用我们的证书没有经过认证,点击高级,点击继续前往
从结果看,HTTPS配置成功
4.有时候我们希望无论是HTTP或者HTTPS协议都通过HTTPS访问,可以做如下配置
- server {
- listen default_server;
- listen [::]: default_server;
- server_name test.mydomain.com;
- root /usr/share/nginx/html;
- # Load configuration files for the default server block.
- include /etc/nginx/default.d/*.conf;
- return 301 https://$server_name$request_uri; #在80监听端口 配置跳转
在使用HTTP协议访问,为避免缓存的影响,我们可以换一个浏览器
输入URL后回车,跳转到HTTPS了, 点击高级-->接受风险并继续
结果为:
三、配置Nginx使用HTTPS代理后端Tomcat服务
1.下载Tomcat,并测试是否访问正常
- [root@localhost nginx]# cd /mnt/
- [root@localhost mnt]# tar xf apache-tomcat-7.0..tar.gz
- [root@localhost mnt]# cd apache-tomcat-7.0./bin/
- [root@localhost bin]# ./startup.sh
- [root@localhost bin]# curl -I http://172.16.150.132:8080 #如果在他为200 OK则正常
2.配置Nginx代理到Tomcat
Nginx代理可以分为两种情况
1.全代理
2.只代理动态请求,静态请求本地或者代理到其他静态服务器上,即动静分离
我们先配置第一种情况:全代理
- [root@localhost bin]# cd /etc/nginx/
- [root@localhost nginx]# vim nginx.conf
- server {
- listen ssl http2 default_server;
- listen [::]: ssl http2 default_server;
- server_name test.mydomain.com;
- root /usr/share/nginx/html;
- ssl_certificate "/etc/nginx/ssl/nginx.crt";
- ssl_certificate_key "/etc/nginx/ssl/nginx_nopass.key";
- ssl_session_cache shared:SSL:1m;
- ssl_session_timeout 10m;
- ssl_ciphers HIGH:!aNULL:!MD5;
- ssl_prefer_server_ciphers on;
- # Load configuration files for the default server block.
- include /etc/nginx/default.d/*.conf;
- location / {
- proxy_pass http://localhost:8080; #使用proxy_pass 直接代理
- }
- [root@localhost bin]# cd /etc/nginx/
- [root@localhost nginx]# vim nginx.conf
- [root@localhost nginx]# systemctl restart nginx
访问测试一下,直接使用HTTP协议
没有问题
动静分离配置
- [root@localhost nginx]# vim nginx.conf
- location / { #删除之前的8080代理
- index index.html index.htm;
- }
- location ~ \.(jsp|jspx|do|action)(\/.*)?$ {
- proxy_set_header real_ip $remote_addr;
- proxy_pass http://localhost:8080;
- }
- [root@localhost nginx]# nginx -t
- [root@localhost nginx]# systemctl restart nginx
访问HTML文件
访问JSP文件
3.生产其他常见配置
- proxy_set_header Host $http_host; #避免http请求中丢失Host头部的情况下Host不被重写的失误
- proxy_set_header X-Forwarded-For $http_x_forwarded_for; #代表客户端,也就是HTTP的请求端真实的IP
- proxy_set_header X-Real-IP $remote_addr; #将$remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip
- add_header Access-Control-Allow-Origin *; #表示允许访问的外域请求
- add_header Access-Control-Allow-Headers X-Requested-With; #首部字段用于预检请求的响应。其指明了实际请求中允许携带的首部字段。
- add_header Access-Control-Allow-Methods GET,POST,OPTIONS; #首部字段用于预检请求的响应。其指明了实际请求所允许使用的 HTTP 方法。
- add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"; #防止中间人攻击
- add_header X-Frame-Options:ALLOW-FROM http://www.growingio.com; # 避免点击劫持 (clickjacking) 的攻击
- add_header X-Content-Type-Options nosniff; #不允许浏览器任何猜测的行为
- ssi on; #开启SSI
- ssi_silent_errors on;
- ssi_types *;
- proxy_redirect http:// $scheme://; #修改从被代理服务器传来的应答头中的"Location"和"Refresh"字段,将http修改为https
- port_in_redirect on; #告诉nginx,遇到跳转的时候,不要加上自己的端口号
- #可配置参数由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响应的验证
- #如果启用了ssl_stapling,则以file PEM格式 指定具有受信任CA证书的证书,用于验证客户端证书和OCSP响应。 顺序为 站点证书、中间证书(1张或多张)、根证书
ssl_trusted_certificate /path/to/file;- #使用Diffie-Hellman方法让访问者的浏览器和服务器安全的交换密钥
#使用 openssl dhparam -out /usr/ssl/dhparam.pem 2048 命令生成需要的pem文件 其中默认为1024位
ssl_dhparam /etc/ssl/certs/dhparam.pem;- 网站SSL配置检查:
https://www.ssllabs.com/ssltest/ https://myssl.com/myssl.com
Nginx自建SSL证书部署HTTPS网站的更多相关文章
- Nginx配置SSL证书部署HTTPS网站(颁发证书)
一.Http与Https的区别HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高 ...
- Nginx配置SSL证书部署HTTPS网站
1.购买ssl证书 购买网站:沃通 2.上传证书到nginx服务器,然后进行解压. 解压后的的效果: [root@bubidev-ng3 nginx]# pwd/etc/nginx [root@bub ...
- SSL证书部署HTTPS站点Apache/Nginx配置
SSL证书及HTTPS协议 SSL 证书是一种数字证书,它使用 Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道,从而实现:1.数据信息在客户端和服务器之间的 ...
- [转] Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程
一.HTTPS 是什么? 根据维基百科的解释: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合 ...
- Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程
一.HTTPS 是什么? 根据维基百科的解释: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合 ...
- Nginx配置SSL证书部署HTTPS方法
1.申请域名,绑定服务器ip(我申请的是阿里云服务器,以下就此为例) 2.可以在阿里云上免费申请SSL证书(下载证书,后续会用到) 3.在服务器中配置证书 在服务器上安装Nginx 将下载好的证书上传 ...
- 【踩坑】Nginx上配置ssl证书实现https访问
昨天开始为域名挂上ssl证书,使得可以以https去访问服务器.按照网上所介绍的配置Nginx,然而一直访问不了网站. 第二天排查了一早上,发现不单要配置Nginx,阿里云上安全组要开启443端口,并 ...
- IIS - 自动申请、部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议)
IIS - 自动申请.部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议) 2017-12-19发布:hangge阅读:161 一.HTTPS 协议介绍 1,什么是 HTTP ...
- 我们在部署 HTTPS 网站时,该如何选择SSL证书?
我们在部署 HTTPS 网站时,该如何选择SSL证书? 首次部署HTTPS网站的同学对选择什么样的SSL证书多多少少都有点迷茫. 这里考虑的因素确实不少:是否支持多域名.泛域名,价格,信息泄露的保额, ...
随机推荐
- 图解servlet
You can see the following illustration to better understand the lifecycle of the Servlet. When the r ...
- 机器学习常见的几种评价指标:精确率(Precision)、召回率(Recall)、F值(F-measure)、ROC曲线、AUC、准确率(Accuracy)
原文链接:https://blog.csdn.net/weixin_42518879/article/details/83959319 主要内容:机器学习中常见的几种评价指标,它们各自的含义和计算(注 ...
- 用Python程序批量删除excel里面的图片
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Rhinoceros PS:如有需要Python学习资料的小伙伴可以 ...
- JAVA语言的环境搭建
1.下载JDK 下载地址 https://www.oracle.com/technetwork/java/javase/downloads/index.html 2.安装JDK 傻瓜式的安装,一直点击 ...
- Flask(Jinja2) 服务端模板注入漏洞(SSTI)
flask Flask 是一个 web 框架.也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序.这个 wdb 应用程序可以使一些 web 页面.博客.wiki.基于 we ...
- linux软件管理-RPM
目录 linux软件管理-RPM RPM的基础概述 RPM包安装管理 linux软件管理-RPM RPM的基础概述 rpm:RPM全称RPM Package Manager缩写,由红帽开发用于软件包的 ...
- 关于APICloud与DCloud的我的一些看法
最近因为项目需要,研究了一下市场较为流行的四种移动开发平台:Wex5.APPcan.Dcloud.APICloud,Wex5因为界面UI较为老旧,且语法和js有较大出入,APPcan不开源等缘故,主要 ...
- Java面试题-基础篇二(干货)
11.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用 ...
- Cooperation、Collaboration与Coordination的区别
Cooperation.Collaboration与Coordination的区别 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. Coopera ...
- nginx代理ambassador,再转到mlfow-tracking服务
这个服务的代理,相对于服务网关来说,有些典型, 今天调通了,作个记录. 一,nginx配置 upstream ai_ambassador { ip_hash; server 1.2.3.4:30080 ...