#!/bin/bash # 证书管理脚本 # 用于设置证书目录结构和权限 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查是否为root用户 check_root() { if [[ $EUID -eq 0 ]]; then log_warning "检测到root用户,建议使用普通用户运行此脚本" fi } # 创建证书目录结构 create_cert_directories() { log_info "创建证书目录结构..." # 创建主证书目录 mkdir -p certs/wechat mkdir -p certs/alipay # 创建开发环境证书目录 mkdir -p src/main/resources/certs/dev/wechat mkdir -p src/main/resources/certs/dev/alipay log_success "证书目录结构创建完成" } # 设置证书目录权限 set_cert_permissions() { log_info "设置证书目录权限..." if [ -d "certs" ]; then # 设置目录权限 chmod 755 certs/ chmod 755 certs/wechat/ chmod 755 certs/alipay/ # 设置证书文件权限(如果存在) find certs/ -type f -name "*.pem" -exec chmod 444 {} \; find certs/ -type f -name "*.crt" -exec chmod 444 {} \; log_success "生产环境证书目录权限设置完成" else log_warning "生产环境证书目录不存在,跳过权限设置" fi if [ -d "src/main/resources/certs" ]; then # 设置开发环境目录权限 chmod 755 src/main/resources/certs/ chmod 755 src/main/resources/certs/dev/ chmod 755 src/main/resources/certs/dev/wechat/ chmod 755 src/main/resources/certs/dev/alipay/ # 设置开发环境证书文件权限(如果存在) find src/main/resources/certs/ -type f -name "*.pem" -exec chmod 444 {} \; find src/main/resources/certs/ -type f -name "*.crt" -exec chmod 444 {} \; log_success "开发环境证书目录权限设置完成" else log_warning "开发环境证书目录不存在,跳过权限设置" fi } # 检查证书文件 check_certificates() { log_info "检查证书文件..." # 微信支付证书文件 wechat_files=("apiclient_key.pem" "apiclient_cert.pem" "wechatpay_cert.pem") # 支付宝证书文件 alipay_files=("app_private_key.pem" "appCertPublicKey.crt" "alipayCertPublicKey.crt" "alipayRootCert.crt") log_info "检查生产环境证书文件..." for file in "${wechat_files[@]}"; do if [ -f "certs/wechat/$file" ]; then log_success "✓ certs/wechat/$file" else log_warning "✗ certs/wechat/$file (不存在)" fi done for file in "${alipay_files[@]}"; do if [ -f "certs/alipay/$file" ]; then log_success "✓ certs/alipay/$file" else log_warning "✗ certs/alipay/$file (不存在)" fi done log_info "检查开发环境证书文件..." for file in "${wechat_files[@]}"; do if [ -f "src/main/resources/certs/dev/wechat/$file" ]; then log_success "✓ src/main/resources/certs/dev/wechat/$file" else log_warning "✗ src/main/resources/certs/dev/wechat/$file (不存在)" fi done for file in "${alipay_files[@]}"; do if [ -f "src/main/resources/certs/dev/alipay/$file" ]; then log_success "✓ src/main/resources/certs/dev/alipay/$file" else log_warning "✗ src/main/resources/certs/dev/alipay/$file (不存在)" fi done } # 创建证书文件模板 create_cert_templates() { log_info "创建证书文件模板..." # 创建微信支付证书模板 if [ ! -f "certs/wechat/README.md" ]; then cat > certs/wechat/README.md << 'EOF' # 微信支付证书文件 请将以下证书文件放置在此目录: 1. **apiclient_key.pem** - 商户私钥证书 - 从微信商户平台下载 - 路径:账户中心 -> API安全 -> 下载证书 2. **apiclient_cert.pem** - 商户证书 - 从微信商户平台下载 - 与私钥证书一起下载 3. **wechatpay_cert.pem** - 微信支付平台证书 - 从微信商户平台下载 - 用于验证微信支付的回调通知 ## 注意事项 - 证书文件权限应设置为 444(只读) - 不要将证书文件提交到版本控制系统 - 定期检查证书有效期 EOF log_success "微信支付证书README创建完成" fi # 创建支付宝证书模板 if [ ! -f "certs/alipay/README.md" ]; then cat > certs/alipay/README.md << 'EOF' # 支付宝证书文件 请将以下证书文件放置在此目录: 1. **app_private_key.pem** - 应用私钥 - 应用私钥文件 - 用于签名请求 2. **appCertPublicKey.crt** - 应用公钥证书 - 从支付宝开放平台下载 - 路径:应用详情 -> 开发设置 -> 接口加签方式 3. **alipayCertPublicKey.crt** - 支付宝公钥证书 - 从支付宝开放平台下载 - 用于验证支付宝的响应 4. **alipayRootCert.crt** - 支付宝根证书 - 从支付宝开放平台下载 - 根证书文件 ## 注意事项 - 证书文件权限应设置为 444(只读) - 不要将证书文件提交到版本控制系统 - 定期检查证书有效期 EOF log_success "支付宝证书README创建完成" fi } # 显示使用说明 show_usage() { echo "证书管理脚本使用说明:" echo "" echo "命令:" echo " $0 init - 初始化证书目录结构" echo " $0 check - 检查证书文件状态" echo " $0 perms - 设置证书文件权限" echo " $0 all - 执行所有操作" echo "" echo "示例:" echo " $0 init # 创建证书目录" echo " $0 check # 检查证书文件" echo " $0 all # 完整设置" } # 主函数 main() { case "${1:-}" in "init") check_root create_cert_directories create_cert_templates ;; "check") check_certificates ;; "perms") set_cert_permissions ;; "all") check_root create_cert_directories create_cert_templates set_cert_permissions check_certificates ;; *) show_usage exit 1 ;; esac } # 执行主函数 main "$@"