nginx配置ssl证书

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx配置ssl证书相关的知识,希望对你有一定的参考价值。

nginx负载均衡

由于一个Web服务同时能处理的用户并发请求的数量有限,同时还有机器故障的情况,所以一个Web站点通常会在N台机器上各部署一套同样的程序。当某一个服务挂掉的时候,还有第二个、第三个。继续为用户提供服务,给用户的感觉,你的服务还在正常的运行,同时避免一台服务器处理请求负载高,而其他的服务器又处于空闲状态,造成资源浪费
nginx在upsteam中来指定多个负载均衡的真实ip地址,server中的proxy_pass来引用upstream定义的ip模块,ip_hash让用户请求始终在一个服务器上处理,这样就不会把同一个用户的请求分发到不同服务器上
比如不同服务器在一段时间内处理请求造成登录状态异常
nginx支持后端服务器的端口代理,如能代理后端服务器的80端口,nginx不支持负载均衡后端是443端口的web服务
如果需要代理443这种端口的话,只能在负载均衡这台服务器上配置443,再由负载均衡去把80转发成443端口
如果让用户通过负载均衡服务器访问的是https的网站时,则在负载均衡服务器上指定后端是80端口的web服务器

[[email protected] vhost]# vim load.conf 
upstream qq
{
 ?  ip_hash;
 ?  server 111.161.64.40:80;
 ?  server 111.161.64.48:80;
}
server
{
 ?  listen 80;
 ?  server_name .*.qq.com;
 ?  location /
 ?  {
 ? ? ?  proxy_pass http://qq;
 ? ? ?  proxy_set_header Host $host;
 ? ? ?  proxy_set_header X-Real-IP $remote_addr;
 ? ? ?  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 ?  }
}

在linux终端中进行访问测试,在DNS设置解析时,只要把负载均衡服务器添加到DNS解析中,处理请求先通过负载代理处理,之后负载均衡处理方式是把请求转发给upstream中的服务器处理

[[email protected] vhost]# curl -x127.0.0.1:80 www.qq.com |head -n 10
  % Total % Received % Xferd Average Speed Time Time Time Current
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Dload Upload Total Spent Left Speed
 ?0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta content="text/html; charset=gb2312" http-equiv="Content-Type">
<meta http-equiv="X-UA-Compatible" content="IE=edge">

ssl原理

https是网页传输时加密的一种通信协议,实现这种通信协议的是ssl加密协议,https避免网站数据传输时数据被抓取解析,通过公钥加密私钥解密方式来解码传输的数据

浏览器发送一个https的请求给服务器?;
服务器要有一套数字证书,可以自己制作(后面的操作就是自己制作的证书),也可以向组织申请,区别就是自颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出>提示页面?,这套证书其实就是一?对公钥和私钥;
服务器会把公钥传输给客户端;
客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;.客户端把加密后的随机字符串传输给服务器;
服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密就是将数据和私钥也就是这个随机字符串>通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容)
服务器把加密后的数据传输给客户端;客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;
技术分享图片

生成ssl密钥对

生成密钥对要使用到openssl工具,没有这个工具需要安装,这里使用rpm -qf通过这个命令查询这个命令的包是否安装了,这里本机服务器已经安装了openssl命令的安装包,生下的不再多做演示,可以通过yum命令安装这个安装包
[[email protected] conf]# rpm -qf which openssl
生成ssl证书的命令,下面会详细介绍各个参数的意义

openssl genrsa -des3 -out tmp.key 2048
openssl rsa -in tmp.key -out aaa.com.key
openssl req -new -key aaa.com.key -out aaa.com.csr
openssl x509 -req -days 365 -in aaa.com.csr -signkey aaa.com.key -out aaa.com.crt

生成初始的key私钥,这里私钥携带密码,我们需要将密码删除掉

[[email protected] conf]# openssl genrsa -des3 -out tmp.key 2048
Generating RSA private key, 2048 bit long modulus
.................................+++
................................................................+++
e is 65537 (0x10001)
Enter pass phrase for tmp.key:
Verifying - Enter pass phrase for tmp.key:

创建初始密码时需要输入一个密码,但是这个密码会在用户访问网站时需要认证,通常我们不希望这样,需要我们把私钥中的密码删除掉

[[email protected] conf]# openssl rsa -in tmp.key -out aaa.com.key
Enter pass phrase for tmp.key:
writing RSA key

使用私钥文件生成证书请求文件

[[email protected] conf]# openssl req -new -key aaa.com.key -out aaa.com.csr
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 (2 letter code) [XX]:国家 ? ?
State or Province Name (full name) []:地区 ? 
Locality Name (eg, city) [Default City]:城区
Organization Name (eg, company) [Default Company Ltd]:公司
Organizational Unit Name (eg, section) []:部门
Common Name (eg, your name or your server‘s hostname) []:主机名或个人名
Email Address []:邮箱
Please enter the following ‘extra‘ attributes
to be sent with your certificate request
A challenge password []:设定证书密码
An optional company name []:公司其他名称

使用证书请求文件和私钥来生成一个公钥文件

[[email protected] conf]# openssl x509 -req -days 365 -in aaa.com.csr -signkey aaa.com.key -out aaa.com.crt
Signature ok
subject=/C=JP/ST=xC3xA5xC2xA4xC2xA7xC3xA9xC2x98xC2xAA/L=xC3xA5xC2x9FxC2x8ExC3xA4xC2xB8xC2x9CxC3xA5xC2x8CxC2xBA/O=xC3xA4xC2xB8xC2xADxC3xA4xC2xBAxC2x8CxC3xA7xC2xA7xC2x91xC3xA6xC2x8AxC2x80xC3xA6xC2xA0xC2xAAxC3xA5xC2xBCxC2x8FxC3xA4xC2xBCxC2x9AxC3xA7xC2xA4xC2xBE/OU=xC3xA8xC2xBFxC2x90xC3xA7xC2xBBxC2xB4xC3xA6xC2x8AxC2x80xC3xA6xC2x9CxC2xAFxC3xA9xC2x83xC2xA8xC3xA9xC2x97xC2xA8/CN=localhost/[email protected]
Getting Private key

nginx配置ssl

在server模块下配置ssl证书,配置位置在listen后面,也就是指定域名和网站根目录的相同配置下
如果nginx在编译时未安装ssl_module,那么就需要重新编译添加上ssl模块,配置ssl证书后然后重新启动

server 
{
 ?  listen 443;
 ?  server_name aaa.com;
 ?  index index.html index.php;
 ?  root /deta/wwwroot/aaa/
 ?  ssl on;
 ?  ssl_certificate aaa.com.crt;
 ?  ssl_certificate_key aaa.com.key;
 ?  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
                                     未完,可能不再在博客中补充需要注意的地方

以上是关于nginx配置ssl证书的主要内容,如果未能解决你的问题,请参考以下文章

Nginx配置SSL证书

Nginx配置SSL证书

nginx下如何配置 ssl证书?腾讯云ssl证书为例!

为啥 ssl证书只能绑在nginx上

nginx配置ssl证书,允许ssl访问

nginx配置阿里云免费ssl证书实现https化