nginx ssl加密

Posted 海军同学

tags:

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

1、生成SSL证书

ssl证书可以通过在公有云服务商申请或者自建的方式获取,我这里直接自建

1.1、查看nginx是否安装ssl模块,如果不存在ssl模块,需要编译添加,yum安装的nginx默认支持

nginx -V

1.2 生成key密钥

[root@localhost ~]# cd /etc/nginx
#创建证书目录
[root@localhost nginx]# mkdir ssl&& cd ssl
#系统性能足够好,可使用4096位密钥
[root@localhost ssl]# openssl genrsa -idea -out nginx.key 1024
Generating RSA private key, 1024 bit long modulus
................++++++
...............................++++++
e is 65537 (0x10001)
Enter pass phrase for nginx.key: #输入不少于4字符的密码
Verifying - Enter pass phrase for nginx.key: #验证密码
[root@localhost ssl]# ls
nginx.key

1.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 (2 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]:gass #输入公司名称
Organizational Unit Name (eg, section) []:zhian #输入部门名
Common Name (eg, your name or your server\'s hostname) []:*.domain.com #输入域名,此处应当填写你要部署的域名,如果是单个则直接添加即可,如果不确定,使用*,表示可以对所有domain.com的子域名做认证
Email Address []:admin@domain.com #输入邮箱地址

Please enter the following \'extra\' attributes
to be sent with your certificate request
A challenge password []: #输入密码,可直接跳过
An optional company name []: #可选公司名称,直接跳过
[root@localhost ssl]# ls
nginx.csr  nginx.key

1.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

1.5 生成证书签名文件(CA文件),当前方式为自己签发,实际应该将自己生成的csr文件提交给SSL认证机构认证

#有效期设置了 10 年
[root@localhost ssl]# openssl x509 -req -days 3650 -in jesonc.csr -signkey jesonc.key -out jesonc.crt
Signature ok
subject=/C=CN/ST=ShangHai/L=ShangHai/O=ACBC/OU=Tech/CN=*.domain.com/emailAddress=admin@domain.com
Getting Private key
Enter pass phrase for nginx.key:          #RSA创建时的密码

2、配置nginx

    server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  test.domain.com;   #与申请时的域名保持一致,否则会报错
        root         /usr/share/nginx/html;

        ssl_certificate "/etc/nginx/ssl/nginx.crt";   #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.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设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。

    3、测试

    #查看nginx配置语法
    nginx -t
    #重启nginx
    nginx -s reload

    http访问跳转https

    nginx增添以下配置

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  test.domain.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监听端口 配置跳转

    重启nginx

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

[转帖]nginx配置ssl加密(单/双向认证部分https)

Nginx配置SSL加密访问

Nginx-加密会话

Nginx虚拟主机(包括ssl加密主机)

https 加密协议 ssl 证书 nginx配置,使用docker-compose.yml 构建前端vue或其他项目

ini 使用Let的加密证书为NGINX配置SSL