Nginx Server配置SSL功能

Nginx的https功能

Nginx的https功能

Web网站的登录页面通常都会使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。

在这里插入图片描述

https 实现过程如下:
1.客户端发起HTTPS请求:
客户端访问某个web端的https地址,一般都是443端口
2.服务端的配置:
采用https协议的服务器必须要有一套证书,可以通过一些组织申请,也可以自己制作,目前国内很多网站都自己做的,当你访问一个网站的时候提示证书不可信任就表示证书是自己做的,证书就是一个公钥和私钥匙,就像一把锁和钥匙,正常情况下只有你的钥匙可以打开你的锁,你可以把这个送给别人让他锁住一个箱子,里面放满了钱或秘密,别人不知道里面放了什么而且别人也打不开,只有你的钥匙是可以打开的。
3.传送证书:
服务端给客户端传递证书,其实就是公钥,里面包含了很多信息,例如证书得到颁发机构、过期时间等等。
4.客户端解析证书:
这部分工作是有客户端完成的,首先回验证公钥的有效性,比如颁发机构、过期时间等等,如果发现异常则会弹出一个警告框提示证书可能存在问题,如果证书没有问题就生成一个随机值,然后用证书对该随机值进行加密,就像2步骤所说把随机值锁起来,不让别人看到。
5.传送4步骤的加密数据:
就是将用证书加密后的随机值传递给服务器,目的就是为了让服务器得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值进行加密解密了。
6.服务端解密信息:
服务端用私钥解密5步骤加密后的随机值之后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,对称加密就是将信息和私钥通过算法混合在一起,这样除非你知道私钥,不然是无法获取其内部的内容,而正好客户端和服务端都知道这个私钥,所以只要机密算法够复杂就可以保证数据的安全性。
7.传输加密后的信息:
服务端将用私钥加密后的数据传递给客户端,在客户端可以被还原出原数据内容。
8.客户端解密信息:
客户端用之前生成的私钥获解密服务端传递过来的数据,由于数据一直是加密的,因此即使第三方获取到数据也无法知道其详细内容。
https配置参数

nginx 的https 功能基于模块ngx_http_ssl_module实现,因此如果是编译安装的nginx要使用参数ngx_http_ssl_module开启ssl功能,但是作为nginx的核心功能,yum安装的nginx默认就是开启的,编译安装的nginx需要指定编译参数–with-http_ssl_module开启

官方文档

  • https://nginx.org/en/docs/http/ngx_http_ssl_module.html

常用配置参数

ssl on | off;
#为指定的虚拟主机配置是否启用ssl功能,此功能在1.15.0废弃,使用listen [ssl]替代
listen 443 ssl;


ssl_certificate /path/to/file;
#指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件


ssl_certificate_key /path/to/file;
#当前虚拟主机使用的私钥文件,一般是key文件


ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
#支持ssl协议版本,早期为ssl现在是TLS,默认为后三个


ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
#配置ssl缓存
		off: #关闭缓存
		none: #通知客户端支持ssl session cache,但实际不支持
		builtin[:size]#使用OpenSSL内建缓存,为每worker进程私有
		[shared:name:size]#在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间大小,一兆可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称

