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;
# ... 其他配置 ...
}
这个配置文件提供了以下功能:
- 监听443端口并通过SSL加密通信。
- 启用HTTP/2以提高性能。
- 设置SSL证书和私钥的路径。
- 配置SSL协议和密码套件,增强安全性。
- 启用OCSP Stapling以减少SSL/TLS握手时间。
- 添加一些安全相关的HTTP头部。
- 设置静态文件服务的路径和规则。
- 示例后端代理配置,用于将请求转发到后端应用服务器。
- 配置日志文件的路径。
确保您已经拥有有效的SSL证书,并且正确设置了文件路径。
Nginx的配置通常分布在多个文件中,主要包括:
- 主配置文件 (
nginx.conf
):这是Nginx的全局配置文件,通常位于/etc/nginx/nginx.conf
。 - 服务器块配置文件:这些文件定义了特定的服务器块(虚拟主机),通常位于
/etc/nginx/sites-available/
,并且通过符号链接到/etc/nginx/sites-enabled/
以启用它们。 mime.types
文件:定义了发送给客户端的文件类型的MIME类型。- 自定义配置片段:这些片段可能包括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 nginx
或nginx -s reload
。
可以使用命令nginx -t
进行测试,并确保Nginx服务重新加载了配置文件,可以使用命令systemctl reload nginx
或nginx -s reload
。
版权所有 © 2023 王一帆
本作品采用“署名-相同方式共享 4.0 国际 (CC BY-SA 4.0)”进行许可。完整许可证文本可在 https://creativecommons.org/licenses/by-sa/4.0/ 查阅。