Nginx配合OpenSSL使用

OpenSSL命令最常用的命令列表及其注释:

# 生成RSA密钥对
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
openssl rsa -pubout -in private_key.pem -out public_key.pem

# 生成自签名证书
openssl req -new -x509 -sha256 -days 365 -key private_key.pem -out certificate.pem

# 查看证书信息
openssl x509 -in certificate.pem -text -noout

# 加密文件
openssl enc -aes-256-cbc -salt -in plaintext.txt -out encrypted.txt -pass pass:secret_key

# 解密文件
openssl enc -d -aes-256-cbc -in encrypted.txt -out decrypted.txt -pass pass:secret_key

# 生成PKCS#12格式的证书包
openssl pkcs12 -export -in certificate.pem -inkey private_key.pem -out certificate.p12 -name "MyCertificate"

# 从PKCS#12格式的证书包中提取证书和私钥
openssl pkcs12 -in certificate.p12 -nokeys -out certificate_extracted.pem
openssl pkcs12 -in certificate.p12 -nocerts -nodes -out private_key_extracted.pem

# 生成CA证书(自签名根证书)
openssl req -new -x509 -sha256 -days 365 -key private_key.pem -out ca_certificate.pem

# 使用CA证书签发客户端证书
openssl req -new -key client_key.pem -out client_csr.pem
openssl x509 -req -in client_csr.pem -CA ca_certificate.pem -CAkey private_key.pem -CAcreateserial -out client_certificate.pem -days 365 -sha256

# 验证证书链
openssl verify -CAfile ca_certificate.pem client_certificate.pem

要为Nginx生成SSL证书,您通常会生成一个私钥和一个证书签名请求(CSR),然后使用这个请求来获取一个由认证机构(CA)签名的证书。对于本地或测试环境,您也可以生成一个自签名的证书。以下是一个生成自签名证书的完整脚本,包含注释:

#!/bin/bash

# 定义证书输出相关的文件名
DOMAIN=mydomain.com
PRIVATE_KEY="$DOMAIN.key"
CSR="$DOMAIN.csr"
CERTIFICATE="$DOMAIN.crt"

# 创建一个新的RSA私钥用于SSL证书
# 请注意,这里使用的是2048位的密钥长度,这是目前被广泛接受的安全标准
openssl genpkey -algorithm RSA -out $PRIVATE_KEY -pkeyopt rsa_keygen_bits:2048

# 生成证书签名请求(CSR)
# 这里您需要填写组织的相关信息,如国家代码、省份、城市、组织名称等
openssl req -new -key $PRIVATE_KEY -out $CSR -subj "/C=US/ST=State/L=City/O=Organization/CN=$DOMAIN"

# 生成自签名SSL证书
# 这里的证书有效期设置为365天,您可以根据需要调整这个值
openssl req -x509 -sha256 -days 365 -key $PRIVATE_KEY -in $CSR -out $CERTIFICATE

# 输出文件信息提示
echo "私钥文件: $PRIVATE_KEY"
echo "证书签名请求(CSR)文件: $CSR"
echo "自签名证书文件: $CERTIFICATE"

# 提醒用户将私钥和证书文件复制到Nginx的相关目录
echo "请确保将私钥($PRIVATE_KEY)和证书($CERTIFICATE)复制到Nginx的SSL目录,并在Nginx配置文件中进行相应配置。"

将上述脚本保存到一个文件中,比如叫做generate_ssl.sh,然后在终端中执行以下命令来运行它:

chmod +x generate_ssl.sh
./generate_ssl.sh

执行这个脚本后,您将得到两个文件:一个是私钥文件(DOMAIN.key),另一个是自签名的证书文件(DOMAIN.crt)。您需要将这两个文件放置到Nginx的SSL目录中,并在Nginx配置文件中引用它们。以下是一个Nginx配置文件中引用SSL证书和私钥的示例:

 

server {
    listen 443 ssl;
    server_name mydomain.com;

    ssl_certificate /path/to/your/ssl/$DOMAIN.crt;
    ssl_certificate_key /path/to/your/ssl/$DOMAIN.key;

    # ... 其他配置 ...
}

请确保替换/path/to/your/ssl/为您存放SSL文件的实际路径,并且将$DOMAIN替换为您实际使用的域名。

注意:自签名证书通常只用于测试和开发目的,因为它们不会被浏览器信任。对于生产环境,您应该从一个受信任的CA获取证书。

