acme_3.0.sh 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #!/bin/bash
  2. set -e
  3. # 主菜单
  4. while true; do
  5. clear
  6. echo "============== SSL证书管理菜单 =============="
  7. echo "1)申请 SSL 证书"
  8. echo "2)重置环境(清除申请记录并重新部署)"
  9. echo "3)退出"
  10. echo "============================================"
  11. read -p "请输入选项(1-3): " MAIN_OPTION
  12. case $MAIN_OPTION in
  13. 1)
  14. break
  15. ;;
  16. 2)
  17. echo "⚠️ 正在重置环境..."
  18. rm -rf /tmp/acme
  19. echo "✅ 已清空 /tmp/acme,准备重新部署。"
  20. echo "📦 正在重新执行 acme.sh ..."
  21. sleep 1
  22. bash <(curl -fsSL https://raw.githubusercontent.com/slobys/SSL-Renewal/main/acme.sh)
  23. exit 0
  24. ;;
  25. 3)
  26. echo "👋 已退出。"
  27. exit 0
  28. ;;
  29. *)
  30. echo "❌ 无效选项,请重新输入。"
  31. sleep 1
  32. continue
  33. ;;
  34. esac
  35. done
  36. # 用户输入参数
  37. read -p "请输入域名: " DOMAIN
  38. read -p "请输入电子邮件地址: " EMAIL
  39. echo "请选择证书颁发机构(CA):"
  40. echo "1)Let's Encrypt"
  41. echo "2)Buypass"
  42. echo "3)ZeroSSL"
  43. read -p "输入选项(1-3): " CA_OPTION
  44. case $CA_OPTION in
  45. 1) CA_SERVER="letsencrypt" ;;
  46. 2) CA_SERVER="buypass" ;;
  47. 3) CA_SERVER="zerossl" ;;
  48. *) echo "❌ 无效选项"; exit 1 ;;
  49. esac
  50. echo "是否关闭防火墙?"
  51. echo "1)是"
  52. echo "2)否"
  53. read -p "输入选项(1 或 2):" FIREWALL_OPTION
  54. if [ "$FIREWALL_OPTION" -eq 2 ]; then
  55. echo "是否放行特定端口?"
  56. echo "1)是"
  57. echo "2)否"
  58. read -p "输入选项(1 或 2):" PORT_OPTION
  59. if [ "$PORT_OPTION" -eq 1 ]; then
  60. read -p "请输入要放行的端口号: " PORT
  61. fi
  62. else
  63. PORT_OPTION=0
  64. fi
  65. # 检查系统类型
  66. if [ -f /etc/os-release ]; then
  67. . /etc/os-release
  68. OS=$ID
  69. else
  70. echo "❌ 无法识别操作系统,请手动安装依赖。"
  71. exit 1
  72. fi
  73. # 安装依赖项,配置防火墙
  74. case $OS in
  75. ubuntu|debian)
  76. sudo apt update -y
  77. sudo apt upgrade -y
  78. sudo apt install -y curl socat git cron
  79. if [ "$FIREWALL_OPTION" -eq 1 ]; then
  80. if command -v ufw >/dev/null 2>&1; then
  81. sudo ufw disable
  82. else
  83. echo "⚠️ UFW 未安装,跳过关闭防火墙。"
  84. fi
  85. elif [ "$PORT_OPTION" -eq 1 ]; then
  86. if command -v ufw >/dev/null 2>&1; then
  87. sudo ufw allow $PORT
  88. else
  89. echo "⚠️ UFW 未安装,跳过端口放行。"
  90. fi
  91. fi
  92. ;;
  93. centos)
  94. sudo yum update -y
  95. sudo yum install -y curl socat git cronie
  96. sudo systemctl start crond
  97. sudo systemctl enable crond
  98. if [ "$FIREWALL_OPTION" -eq 1 ]; then
  99. sudo systemctl stop firewalld
  100. sudo systemctl disable firewalld
  101. elif [ "$PORT_OPTION" -eq 1 ]; then
  102. sudo firewall-cmd --permanent --add-port=${PORT}/tcp
  103. sudo firewall-cmd --reload
  104. fi
  105. ;;
  106. *)
  107. echo "❌ 不支持的操作系统:$OS"
  108. exit 1
  109. ;;
  110. esac
  111. # 安装 acme.sh(如未装)
  112. if ! command -v acme.sh >/dev/null 2>&1; then
  113. curl https://get.acme.sh | sh
  114. export PATH="$HOME/.acme.sh:$PATH"
  115. ~/.acme.sh/acme.sh --upgrade
  116. fi
  117. # 注册账户
  118. ~/.acme.sh/acme.sh --register-account -m $EMAIL --server $CA_SERVER
  119. # 申请证书
  120. if ! ~/.acme.sh/acme.sh --issue --standalone -d $DOMAIN --server $CA_SERVER; then
  121. echo "❌ 证书申请失败,正在清理。"
  122. rm -f /root/${DOMAIN}.key /root/${DOMAIN}.crt
  123. ~/.acme.sh/acme.sh --remove -d $DOMAIN
  124. rm -rf ~/.acme.sh/${DOMAIN}
  125. exit 1
  126. fi
  127. # 安装证书
  128. ~/.acme.sh/acme.sh --installcert -d $DOMAIN \
  129. --key-file /root/${DOMAIN}.key \
  130. --fullchain-file /root/${DOMAIN}.crt
  131. # 自动续期脚本
  132. cat << EOF > /root/renew_cert.sh
  133. #!/bin/bash
  134. export PATH="\$HOME/.acme.sh:\$PATH"
  135. acme.sh --renew -d $DOMAIN --server $CA_SERVER
  136. EOF
  137. chmod +x /root/renew_cert.sh
  138. (crontab -l 2>/dev/null; echo "0 0 * * * /root/renew_cert.sh > /dev/null 2>&1") | crontab -
  139. # 完成提示
  140. echo "✅ SSL证书申请完成!"
  141. echo "📄 证书路径: /root/${DOMAIN}.crt"
  142. echo "🔐 私钥路径: /root/${DOMAIN}.key"