1. PGP与GPG基础为什么你需要它们第一次听说PGP和GPG时我正面临一个棘手问题需要给海外客户发送包含敏感数据的合同文件。对方明确要求必须使用PGP加密而我当时连这两个缩写都分不清楚。经过多次实战踩坑我发现这其实是每个开发者迟早要掌握的生存技能。PGPPretty Good Privacy就像数字世界的密封蜡最早由Philip Zimmermann在1991年开发。它采用公钥加密体系最经典的场景是你用对方的公钥加密文件只有持有对应私钥的人才能解密。而GPGGNU Privacy Guard是PGP的开源实现完全兼容PGP标准且没有专利限制。现在主流的Linux发行版都内置了GPG工具比如你用的apt/yum安装的gnupg包。实际工作中会遇到这些典型场景与AWS、Azure等云服务商对接时传输API密钥向客户发送包含商业机密的报价单团队内部共享数据库备份文件验证软件包签名防止篡改我特别建议在Mac上使用GPG Suitehttps://gpgtools.org/Windows用户可以选择Gpg4winhttps://www.gpg4win.org/。这两个图形化工具对新手更友好但本文仍以命令行操作为主因为自动化部署时这才是终极解决方案。2. 密钥管理你的数字身份证2.1 生成密钥对第一次运行gpg --full-generate-key时我被满屏的选项吓到了。其实关键选择只有三个密钥类型直接选默认的RSA and RSA输入1。DSA已经逐渐被淘汰而ECC虽然更先进但兼容性稍差。密钥长度3072位是现在的安全基准低于2048位的密钥已被证明不安全。我曾在生产环境用过4096位密钥结果加解密耗时明显增加对日常使用来说性价比不高。有效期商业合作建议设置明确有效期比如2y表示两年个人使用可以选择0永不过期。有个坑要注意过期的密钥虽然能解密历史文件但不能再加密新文件。# 实际生成示例所有交互步骤合并为一行命令 gpg --batch --passphrase your_strong_password --quick-gen-key Alice alicecompany.com rsa3072 sign,auth,encr 2y生成过程中系统会提示需要随机字节这时随意移动鼠标或敲击键盘能加速熵池填充。我在服务器上遇到过卡在这一步的情况解决方法是用rng-tools工具sudo apt install rng-tools sudo rngd -r /dev/urandom2.2 密钥维护技巧撤销证书相当于密钥的自毁按钮建议生成后立即保存到安全位置gpg --gen-revoke alicecompany.com alice_revoke.asc我习惯把撤销证书打印成纸质版存放在保险箱因为数字存储可能被黑客一并窃取。去年就有同事误操作删除了密钥幸亏有撤销证书才能重新建立信任链。密钥服务器上传适合公开分发的公钥但要注意MIT的keyserverhkp://pgp.mit.edu响应最快一旦上传就无法删除只能通过撤销证书标记失效企业内网建议自建keyserver参考SKS搭建指南# 上传公钥到多个服务器 gpg --keyserver hkp://pgp.mit.edu --send-key KEYID gpg --keyserver hkp://keyserver.ubuntu.com --send-key KEYID2.3 密钥备份与迁移导出密钥时务必使用--armor参数生成ASCII格式否则你会得到一堆乱码# 导出公钥可公开分发 gpg --armor --export alicecompany.com alice_public.asc # 导出私钥需密码保护 gpg --armor --export-secret-keys alicecompany.com alice_private.asc遇到过最坑的情况是团队交接时前任管理员只留下了二进制格式的私钥。用xxd工具转换时丢失了部分数据最终不得不重新生成所有密钥。现在我们的运维手册明确要求必须保存ASCII格式备份。3. 文件加密实战从入门到精通3.1 加密的三种姿势基础加密只需要指定接收者IDgpg --encrypt --recipient bobcompany.com sales_report.pdf这会生成sales_report.pdf.gpg文件。但实际业务中我更推荐这种增强版命令gpg --cipher-algo AES256 --compress-algo none \ --output 2023Q4_report.pdf.gpg \ --recipient financecompany.com \ --recipient auditcompany.com \ --encrypt 2023Q4_report.pdf这里有几个经验参数--cipher-algo AES256强制使用军用级加密标准--compress-algo none禁用压缩避免CRIME攻击风险多个--recipient参数允许不同部门各自解密对称加密适合临时共享不需要密钥对gpg --symmetric --output secret.zip.gpg secret.zip系统会提示输入密码这个密码就是解密的唯一凭证。我常用这种方式给市场部同事传大型设计稿配合split命令分卷更安全split -b 50M secret.zip.gpg secret.zip.gpg.part3.2 解密与验证收到加密文件后最简单的解密方式是gpg --output decrypted_file.txt --decrypt encrypted_file.gpg但生产环境中建议增加签名验证gpg --verify document.sig document.txt去年我们遭遇过一次供应链攻击黑客替换了供应商发的加密文件。幸亏验证签名时发现指纹不符避免了数据泄露。现在所有自动化脚本都强制检查签名if ! gpg --status-fd 1 --verify signature.asc 2/dev/null | grep -q GOODSIG; then echo 签名验证失败 2 exit 1 fi4. 企业级应用方案4.1 与AWS的集成实践对接Amazon PSP时他们的文档要求使用GPG加密报表文件。经过多次调试我总结出最佳实践导入Amazon公钥curl -s https://psp-amazon.com/security/amazon.asc | gpg --import加密时指定密钥指纹不要用邮箱gpg --recipient ABCD1234EF56 \ --output daily_transactions.gpg \ --encrypt transactions.csv设置自动解密脚本#!/bin/bash passphrase$(aws secretsmanager get-secret-value \ --secret-id production/gpg-passphrase | jq -r .SecretString) gpg --batch --passphrase $passphrase \ --output $2 \ --decrypt $14.2 自动化运维中的技巧在CI/CD流水线中使用GPG时最头疼的是密码交互问题。推荐两种解决方案方案一使用gpg-agent适合长期运行的服务器echo test1234 | gpg --batch --yes \ --passphrase-fd 0 \ --pinentry-mode loopback \ --output config.decrypted \ --decrypt config.gpg方案二将私钥密码存储在HashiCorp Vault中vault write transit/decrypt/gnupg \ ciphertext$(cat encrypted_data.gpg | base64) \ | jq -r .data.plaintext | base64 -d plaintext.txt曾经在Docker容器里遇到gpg-agent不稳定的情况最终采用这种暴力的内存加载方式gpg --import (echo $GPG_PRIVATE_KEY) shred -u $GPG_PRIVATE_KEY # 立即删除内存中的密钥