为了让给为让安全的配置更多的使用,参考我的加强完整版本,可能需要根据您的具体需求进一步调整配置。

server {
    listen 443 ssl http2;
    server_name mydomain.com;

    ssl_certificate /path/to/your/ssl/mydomain.com.crt;
    ssl_certificate_key /path/to/your/ssl/mydomain.com.key;

    # 强化SSL安全性
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # 启用OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    # 添加安全相关的响应头
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    # 静态文件服务
    location / {
        root /path/to/your/root;
        index index.html index.htm;
        try_files $uri $uri/ =404;
    }

    # 代理设置(如果您正在使用后端服务器)
    location /app {
        proxy_pass http://backend_server;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 配置日志文件路径
    access_log /var/log/nginx/mydomain.com.access.log;
    error_log /var/log/nginx/mydomain.com.error.log;

    # ... 其他配置 ...
}

这个配置文件提供了以下功能:

  1. 监听443端口并通过SSL加密通信。
  2. 启用HTTP/2以提高性能。
  3. 设置SSL证书和私钥的路径。
  4. 配置SSL协议和密码套件,增强安全性。
  5. 启用OCSP Stapling以减少SSL/TLS握手时间。
  6. 添加一些安全相关的HTTP头部。
  7. 设置静态文件服务的路径和规则。
  8. 示例后端代理配置,用于将请求转发到后端应用服务器。
  9. 配置日志文件的路径。

确保您已经拥有有效的SSL证书,并且正确设置了文件路径。

Nginx的配置通常分布在多个文件中,主要包括:

  1. 主配置文件 (nginx.conf):这是Nginx的全局配置文件,通常位于/etc/nginx/nginx.conf
  2. 服务器块配置文件:这些文件定义了特定的服务器块(虚拟主机),通常位于/etc/nginx/sites-available/,并且通过符号链接到/etc/nginx/sites-enabled/以启用它们。
  3. mime.types文件:定义了发送给客户端的文件类型的MIME类型。
  4. 自定义配置片段:这些片段可能包括SSL配置、日志配置等,通常包含在主配置文件或服务器块配置中。

给出了一个简化版的nginx.conf主配置文件模板,包含了注释以解释每个部分的用途:

# 用户和组设置(通常为nginx或www-data)
user nginx;

# 设置Nginx进程数,通常设置为可用CPU核心数
worker_processes auto;

# 错误日志的路径和日志级别
error_log /var/log/nginx/error.log warn;

# 进程文件的路径
pid /var/run/nginx.pid;

# 工作模式和连接数上限
events {
    # 每个进程最大连接数(包括连接到后端服务器的连接)
    worker_connections 1024;
}

# http块包含了一系列的HTTP设置
http {
    # 包含mime.types文件,定义了MIME类型
    include /etc/nginx/mime.types;
    # 默认文件类型
    default_type application/octet-stream;

    # 日志格式定义
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    # 访问日志的路径
    access_log /var/log/nginx/access.log main;

    # 发送文件时使用的高效传输模式
    sendfile on;
    # 防止网络阻塞
    tcp_nopush on;
    # 防止网络超时
    tcp_nodelay on;

    # 保持连接的超时时间
    keepalive_timeout 65;

    # 包含额外的参数(如SSL参数)
    include /etc/nginx/conf.d/*.conf;
    
    # 启用Gzip压缩
    gzip on;
    gzip_disable "msie6";
    # ...其他Gzip设置...

    # 包含虚拟主机的配置
    include /etc/nginx/sites-enabled/*;

    # ...其他HTTP设置...
}

http块中,您可以添加额外的模块和设置,例如SSL配置、缓存设置、负载均衡等。每个服务器块(虚拟主机)的配置通常保存在单独的文件中,并包括在/etc/nginx/sites-enabled/目录下,如之前提供的SSL服务器配置示例。

可以使用命令systemctl reload nginxnginx -s reload

可以使用命令nginx -t进行测试,并确保Nginx服务重新加载了配置文件,可以使用命令systemctl reload nginxnginx -s reload

 

版权所有 © 2023  王一帆

本作品采用“署名-相同方式共享 4.0 国际 (CC BY-SA 4.0)”进行许可。完整许可证文本可在 https://creativecommons.org/licenses/by-sa/4.0/ 查阅。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值