广告
返回顶部
首页 > 资讯 > 精选 >如何进行nginx配置ssl加密
  • 876
分享到

如何进行nginx配置ssl加密

2023-06-04 17:06:47 876人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关如何进行Nginx配置ssl加密,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书

这篇文章将为大家详细讲解有关如何进行Nginx配置ssl加密,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番。一开始采用的是全站加密,所有访问Http:80的请求强制转换(rewrite)到https,后来自动化测试结果说响应速度太慢,https比http慢慢30倍,心想怎么可能,鬼知道他们怎么测的。所以就试了一下部分页面https(不能只针对某类动态请求才加密)和双向认证。下面分节介绍。

默认nginx是没有安装ssl模块的,需要编译安装nginx时加入--with-http_ssl_module选项。

提示:nignx到后端服务器由于一般是内网,所以不加密。

1. 全站ssl

全站做ssl是最常见的一个使用场景,默认端口443,而且一般是单向认证。

server {        listen 443;        server_name example.com;        root /apps/www;        index index.html index.htm;        ssl on;        ssl_certificate ../SSL/ittest.pem;        ssl_certificate_key ../SSL/ittest.key;#        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;#        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;#        ssl_prefer_server_ciphers on;}

如果想把http的请求强制转到https的话:

server {  listen      80;  server_name example.me;  rewrite     ^   https://$server_name$request_uri? permanent;### 使用return的效率会更高 #  return 301 https://$server_name$request_uri;}

ssl_certificate证书其实是个公钥,它会被发送到连接服务器的每个客户端,ssl_certificate_key私钥是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取。当然私钥和证书可以放在一个证书文件中,这种方式也只有公钥证书才发送到client。

ssl_protocols指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。

ssl_ciphers选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。这里指定的是OpenSSL库能够识别的写法,你可以通过 openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'(后面是你所指定的套件加密算法) 来看所支持算法。

ssl_prefer_server_ciphers on设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。

https优化参数

  • ssl_session_cache shared:SSL:10m; : 设置ssl/tls会话缓存的类型和大小。如果设置了这个参数一般是sharedbuildin可能会参数内存碎片,默认是none,和off差不多,停用缓存。如shared:SSL:10m表示我所有的nginx工作进程共享ssl会话缓存,官网介绍说1M可以存放约4000个sessions。 详细参考serverfault上的问答ssl_session_cache。

  • ssl_session_timeout : 客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h

设置较长的keepalive_timeout也可以减少请求ssl会话协商的开销,但同时得考虑线程并发数了。

提示:在生成证书请求csr文件时,如果输入了密码,nginx每次启动时都会提示输入这个密码,可以使用私钥来生成解密后的key来代替,效果是一样的,达到免密码重启的效果:

openssl rsa -in ittest.key -out ittest_unsecure.key

导入证书

如果你是找一个知名的SSL证书颁发机构如VeriSign、Wosign、StartSSL签发的证书,浏览器已经内置并信任了这些根证书,如果你是自建C或获得二级CA授权,都需要将CA证书添加到浏览器,这样在访问站点时才不会显示不安全连接。各个浏览的添加方法不在本文探讨范围内。

2. 部分页面ssl

一个站点并不是所有信息都是非常机密的,如网上商城,一般的商品浏览可以不通过https,而用户登录以及支付的时候就强制经过https传输,这样用户访问速度和安全性都得到兼顾。

但是请注意不要理解错了,是对页面加密而不能针对某个请求加密,一个页面或地址栏的URL一般会发起许多请求的,包括CSS/png/js等静态文件和动态的java或PHP请求,所以要加密的内容包含页面内的其它资源文件,否则就会出现http与https内容混合的问题。在http页面混有https内容时,页面排版不会发生乱排现象;在https页面中包含以http方式引入的图片、js等资源时,浏览器为了安全起见会阻止加载。

下面是只对example.com/account/login登录页面进行加密的栗子:

root /apps/www;index index.html index.htm;server {    listen      80;    server_name example.com;    location ^~ /account/login {        rewrite ^ https://$server_name:443$request_uri? permanent;    }    location / {        proxy_pass  http://localhost:8080;        ### Set headers ####        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_redirect     off;     }}server {    listen 443 ssl;    server_name example.com;    ssl on;    ssl_certificate ../SSL/ittest.pem;    ssl_certificate_key ../SSL/ittest.key;    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;    ssl_prefer_server_ciphers on;    location ^~ /account/login {        proxy_pass  http://localhost:8080;        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_redirect     off;         ### Most phppython, Rails, Java App can use this header -> https ###        proxy_set_header X-Forwarded-Proto  $scheme;    }    location / {        rewrite  ^  http://$server_name$request_uri? permanent;    }}

关于rewrite与location的写法参考这里。当浏览器访问http://example.com/account/login.xx时,被301到https://example.com/account/login.xx,在这个ssl加密的虚拟主机里也匹配到/account/login,反向代理到后端服务器,后面的传输过程是没有https的。这个login.xx页面下的其它资源也是经过https请求nginx的,登录成功后跳转到首页时的链接使用http,这个可能需要开发代码里面控制。

  • 上面配置中使用了proxy_set_header X-Forwarded-Proto $scheme,在jsp页面使用request.getScheme()得到的是https 。如果不把请求的$scheme协议设置在header里,后端jsp页面会一直认为是http,将导致响应异常。

  • ssl配置块还有个与不加密的80端口类似的location /,它的作用是当用户直接通过https访问首页时,自动跳转到不加密端口,你可以去掉它允许用户这样做。

3. 实现双向ssl认证

上面的两种配置都是去认证被访问的站点域名是否真实可信,并对传输过程加密,但服务器端并没有认证客户端是否可信。(实际上除非特别重要的场景,也没必要去认证访问者,除非像银行U盾这样的情况)

要实现双向认证HTTPS,nginx服务器上必须导入CA证书(根证书/中间级证书),因为现在是由服务器端通过CA去验证客户端的信息。还有必须在申请服务器证书的同时,用同样的方法生成客户证书。取得客户证书后,还要将它转换成浏览器识别的格式(大部分浏览器都认识PKCS12格式):

openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

然后把这个client.p12发给你相信的人,让它导入到浏览器中,访问站点建立连接的时候nginx会要求客户端把这个证书发给自己验证,如果没有这个证书就拒绝访问。

同时别忘了在 nginx.conf 里配置信任的CA:(如果是二级CA,请把根CA放在后面,形成CA证书链)

    proxy_ignore_client_abort on;    ssl on;    ...    ssl_verify_client on;    ssl_verify_depth 2;    ssl_client_certificate ../SSL/ca-chain.pem;#在双向location下加入:    proxy_set_header X-SSL-Client-Cert $ssl_client_cert;

拓展:使用geo模块

nginx默认安装了一个ngx_http_geo_module,这个geo模块可以根据客户端IP来创建变量的值,用在如来自172.29.73.0/24段的IP访问login时使用双向认证,其它段使用一般的单向认证。

geo $duplexing_user {    default 1;    include geo.conf;  # 注意在0.6.7版本以后,include是相对于nginx.conf所在目录而言的}

语法 geo [$address] $variable { … },位于http段,默认地址是$reoute_addr,假设 conf/geo.conf 内容:

127.0.0.1/32    LOCAL;  # 本地172.29.73.23/32 SEAN;   # 某个IP172.29.73.0/24  1;      # IP段,可以按国家或地域定义后面的不同的值

需要配置另外一个虚拟主机server{ssl 445},里面使用上面双向认证的写法,然后在80或443里使用变量$duplexing_user去判断,如果为1就rewrite到445,否则rewrite到443。

关于如何进行nginx配置ssl加密就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何进行nginx配置ssl加密

本文链接: https://www.lsjlt.com/news/238891.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何进行nginx配置ssl加密
    这篇文章将为大家详细讲解有关如何进行nginx配置ssl加密,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书...
    99+
    2023-06-04
  • 服务器ssl加密如何配置
    要配置服务器的SSL加密,您需要完成以下步骤:1. 生成SSL证书:您可以使用自签名证书或购买证书。自签名证书可以通过OpenSSL...
    99+
    2023-08-15
    服务器 ssl
  • Nginx如何配置ssl证书
    本文小编为大家详细介绍“Nginx如何配置ssl证书”,内容详细,步骤清晰,细节处理妥当,希望这篇“Nginx如何配置ssl证书”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。如果有防火墙的话,记得开通443端口准...
    99+
    2023-07-04
  • Nginx如何配置ssl实现https
    这篇文章主要介绍了Nginx如何配置ssl实现https,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、安装 Nginx ssl 模块1.检查检查是否已安装 ssl 模块:...
    99+
    2023-06-29
  • Nginx本地如何配置SSL访问
    这篇文章主要介绍“Nginx本地如何配置SSL访问”,在日常操作中,相信很多人在Nginx本地如何配置SSL访问问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Nginx本地如何配置SSL访问”的疑惑有所帮助!...
    99+
    2023-06-30
  • 如何设置ssl网页加密
    设置ssl网页加密的方法:下载证书,并上传到服务器。打开网站目录,找到usr/local/Nginx/conf下的"xxx.conf"这个文件。(xxx是你的域名前缀)打开文件并添加以下内容:listen 443 ssl http2;ssl...
    99+
    2022-10-04
  • outlook如何设置ssl加密端口
    outlook设置ssl加密端口的操作步骤:打开outlook软件,点击左上角“文件”按钮。再点击左侧“信息”,选择“帐户设置”。在弹出的会话框中,在“电子邮箱”选项卡下点击“更改”。在会话框中,点击“其他设置”。选择“高级”选项卡。勾选“...
    99+
    2022-10-12
  • 如何在spring中对配置文件进行加密
    这篇文章将为大家详细讲解有关如何在spring中对配置文件进行加密,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。通过继承spring配置类并重写处理方法实现密文解密public c...
    99+
    2023-05-30
    spring
  • 如何进行Nginx高性能优化配置
    本篇文章为大家展示了如何进行Nginx高性能优化配置,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Nginx是Apache服务不错的替代品。其特点是占有内存少,并发能力强,事实上nginx的并发能力...
    99+
    2023-06-15
  • 怎么在SpringBoot 配置文件进行加密
    本篇文章为大家展示了怎么在SpringBoot 配置文件进行加密,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先需要确定一个加密解密方式,本文采用 RSA 进行加密解密,首先编写加密解密的代码,注...
    99+
    2023-06-14
  • 如何进行CentOS5.1远程控制升级安装ssl配置编译
    今天就跟大家聊聊有关如何进行CentOS5.1远程控制升级安装ssl配置编译,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。CentOS5.1远程升级ssh到5.0p1 因为服务器在机...
    99+
    2023-06-16
  • 如何给yml配置文件的密码加密(SpringBoot)
    目录1.低版本2.x1)引入jar包2)生成密码3)测下解密4)yml配置5)测测登录2.高版本 3.x1)引入jar包2)生成密码3)yml配置最近在忙着解决规约扫描的问题,其一就...
    99+
    2022-11-13
    yml配置文件 yml密码加密 yml配置文件密码加密
  • 如何在JAVA中使用MD5加密对密码进行加密
    本篇文章为大家展示了如何在JAVA中使用MD5加密对密码进行加密,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。新建Md5.javapackage com.loger.md5;import java....
    99+
    2023-05-31
    java md5加密 ava
  • 如何使用PHP进行加密和解密?
    PHP是一种流行的服务器端脚本语言,它可以用来创建复杂的Web应用程序。其中一个重要的功能是加密和解密敏感数据。在本文中,我们将讨论如何使用PHP进行加密和解密。对称加密算法对称加密算法是最常见的加密方式之一,也被称为单密钥加密。它使用同一...
    99+
    2023-05-22
    PHP加密(Encryption) PHP解密(Decryption) 对称加密(Symmetric encryptio
  • 如何在Java中使用RSA加密对密码进行加密解密
    这期内容当中小编将会给大家带来有关如何在Java中使用RSA加密对密码进行加密解密,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体如下:public static void ...
    99+
    2023-05-31
    java rsa加密 ava
  • 如何进行Nginx反向代理与服务器的配置缓冲
    本篇文章为大家展示了如何进行Nginx反向代理与服务器的配置缓冲,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Nginx反向代理关于对后端服务器的配置。对于广大的网...
    99+
    2022-10-19
  • SpringBoot如何加密配置文件的SQL账号密码
    这篇文章主要介绍了SpringBoot如何加密配置文件的SQL账号密码的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot如何加密配置文件的SQL账号密码文章都会有所收获,下面我们一起来看看吧。1...
    99+
    2023-07-02
  • 如何配置ASP.NET中的旧加密模式
    在ASP.NET中,可以通过配置文件来启用旧的加密模式。具体而言,需要修改`machine.config`或应用程序的`Web.co...
    99+
    2023-09-07
    ASP.NET
  • 在Nginx下如何对网站进行密码保护
    这篇文章主要讲解了“在Nginx下如何对网站进行密码保护”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Nginx下如何对网站进行密码保护”吧!很多时候我们...
    99+
    2022-10-19
  • dbms如何对数据进行加密
    利用dbms对数据进行加密的方法首先,在数据库中新建一个test表;drop table test;create table test(userid varchar2(50) primary key,password varcha...
    99+
    2022-10-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作