Pārlūkot izejas kodu

更新 HTTPS 证书申请相关的功能

zjcqoo 6 gadi atpakaļ
vecāks
revīzija
414e0ba51b
6 mainītis faili ar 63 papildinājumiem un 40 dzēšanām
  1. 0 12
      acme.conf
  2. 2 2
      docs/cert-auto.md
  3. 2 2
      docs/cert-manual.md
  4. 54 23
      i.sh
  5. 0 1
      nginx.conf
  6. 5 0
      www.conf

+ 0 - 12
acme.conf

@@ -1,12 +0,0 @@
-#
-# 提供 Let's Encrypt 服务验证 challenge
-#
-server {
-  # 从 80 端口重定向过来,因为 jsproxy 用户没有权限开启 80 端口
-  listen                10080;
-  access_log            logs/acme.log combined;
-
-  location /.well-known/acme-challenge/ {
-    root                ../acme;
-  }
-}

+ 2 - 2
docs/cert-auto.md

@@ -1,9 +1,9 @@
 # 自动申请 HTTPS 证书
 
-1.转发 80 端口到 10080 端口(需要 root 权限)
+1.转发 80 端口到 8080 端口(需要 root 权限)
 
 ```bash
-iptables -t nat -I PREROUTING 1 -p tcp --dport 80 -j REDIRECT --to-ports 10080
+iptables -t nat -I PREROUTING 1 -p tcp --dport 80 -j REDIRECT --to-ports 8080
 ```
 
 > 外部访问 http://服务器IP/.well-known/acme-challenge/test.txt 可验证是否正常。返回 `ok` 说明正常。

+ 2 - 2
docs/cert-manual.md

@@ -13,10 +13,10 @@
 
 3.文件保存到服务器 `~/server/acme/.well-known/acme-challenge/` 目录
 
-4.转发 80 端口到 10080 端口(需要 root 权限)
+4.转发 80 端口到 8080 端口(需要 root 权限)
 
 ```bash
-iptables -t nat -I PREROUTING 1 -p tcp --dport 80 -j REDIRECT --to-ports 10080
+iptables -t nat -I PREROUTING 1 -p tcp --dport 80 -j REDIRECT --to-ports 
 ```
 
 当然也可以使用其他 Web 服务,只要该文件能被外部访问就可以。

+ 54 - 23
i.sh

@@ -61,7 +61,7 @@ gen_cert() {
       continue
     fi
 
-    if [[ ! $(grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" <<< $ip) ]]; then
+    if ! grep -qP "^\d+\.\d+\.\d+\.\d+$" <<< $ip; then
       warn "无效 IP:$ip"
       continue
     fi
@@ -81,8 +81,28 @@ gen_cert() {
 
   local acme=~/.acme.sh/acme.sh
 
-  for i in ${DOMAIN_SUFFIX[@]}; do
-    local domain=$ip.$i
+  local domains=()
+
+  if [[ $@ ]]; then
+    for i in $@; do
+      domains+=($i)
+    done
+  else
+    warn "未指定域名,使用公共测试域名"
+    for i in ${DOMAIN_SUFFIX[@]}; do
+      domains+=($ip.$i)
+    done
+  fi
+
+  for domain in ${domains[@]}; do
+    echo "校验域名 $domain ..."
+
+    local ret=$(getent ahosts $domain | head -n1 | awk '{print $1}')
+    if [[ $ret != $ip ]]; then
+      err "域名 $domain 解析结果: $ret,非本机公网 IP: $ip"
+      continue
+    fi
+
     log "尝试为域名 $domain 申请证书 ..."
 
     local dist=server/cert/$domain
@@ -119,7 +139,7 @@ $url  'mysite';" >> server/allowed-sites.conf
       break
     fi
 
-    err "证书申请失败!"
+    err "证书申请失败!(80 端口是否添加到防火墙)"
     rm -rf $dist
   done
 }
@@ -171,7 +191,9 @@ install() {
   server/run.sh
 
   log "服务已开启"
-  gen_cert
+  
+  shift 1
+  gen_cert $@
 }
 
 main() {
@@ -187,39 +209,48 @@ main() {
     exit 1
   fi
 
-  if ! id -u jsproxy > /dev/null 2>&1 ; then
-    log "创建用户 jsproxy ..."
-    groupadd nobody > /dev/null 2>&1
-    useradd jsproxy -g nobody --create-home
+  local cmd
+  if [[ $0 == *"i.sh" ]]; then
+    warn "本地调试模式"
+
+    local dst=/home/jsproxy/i.sh
+    cp $0 $dst
+    chown jsproxy:nobody $dst
+    if [[ $1 == "-s" ]]; then
+      shift 1
+    fi
+    cmd="bash $dst install $@"
+  else
+    cmd="curl -s $SRC_URL/i.sh | bash -s install $@"
   fi
 
-  warn "HTTPS 证书申请需要验证 80 端口,确保 TCP:80 已添加到防火墙"
-  warn "如果当前已有 80 端口的服务,将暂时无法收到数据"
   iptables \
-    -m comment --comment "acme challenge svc" \
     -t nat \
     -I PREROUTING 1 \
     -p tcp --dport 80 \
     -j REDIRECT \
-    --to-ports 10080
+    --to-ports 8080
+
+  if ! id -u jsproxy > /dev/null 2>&1 ; then
+    log "创建用户 jsproxy ..."
+    groupadd nobody > /dev/null 2>&1
+    useradd jsproxy -g nobody --create-home
+  fi
 
   log "切换到 jsproxy 用户,执行安装脚本 ..."
-  su - jsproxy -c "curl -s $SRC_URL/i.sh | bash -s install"
+  su - jsproxy -c "$cmd"
 
-  local line=$(iptables -t nat -L --line-numbers | grep "acme challenge svc")
+  local line=$(iptables -t nat -nL --line-numbers | grep "tcp dpt:80 redir ports 8080")
   iptables -t nat -D PREROUTING ${line%% *}
 
   log "安装完成。后续维护参考 https://github.com/EtherDream/jsproxy"
 }
 
 
-case $1 in
-"install")
-  install;;
-"cert")
-  gen_cert;;
-*)
-  main;;
-esac
+if [[ $1 == "install" ]]; then
+  install $@
+else
+  main $@
+fi
 
 } # this ensures the entire script is downloaded #

+ 0 - 1
nginx.conf

@@ -6,7 +6,6 @@ http {
     include               api.conf;
     include               www.conf;
   }
-  include                 acme.conf;
 
   # https://nginx.org/en/docs/http/ngx_http_core_module.html
   resolver                1.1.1.1 ipv6=off;

+ 5 - 0
www.conf

@@ -44,3 +44,8 @@ location / {
   root                ../www;
   index               404.html;
 }
+
+# HTTPS 证书申请验证
+location /.well-known/acme-challenge/ {
+  root                ../acme;
+}