ssl_session_timeout time;
#客户端连接可以复用ssl session cache中缓存的有效时长,默认5m
创建自签名证书步骤
#安装软件包openssl
rpm -qa| grep -q "^openssl" || yum -y install openssl
#创建CA证书存放目录
mkdir -pv /apps/nginx/ssl && cd /apps/nginx/ssl
#创建CA证书
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt
Generating a 4096 bit RSA private key
.....................................++
....................++
writing new private key to 'ca.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 (2 letter code) [XX]:CN
State or Province Name (full name) []:hubei 
Locality Name (eg, city) [Default City]:wuhan
Organization Name (eg, company) [Default Company Ltd]:deming.org
Organizational Unit Name (eg, section) []:yunwei
Common Name (eg, your name or your server's hostname) []:www.deming.org
Email Address []:

#创建key和csr文件
openssl req -newkey rsa:4096 -nodes -sha256 -keyout www.deming.org.key -out www.deming.org.csr
www.deming.org.csr
Generating a 4096 bit RSA private key
..................................................................................................................................++
.................................................................................................................................................................................++
writing new private key to 'www.deming.org.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 (2 letter code) [XX]:CN
State or Province Name (full name) []:hubei
Locality Name (eg, city) [Default City]:wuhan
Organization Name (eg, company) [Default Company Ltd]:deming.org      
Organizational Unit Name (eg, section) []:yunwei
Common Name (eg, your name or your server's hostname) []:www.deming.org
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

#查看目录状态
[root@nginx ssl 16:35]$ll
total 16
-rw-r--r-- 1 root root 2025 Sep 12 16:25 ca.crt
-rw-r--r-- 1 root root 3272 Sep 12 16:25 ca.key
-rw-r--r-- 1 root root 1704 Sep 12 16:35 www.deming.org.csr
-rw-r--r-- 1 root root 3268 Sep 12 16:35 www.deming.org.key

#签发证书
openssl x509 -req -days 3650 -in www.deming.org.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out www.deming.org.crt
Signature ok
subject=/C=CN/ST=hubei/L=wuhan/O=deming.org/OU=yunwei/CN=www.deming.org
Getting CA Private Key

#验证证书内容
openssl x509 -in www.deming.org.crt -noout -text
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            fb:cd:81:50:ad:b0:f2:cb
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=hubei, L=wuhan, O=deming.org, OU=yunwei, CN=www.deming.org
        Validity
            Not Before: Sep 12 16:41:21 2022 GMT
            Not After : Sep  9 16:41:21 2032 GMT
        Subject: C=CN, ST=hubei, L=wuhan, O=deming.org, OU=yunwei, CN=www.deming.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                #后续证书内容太多就省略了
                ....
创建自签名证书脚本
#!/bin/bash
CREATE_URL="/apps/nginx/ssl"
CA_SUBJECT="/0=deming/CN=ca.deming.org"
SUBJECT="/C=CN/ST=HUBEI/L=WUHAN/0=deming/CN=www.deming.org"
SERIAL=34
EXPIRE=99
FILE=deming.org
#检查是否安装openssl
if rpm -qa |grep -q "^openssl" ;then
	yum -y install openssl || echo "无法安装openssl包";exit  
fi
#开始生成CA证书
[ -d $CREATE_URL ] || mkdir -pv $CREATE_URL
cd $CREATE_URL || exit
openssl req -x509 -newkey rsa:2048 -subj $CA_SUBJECT -keyout ca.key -nodes -days $EXPIRE -out ca.crt
openssl req	-newkey rsa:2048 -nodes -keyout ${FILE}.key -subj $SUBJECT -out ${FILE}.csr
openssl x509 -req -in ${FILE}.csr -CA ca.crt -CAkey ca.key -set_serial $SERIAL -days $EXPIRE -out ${FILE}.crt
chmod 600 "$FILE".key ca.key

#合成
if [ -f $CREATE_URL/$FILE.crt ] && [ -f $CREATE_URL/ca.crt ];then
    cat $CREATE_URL/$FILE.crt $CREATE_URL/ca.crt > www.$FILE.crt
    mv $FILE.key www.$FILE.key || exit
fi

[ -f www.$FILE.crt ] && echo "CA证书:www.$FILE.crt创建成功"

nginx配置示例

#修改配置文件,在配置文件中增加以下行
server{
	ssl on
	listen 443 ssl;
	ssl_certificate /apps/nginx/ssl/www.$FILE.crt;
	ssl_certificate_key	/apps/nginx/ssl/www.$FILE.key;
	ssl_session_cache shared:name:20m;
	ssl_session_timeout 10m;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值