签名密钥

Nginx 使用 PGP(Pretty Good Privacy)签名来验证下载的软件包的完整性和真实性。

PGP 签名概述

为什么需要签名验证

  • 完整性:确保文件未被篡改
  • 真实性:确认文件来自官方来源
  • 安全性:防止恶意软件注入

签名文件

Nginx 提供两种签名文件:

  • .asc:ASCII 格式的签名
  • .sig.gpg:二进制格式签名

安装 GnuPG

Ubuntu/Debian

sudo apt update
sudo apt install gnupg

CentOS/RHEL

sudo yum install gnupg2

macOS

brew install gnupg

Windows

下载并安装 Gpg4win

导入 Nginx 签名密钥

# 下载签名密钥
curl -O https://nginx.org/keys/nginx_signing.key

# 导入密钥
gpg --import nginx_signing.key

# 验证密钥
gpg --list-keys

输出示例:

pub   rsa2048 2011-08-19 [SC]
      B0F4253373F8F5F5ADA8A3BC2FFE8E521A1D9F87
uid           [ unknown] nginx signing key <signing-key@nginx.com>
sub   rsa2048 2011-08-19 [E]

验证下载的文件

验证源代码包

# 下载源代码和签名
wget http://nginx.org/download/nginx-1.24.0.tar.gz
wget http://nginx.org/download/nginx-1.24.0.tar.gz.asc

# 验证签名
gpg --verify nginx-1.24.0.tar.gz.asc nginx-1.24.0.tar.gz

成功输出:

gpg: Signature made Mon 24 Apr 2023 12:34:56 PM UTC
gpg:                using RSA key B0F4253373F8F5F5ADA8A3BC2FFE8E521A1D9F87
gpg: Good signature from "nginx signing key <signing-key@nginx.com>" [unknown]

验证 Linux 软件包

# Ubuntu/Debian
wget http://nginx.org/packages/ubuntu/pool/nginx/n/nginx/nginx_1.24.0-1~jammy_amd64.deb
wget http://nginx.org/packages/ubuntu/pool/nginx/n/nginx/nginx_1.24.0-1~jammy_amd64.deb.asc

# 验证签名
gpg --verify nginx_1.24.0-1~jammy_amd64.deb.asc nginx_1.24.0-1~jammy_amd64.deb
# CentOS/RHEL
wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.24.0-1.el7.ngx.x86_64.rpm
wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.24.0-1.el7.ngx.x86_64.rpm.asc

# 验证签名
gpg --verify nginx-1.24.0-1.el7.ngx.x86_64.rpm.asc nginx-1.24.0-1.el7.ngx.x86_64.rpm

验证 Windows 二进制文件

# 下载 Windows 二进制文件和签名
curl -O http://nginx.org/download/nginx-1.24.0.zip
curl -O http://nginx.org/download/nginx-1.24.0.zip.asc

# 验证签名
gpg --verify nginx-1.24.0.zip.asc nginx-1.24.0.zip

验证文件哈希

Nginx 还提供文件的哈希值用于验证:

下载哈希文件

# 下载哈希文件
wget http://nginx.org/download/nginx-1.24.0.tar.gz.md5
wget http://nginx.org/download/nginx-1.24.0.tar.gz.sha1
wget http://nginx.org/download/nginx-1.24.0.tar.gz.sha256

验证哈希

# MD5
md5sum -c nginx-1.24.0.tar.gz.md5

# SHA1
sha1sum -c nginx-1.24.0.tar.gz.sha1

# SHA256
sha256sum -c nginx-1.24.0.tar.gz.sha256

macOS 验证

# MD5
md5 -q nginx-1.24.0.tar.gz | diff - nginx-1.24.0.tar.gz.md5

# SHA256
shasum -a 256 -c nginx-1.24.0.tar.gz.sha256

Windows 验证

# 使用 PowerShell
certutil -hashfile nginx-1.24.0.zip SHA256

签名密钥指纹

Nginx 签名密钥的指纹:

pub   rsa2048 2011-08-19 [SC]
      B0F4253373F8F5F5ADA8A3BC2FFE8E521A1D9F87
uid           [ unknown] nginx signing key <signing-key@nginx.com>
sub   rsa2048 2011-08-19 [E]

指纹:

573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62

信任密钥

# 查看密钥详情
gpg --edit-key B0F4253373F8F5F5ADA8A3BC2FFE8E521A1D9F87

# 在 gpg 提示符中
gpg> fpr
gpg> sign
gpg> save
gpg> quit

更新密钥

# 从密钥服务器更新密钥
gpg --keyserver keys.gnupg.net --recv-keys B0F4253373F8F5F5ADA8A3BC2FFE8E521A1D9F87

# 或使用 hkps://keys.openpgp.org
gpg --keyserver hkps://keys.openpgp.org --recv-keys B0F4253373F8F5F5ADA8A3BC2FFE8E521A1D9F87

删除密钥

# 删除密钥
gpg --delete-key B0F4253373F8F5F5ADA8A3BC2FFE8E521A1D9F87

# 删除密钥和签名
gpg --delete-secret-and-public-key B0F4253373F8F5F5ADA8A3BC2FFE8E521A1D9F87

常见问题

1. 签名验证失败

# 错误信息
gpg: Can't check signature: No public key

# 解决方案
gpg --keyserver keys.gnupg.net --recv-keys B0F4253373F8F5F5ADA8A3BC2FFE8E521A1D9F87

2. 密钥未信任

# 错误信息
gpg: Good signature from "nginx signing key <signing-key@nginx.com>" [unknown]

# 解决方案
# 手动验证指纹后信任密钥
gpg --edit-key B0F4253373F8F5F5ADA8A3BC2FFE8E521A1D9F87
gpg> trust
gpg> 5
gpg> save

3. 文件损坏

# 错误信息
gpg: BAD signature

# 解决方案
# 重新下载文件
wget http://nginx.org/download/nginx-1.24.0.tar.gz

自动化验证脚本

#!/bin/bash

# verify_nginx.sh

FILE=$1
if [ -z "$FILE" ]; then
    echo "Usage: $0 <file>"
    exit 1
fi

# 检查签名文件
if [ ! -f "${FILE}.asc" ]; then
    echo "Signature file not found: ${FILE}.asc"
    exit 1
fi

# 验证签名
gpg --verify "${FILE}.asc" "$FILE"

if [ $? -eq 0 ]; then
    echo "✓ Signature verified successfully"
else
    echo "✗ Signature verification failed"
    exit 1
fi

# 验证哈希
if [ -f "${FILE}.sha256" ]; then
    sha256sum -c "${FILE}.sha256"
    if [ $? -eq 0 ]; then
        echo "✓ SHA256 hash verified successfully"
    else
        echo "✗ SHA256 hash verification failed"
        exit 1
    fi
fi

echo "All verifications passed"

使用:

chmod +x verify_nginx.sh
./verify_nginx.sh nginx-1.24.0.tar.gz

安全建议

  1. 始终验证签名:下载后立即验证
  2. 使用官方源:只从 nginx.org 下载
  3. 检查密钥指纹:确保密钥指纹正确
  4. 定期更新密钥:保持密钥最新
  5. 使用 HTTPS:确保下载连接安全