概念

  • SSL/TLS:安全套接字层(SSL)及其继任者传输层安全性(TLS)是为网络通信提供安全及数据完整性的一种安全协议。它们通过在应用程序协议(如HTTP)与TCP/IP协议族之间提供数据加密封面,来为客户端和服务器之间的通信提供加密。

  • 证书:由证书颁发机构(CA)签发的电子文件,用于验证服务器或客户端的身份。证书包含公钥、颁发者、有效期等信息。

  • 密钥:在SSL/TLS通信中,有两种主要类型的密钥:公钥和私钥。私钥用于对数据进行加密和对由公钥加密的数据进行解密,而公钥则用于对数据进行解密和对由私钥加密的数据进行加密。

  • 证书链验证:客户端验证服务器证书的有效性时,会沿着证书链从服务器的证书开始,一直验证到受信任的根证书颁发机构(CA)。这确保服务器证书是由受信任的CA签发的,并且没有被篡改。

  • 会话恢复:在SSL/TLS通信中,会话恢复是一种优化性能的技术,它允许客户端和服务器在重新建立连接时重用先前的会话参数(如密钥和加密算法),从而减少了握手过程所需的时间和资源。

SSL证书

  • 若在生产环境中使用,请从SSL证书供应商处获取。

  • 本次测试使用自行创建SSL证书。

    1
    2
    3
    4
    5
    6
    7
    8
    # 安装工具,默认情况下是已安装。
    [root@RockyLinux9 ~]# dnf install -y openssl
    [root@RockyLinux9 ~]# cd /usr/local/nginx/conf/

    # 创建自签名证书
    [root@RockyLinux9 conf]# openssl req -x509 -newkey rsa:2048 -keyout linuxjsz.com.key -out linuxjsz.com.crt -nodes -days 365
    [root@RockyLinux9 conf]# ls linuxjsz.com.*
    linuxjsz.com.crt linuxjsz.com.key

nginx配置

  • 确认已经安装和配置了nginx。

  • 官方说明:http://nginx.org/en/docs/http/ngx_http_ssl_module.html

  • 检查安装模块,包含 --with-http_ssl_module

    1
    [root@RockyLinux9 conf]# nginx -V
  • 修改配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    [root@RockyLinux9 conf]# vim nginx.conf
    # 启用http块中的HTTPS server段
    http {

    ...

    # HTTPS server
    server {
    listen 443 ssl;
    server_name linuxjsz.com;

    # 配置证书路径
    ssl_certificate /usr/local/nginx/conf/linuxjsz.com.crt;
    ssl_certificate_key /usr/local/nginx/conf/linuxjsz.com.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
    root html;
    index index.html index.htm;
    }
    }
    }

配置80端口自动跳转443

  • 修改配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@RockyLinux9 conf]# vim nginx.conf
    http {

    server {
    listen 80;
    server_name linuxjsz.com;
    # 添加如下语句
    return 301 https://$host$request_uri;
    }

    # HTTPS server
    ...
    }

SSL常用配置参数

ssl_buffer_size

  • 描述:设置 SSL 读/写缓冲区的大小。

    1
    2
    3
    4
    # 语法
    ssl_buffer_size size;
    # 默认值
    ssl_buffer_size 16k;

ssl_certificate

  • 描述:指定 SSL 证书文件的位置。

    1
    2
    3
    4
    # 语法
    ssl_certificate file;
    # 示例
    ssl_certificate example.com.rsa.crt;

ssl_certificate_key

  • 描述:指定 SSL 私钥文件的位置。

    1
    2
    3
    4
    # 语法
    ssl_certificate_key file;
    # 示例
    ssl_certificate_key example.com.rsa.key;

ssl_ciphers

  • 描述:指定启用的加密套件列表。也可以自定义列表以满足特定的安全需求。

    1
    2
    3
    4
    # 语法
    ssl_ciphers ciphers;
    # 默认值
    ssl_ciphers HIGH:!aNULL:!MD5;

ssl_protocols

  • 描述:指定启用的 SSL/TLS 协议版本。

    1
    2
    3
    4
    # 语法
    ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
    # 默认值
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

ssl_prefer_server_ciphers

  • 描述:设置为 on,则使用服务器提供的加密套件优先于客户端提供的,以增强安全性。

    1
    2
    3
    4
    # 语法
    ssl_prefer_server_ciphers on | off;
    # 示例
    ssl_prefer_server_ciphers off;

ssl_session_cache

  • 描述:指定 SSL 会话缓存的类型、大小和时间。

    1
    2
    3
    4
    5
    6
    # 语法
    ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
    # 默认值
    ssl_session_cache none;
    # 示例
    ssl_session_cache shared:SSL:10m;

ssl_dhparam

  • 描述:指定 DH(Diffie-Hellman)参数文件的路径。

    1
    2
    3
    4
    # 语法
    ssl_dhparam file;
    # 默认值
    ssl_dhparam /path/to/dhparam.pem;

ssl_session_timeout

  • 描述:指定客户端可以重新使用 SSL 会话参数的时间长度。

    1
    2
    3
    4
    # 语法
    ssl_session_timeout time;
    # 默认值
    ssl_session_timeout 5m;