Nginx系列-9 Nginx配置HTTPS

1.nginx编译

#下载资源
wget http://nginx.org/download/nginx-1.26.0.tar.gz

# 解压资源
tar -zxvf nginx-1.26.0.tar.gz

# 编译nginx
cd nginx-1.26.0/
./configure  --prefix=/usr/local/ewen/nginx --with-http_ssl_module
./make

# 安装nginx
./make install

其中,--with-http_ssl_module表示编译时引入ssl模块。

2.生成私钥和制作证书

对SSL不熟悉的同学可以参考:TLS/SSL协议介绍。这里进行简单描述:消息在公网上传输需要进行加密,以保证信息的安全性。加密有对称加密和非对称加密两种;对称加密使用同一个秘钥进行加密和解密;非对称加密使用一对秘钥进行加解密。对称加密相对于非对称加密速度快、效率高。
在HTTPS握手过程,服务端会将证书(公钥和CA信息)发送给客户端;客户端使用CA信息验证证书的合法性,然后随机生成一个秘钥,并使用证书中携带的公钥对该生成的秘钥加密,然后发送给服务端;服务端使用私钥进行解密,得到秘钥;之后,双方使用这个对称加密的秘钥进行信息的加解密。
因此,需要服务端需要准备一个证书和一个私钥

[1] 生成私钥

# 生成私钥:生成一个2048 位的 RSA 私钥,保存为server.key文件
openssl genrsa -out server.key 2048  

[2] 生成csr文件

# 生成证书:基于server.key私钥生成一个新的证书保存为server.csr文件
openssl req -new -key server.key -out server.csr 

生成过程要求交互式地输入国/省/市/组织,姓名/邮件等信息,如下所示:

[root@localhost 2024]# openssl req -new -key server.key -out server.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]:CN
State or Province Name (full name) []:Jiangsu
Locality Name (eg, city) [Default City]:NanJing
Organization Name (eg, company) [Default Company Ltd]:testOrg
Organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your server's hostname) []:Ewen
Email Address []:shengyu@buaa.edu.cn

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

[3] 使用私钥和CSR生成自签名证书

# 使用私钥和CSR生成自签名证书  
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

X.509是一种广泛使用的公钥证书格式, -days 365设置证书的有效期为365天。
至此,得到两个文件:server.crt证书文件和server.key私钥。

3.配置

可以配置在http块(对整个http块生效)或者server块,配置方式如下:

# 证书文件路径
ssl_certificate      ./cert/server.crt;

# 私钥文件路径
ssl_certificate_key  ./cert/server.key;

http_ssl_module模块还提供一些其他配置参数,用于定义SSL握手的细节:
[1] ssl_session_cache
定义缓存大小,用于存放会话信息, 如加密秘钥等,

# 使用一个名为SSL的共享缓存,其大小为1MB
ssl_session_cache   shared:SSL:1m;

[2] ssl_session_timeout
定义会话的超时时间: 在这个时间内,如果客户端重新连接到服务器且会话ID不变,可以通过缓存中恢复会话,则不需要经过SSL握手;

# 设置SSL会话的过期时间为10分钟
ssl_session_timeout  10m;    

说明: SSL会话被创建后,如果在这10分钟内没有任何活动,那么该会话将被视为过期,并且后续的连接会进行完整的SSL握手过程。

[3] ssl_protocols
指定了Nginx服务器支持的SSL/TLS协议版本。

说明: TLSv1和TLSv1.1已经被认为是不安全的SSL/TLS协议版本

#支持TLSv1.2和TLSv1.3版本的SSL/TLS协议
ssl_protocols TLSv1.2 TLSv1.3;

[4] ssl_ciphers
指定了Nginx服务器在SSL/TLS握手过程中将使用的密码套件列表。

# 这是一个强密码套件, 包括ECDHE密钥交换、RSA签名、AES-128-GCM加密算法和SHA-256哈希算
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!aNULL:!MD5;  

[5] ssl_prefer_server_ciphers
指定了在SSL/TLS握手过程中,Nginx服务器是否优先使用服务器配置的密码套件列表,而不是客户端支持的密码套件列表。

#这有助于确保使用更强的加密算法和协议版本,而不是客户端可能支持的较旧或较弱的选项。 
ssl_prefer_server_ciphers on;  

此时,如果有些客户端不支持服务器指定的加密算法,则客户端会连接失败。所以ssl_prefer_server_ciphers是否设置为on,需要结合业务场景在安全性和兼容性方面做选择。

4.案例介绍

修改nginx.conf配置文件:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        # 监听端口后添加ssl表示https端口
        listen       8443 ssl;
        server_name  localhost;
        
        #相对于conf文件夹路径
        ssl_certificate  cert/server.crt;
        ssl_certificate_key  cert/server.key;

        location /query {
            proxy_pass http://localhost:8000/ask;
        }
    }

    server {
        listen       8000;
        server_name  localhost;

        location /ask {
            return 200 "from 8002/ask";
        }
    }
}

测试结果如下所示:

[root@124 conf]# curl -k https://localhost:8443/query
from 8002/ask[root@124 conf]#
  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值