فهرست منبع

enhance: rm acme-challenge if auto-renewal off #30

0xJacky 2 سال پیش
والد
کامیت
88daebbb75
27فایلهای تغییر یافته به همراه651 افزوده شده و 127 حذف شده
  1. 1 1
      frontend/src/version.json
  2. 4 3
      frontend/src/views/domain/DomainEdit.vue
  3. 5 3
      frontend/src/views/domain/cert/Cert.vue
  4. 32 7
      frontend/src/views/domain/cert/IssueCert.vue
  5. 3 1
      frontend/src/views/domain/ngx_conf/NgxConfigEditor.vue
  6. 1 1
      frontend/version.json
  7. 65 71
      resources/development/nginx/sites-available/homework.jackyu.cn
  8. 13 0
      resources/development/nginx/sites-available/ojbk.me
  9. 30 23
      resources/development/nginx/sites-available/qi.jackyu.cn
  10. 24 0
      resources/development/nginx/sites-available/test
  11. 0 1
      resources/development/nginx/sites-enabled/amstourship.jackyu.cn
  12. 1 0
      resources/development/nginx/sites-enabled/homework.jackyu.cn
  13. 1 0
      resources/development/nginx/sites-enabled/qi.jackyu.cn
  14. 1 0
      resources/development/nginx/sites-enabled/test
  15. 64 0
      resources/development/nginx/ssl/homework.jackyu.cn/fullchain.cer
  16. 27 0
      resources/development/nginx/ssl/homework.jackyu.cn/private.key
  17. 64 0
      resources/development/nginx/ssl/ojbk.me/fullchain.cer
  18. 27 0
      resources/development/nginx/ssl/ojbk.me/private.key
  19. 64 0
      resources/development/nginx/ssl/qi.jackyu.cn/fullchain.cer
  20. 27 0
      resources/development/nginx/ssl/qi.jackyu.cn/private.key
  21. 64 0
      resources/development/nginx/ssl/qi.jackyu.cn_amstourship.jackyu.cn/fullchain.cer
  22. 27 0
      resources/development/nginx/ssl/qi.jackyu.cn_amstourship.jackyu.cn/private.key
  23. 64 0
      resources/development/nginx/ssl/test.jackyu.cn/fullchain.cer
  24. 27 0
      resources/development/nginx/ssl/test.jackyu.cn/private.key
  25. 0 16
      server/api/template.go
  26. 2 0
      server/service/template.go
  27. 13 0
      template/block/letsencrypt.conf

+ 1 - 1
frontend/src/version.json

@@ -1 +1 @@
-{"version":"1.7.9","build_id":87,"total_build":157}
+{"version":"1.7.9","build_id":88,"total_build":158}

+ 4 - 3
frontend/src/views/domain/DomainEdit.vue

@@ -4,7 +4,7 @@ import CodeEditor from '@/components/CodeEditor/CodeEditor.vue'
 
 import NgxConfigEditor from '@/views/domain/ngx_conf/NgxConfigEditor'
 import {useGettext} from 'vue3-gettext'
-import {computed, reactive, ref, watch} from 'vue'
+import {computed, provide, reactive, ref, watch} from 'vue'
 import {useRoute, useRouter} from 'vue-router'
 import domain from '@/api/domain'
 import ngx from '@/api/ngx'
@@ -124,7 +124,7 @@ const save = async () => {
         }
     }
 
-    domain.save(name.value, {
+    await domain.save(name.value, {
         name: filename.value || name.value,
         content: configText.value, overwrite: true
     }).then(r => {
@@ -134,7 +134,6 @@ const save = async () => {
     }).catch(handle_parse_error).finally(() => {
         saving.value = false
     })
-
 }
 
 function enable() {
@@ -165,6 +164,8 @@ function on_change_enabled(checked: boolean) {
 
 const editor_md = computed(() => history_chatgpt_record?.value?.length > 1 ? 16 : 24)
 const chat_md = computed(() => history_chatgpt_record?.value?.length > 1 ? 8 : 24)
+
+provide('save_site_config', save)
 </script>
 <template>
     <a-row :gutter="16">

+ 5 - 3
frontend/src/views/domain/cert/Cert.vue

@@ -7,7 +7,8 @@ import ChangeCert from '@/views/domain/cert/ChangeCert.vue'
 
 const {$gettext} = useGettext()
 
-const props = defineProps(['config_name', 'directivesMap', 'current_server_directives', 'enabled', 'cert_info'])
+const props = defineProps(['config_name', 'directivesMap', 'current_server_directives',
+    'enabled', 'ngx_config', 'current_server_index', 'cert_info'])
 
 const emit = defineEmits(['callback', 'update:enabled'])
 
@@ -33,14 +34,15 @@ const enabled = computed({
 <template>
     <div>
         <h2 v-translate>Certificate Status</h2>
-        <cert-info ref="info" :cert="props.cert_info"/>
+        <cert-info ref="info" :cert="cert_info"/>
 
-        <change-cert :directives-map="props.directivesMap"/>
+        <change-cert :directives-map="directivesMap"/>
 
         <issue-cert
             :config_name="config_name"
             :current_server_directives="props.current_server_directives"
             :directives-map="props.directivesMap"
+            :ngx_config="ngx_config"
             v-model:enabled="enabled"
             @callback="callback"
         />

+ 32 - 7
frontend/src/views/domain/cert/IssueCert.vue

@@ -1,17 +1,22 @@
 <script setup lang="ts">
 import {useGettext} from 'vue3-gettext'
-import {computed, nextTick, ref, watch} from 'vue'
+import {computed, inject, nextTick, ref, watch} from 'vue'
 import {message, Modal} from 'ant-design-vue'
 import domain from '@/api/domain'
 import websocket from '@/lib/websocket'
 import Template from '@/views/template/Template.vue'
+import template from '@/api/template'
+import _ from 'lodash'
 
 const {$gettext, interpolate} = useGettext()
 
-const props = defineProps(['config_name', 'directivesMap', 'current_server_directives', 'enabled'])
+const props = defineProps(['config_name', 'directivesMap', 'current_server_directives',
+    'enabled', 'ngx_config'])
 
 const emit = defineEmits(['changeEnabled', 'callback', 'update:enabled'])
 
+const save_site_config: Function = inject('save_site_config')!
+
 const issuing_cert = ref(false)
 const modalVisible = ref(false)
 
@@ -28,21 +33,40 @@ function confirm() {
     Modal.confirm({
         title: enabled.value ? $gettext('Do you want to disable auto-cert renewal?') :
             $gettext('Do you want to enable auto-cert renewal?'),
+        content: enabled.value ? $gettext('We need to add the HTTPChallenge configuration to ' +
+                'this file and reload the Nginx. Are you sure you want to continue?') :
+            $gettext('We will need to remove the HTTPChallenge configuration from this file and ' +
+                'reload the Nginx configuration file. Are you sure you want to continue?'),
         mask: false,
         centered: true,
         onOk() {
-            enabled.value = !enabled.value
+            if (enabled.value) {
+                onchange(false)
+            } else {
+                onchange(true)
+            }
         }
     })
 }
 
-watch(enabled, onchange)
-
-function onchange(r: boolean) {
+async function onchange(r: boolean) {
     emit('changeEnabled', r)
     change_auto_cert(r)
     if (r) {
+        await template.get_block('letsencrypt.conf').then(r => {
+            props.ngx_config.servers.forEach(async (v: any) => {
+                v.locations = v.locations.filter((l: any) => l.path !== '/.well-known/acme-challenge')
+
+                v.locations.push(...r.locations)
+            })
+        })
+        await save_site_config()
         job()
+    } else {
+        await props.ngx_config.servers.forEach((v: any) => {
+            v.locations = v.locations.filter((l: any) => l.path !== '/.well-known/acme-challenge')
+        })
+        save_site_config()
     }
 }
 
@@ -77,9 +101,10 @@ function job() {
     })
 }
 
-function callback(ssl_certificate: string, ssl_certificate_key: string) {
+async function callback(ssl_certificate: string, ssl_certificate_key: string) {
     props.directivesMap['ssl_certificate'][0]['params'] = ssl_certificate
     props.directivesMap['ssl_certificate_key'][0]['params'] = ssl_certificate_key
+    save_site_config()
 }
 
 function change_auto_cert(r: boolean) {

+ 3 - 1
frontend/src/views/domain/ngx_conf/NgxConfigEditor.vue

@@ -177,9 +177,11 @@ function add_server() {
                         <cert
                             v-if="current_support_ssl"
                             :config_name="ngx_config.name"
-                            :cert_info="props.cert_info?.[k]"
+                            :cert_info="cert_info?.[k]"
                             :current_server_directives="current_server_directives"
                             :directives-map="directivesMap"
+                            :current_server_index="current_server_index"
+                            :ngx_config="ngx_config"
                             v-model:enabled="autoCertRef"
                             @callback="$emit('callback')"
                         />

+ 1 - 1
frontend/version.json

@@ -1 +1 @@
-{"version":"1.7.9","build_id":87,"total_build":157}
+{"version":"1.7.9","build_id":88,"total_build":158}

+ 65 - 71
resources/development/nginx/sites-available/homework.jackyu.cn

@@ -1,84 +1,78 @@
 server {
-	listen	80;
-	listen	[::]:80;
-
-	server_name	homework.jackyu.cn;
-  	# rewrite ^(.*)$  https://$host$1 permanent;
-  	return 307 https://$server_name$request_uri;
+    listen 80;
+    listen [::]:80;
+    server_name homework.jackyu.cn;
+    #                               rewrite ^(.*)$  https://$host$1 permanent;
+    return 307 https://$server_name$request_uri;
+    location /.well-known/acme-challenge {
+        proxy_set_header Host $host;
+        proxy_set_header X-Real_IP $remote_addr;
+        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
+        proxy_pass http://127.0.0.1:5002;
+    }
 }
-
 server {
-	listen	443 ssl http2;
-	listen	[::]:443 ssl http2;
-
-	server_name	homework.jackyu.cn;
-
-	ssl_certificate	/etc/nginx/ssl/jackyu.cn/alpha/jackyu.cn_server_cert.pem;
-  	ssl_certificate_key	/etc/nginx/ssl/jackyu.cn/alpha/jackyu.cn_key.pem;
-
-	root	/var/www/homework/frontend;
-
-	# Add index.php to the list if you are using PHP
-	index	index.html;
-
-	location / {
-		# First attempt to serve request as file, then
-		# as directory, then fall back to displaying a 404.
-                index index.html;
-		try_files $uri $uri/ /index.html;
-	}
-    
+    listen 443 ssl http2;
+    listen [::]:443 ssl http2;
+    server_name homework.jackyu.cn;
+    ssl_certificate /etc/nginx/ssl/homework.jackyu.cn/fullchain.cer;
+    ssl_certificate_key /etc/nginx/ssl/homework.jackyu.cn/private.key;
+    root /var/www/homework/frontend;
+    #                               Add index.php to the list if you are using PHP
+    index index.html;
+    location / {
+        # First attempt to serve request as file, then
+        # as directory, then fall back to displaying a 404.
+        index index.html;
+        try_files $uri $uri/ /index.html;
+    }
     location /student {
-      index manage.html;
-      try_files $uri $uri/ /student.html;
-	}
-    
+        index manage.html;
+        try_files $uri $uri/ /student.html;
+    }
     location /teacher {
-      index manage.html;
-      try_files $uri $uri/ /teacher.html;
-	}
-    
+        index manage.html;
+        try_files $uri $uri/ /teacher.html;
+    }
     location /admin {
-      index admin.html;
-      try_files $uri $uri/ /admin.html;
-	}
-            
+        index admin.html;
+        try_files $uri $uri/ /admin.html;
+    }
     location ^~/upload/ {
-		alias /var/www/homework/api/upload/;
-	}
-	include			error_json;
-	location /api/	 {
-    	proxy_http_version 1.1;
+        alias /var/www/homework/api/upload/;
+    }
+    location /api/ {
+        proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection upgrade;
-    
-		proxy_pass         http://127.0.0.1:9008/;
-		proxy_redirect     off;
-
-		proxy_set_header   Host                 $host;
-		proxy_set_header   X-Real-IP            $remote_addr;
-		proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
-		proxy_set_header   X-Forwarded-Proto    $scheme;
+        proxy_pass http://127.0.0.1:9008/;
+        proxy_redirect off;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
         client_max_body_size 1000m;
-	}
-    
-    location /zigbee-pi	 {
-    	alias /var/www/zigbee-pi/frontend/;
-    	index index.html;
-	}
-    
-    location /zigbee-pi/api/	 {
-    	proxy_http_version 1.1;
+    }
+    location /zigbee-pi {
+        alias /var/www/zigbee-pi/frontend/;
+        index index.html;
+    }
+    location /zigbee-pi/api/ {
+        proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection upgrade;
-    
-		proxy_pass         http://127.0.0.1:9200/;
-		proxy_redirect     off;
-
-		proxy_set_header   Host                 $host;
-		proxy_set_header   X-Real-IP            $remote_addr;
-		proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
-		proxy_set_header   X-Forwarded-Proto    $scheme;
+        proxy_pass http://127.0.0.1:9200/;
+        proxy_redirect off;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
         client_max_body_size 1000m;
-	}
-}
+    }
+    location /.well-known/acme-challenge {
+        proxy_set_header Host $host;
+        proxy_set_header X-Real_IP $remote_addr;
+        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
+        proxy_pass http://127.0.0.1:5002;
+    }
+}

+ 13 - 0
resources/development/nginx/sites-available/ojbk.me

@@ -8,4 +8,17 @@ server {
         proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
         proxy_pass http://127.0.0.1:5002;
     }
+}
+server {
+    listen 443 ssl http2;
+    listen [::]:443 ssl http2;
+    server_name ojbk.me;
+    ssl_certificate /etc/nginx/ssl/ojbk.me/fullchain.cer;
+    ssl_certificate_key /etc/nginx/ssl/ojbk.me/private.key;
+    location /.well-known/acme-challenge {
+        proxy_set_header Host $host;
+        proxy_set_header X-Real_IP $remote_addr;
+        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
+        proxy_pass http://127.0.0.1:5002;
+    }
 }

+ 30 - 23
resources/development/nginx/sites-available/qi.jackyu.cn

@@ -1,26 +1,33 @@
 server {
-	listen	80;
-	listen	[::]:80;
-	server_name	qi.jackyu.cn;
-	rewrite ^(.*)$  https://$host$1 permanent;
-
+    listen 80;
+    listen [::]:80;
+    server_name qi.jackyu.cn amstourship.jackyu.cn;
+    rewrite ^(.*)$ https://$host$1 permanent;
+    location /.well-known/acme-challenge {
+        proxy_set_header Host $host;
+        proxy_set_header X-Real_IP $remote_addr;
+        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
+        proxy_pass http://127.0.0.1:5002;
+    }
 }
-
 server {
-	server_name	qi.jackyu.cn;
-	ssl_certificate	/etc/nginx/ssl/jackyu.cn/alpha/jackyu.cn_server_cert.pem;
-	ssl_certificate_key	/etc/nginx/ssl/jackyu.cn/alpha/jackyu.cn_key.pem;
-	listen	443 ssl;
-	listen	[::]:443 ssl;
-
-	location / {
-		proxy_pass         http://127.0.0.1:5001/;
-		proxy_redirect     off;
-		proxy_set_header   Host                 $host;
-		proxy_set_header   X-Real-IP            $remote_addr;
-		proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
-		proxy_set_header   X-Forwarded-Proto    $scheme;
-	}
-
-}
-
+    server_name qi.jackyu.cn amstourship.jackyu.cn;
+    ssl_certificate /etc/nginx/ssl/qi.jackyu.cn_amstourship.jackyu.cn/fullchain.cer;
+    ssl_certificate_key /etc/nginx/ssl/qi.jackyu.cn_amstourship.jackyu.cn/private.key;
+    listen 443 ssl;
+    listen [::]:443 ssl;
+    location / {
+        proxy_pass http://127.0.0.1:5001/;
+        proxy_redirect off;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
+    }
+    location /.well-known/acme-challenge {
+        proxy_set_header Host $host;
+        proxy_set_header X-Real_IP $remote_addr;
+        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
+        proxy_pass http://127.0.0.1:5002;
+    }
+}

+ 24 - 0
resources/development/nginx/sites-available/test

@@ -0,0 +1,24 @@
+server {
+    listen 80;
+    listen [::]:80;
+    server_name test.jackyu.cn;
+    location /.well-known/acme-challenge {
+        proxy_set_header Host $host;
+        proxy_set_header X-Real_IP $remote_addr;
+        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
+        proxy_pass http://127.0.0.1:5002;
+    }
+}
+server {
+    listen 443 ssl http2;
+    listen [::]:443 ssl http2;
+    server_name test.jackyu.cn;
+    ssl_certificate /etc/nginx/ssl/test.jackyu.cn/fullchain.cer;
+    ssl_certificate_key /etc/nginx/ssl/test.jackyu.cn/private.key;
+    location /.well-known/acme-challenge {
+        proxy_set_header Host $host;
+        proxy_set_header X-Real_IP $remote_addr;
+        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
+        proxy_pass http://127.0.0.1:5002;
+    }
+}

+ 0 - 1
resources/development/nginx/sites-enabled/amstourship.jackyu.cn

@@ -1 +0,0 @@
-/etc/nginx/sites-available/amstourship.jackyu.cn

+ 1 - 0
resources/development/nginx/sites-enabled/homework.jackyu.cn

@@ -0,0 +1 @@
+/etc/nginx/sites-available/homework.jackyu.cn

+ 1 - 0
resources/development/nginx/sites-enabled/qi.jackyu.cn

@@ -0,0 +1 @@
+/etc/nginx/sites-available/qi.jackyu.cn

+ 1 - 0
resources/development/nginx/sites-enabled/test

@@ -0,0 +1 @@
+/etc/nginx/sites-available/test

+ 64 - 0
resources/development/nginx/ssl/homework.jackyu.cn/fullchain.cer

@@ -0,0 +1,64 @@
+-----BEGIN CERTIFICATE-----
+MIIFgDCCBGigAwIBAgITAP+fPvVk323vgnW668+CqRlK/TANBgkqhkiG9w0BAQsF
+ADBDMQswCQYDVQQGEwJVUzESMBAGA1UEChMJZ29vZCBndXlzMSAwHgYDVQQDExdD
+QSBpbnRlcm1lZGlhdGUgKFJTQSkgQTAeFw0yMzA0MTAwMTQ0NDdaFw0yMzA3MDkw
+MTQ0NDZaMB0xGzAZBgNVBAMTEmhvbWV3b3JrLmphY2t5dS5jbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBALY1L0I/3MccefOKLhhh8OASsv4lKoBl0FbE
+lxuSN+hCcuW96wniv+ofCBZqHqYiRiYPB7JC3DrwP8iZepBMBf0FAnffrJJSr2Uk
+gotVoUqeNjIEmUir5dbsDrCaLQkMaXo2FUUDn74GcQjf7YG4BAUAkYQn7VJsn8+M
+W7NrMy22/NZHSfS0OHbF6F7qwVlOIW98h7PxXpqqYo1keOfRICfIalU4+0+Tb0VT
+MVr5oUSFuvlnJCrNTUtzgnvPLAmTfQ94RzMhwfxXMW1hD6KGaganoqrWYpJfZiWW
+zrNyNVubTulJZxzAaGZFqihoyfLhvbHKDCXb00H5tXQdecVA6GECAwEAAaOCApEw
+ggKNMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
+AwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUNJ6N89H1XafFYuLtMOX+in4MIPYw
+KwYDVR0jBCQwIoAgYjWGqKXC1CgUyRtbS1bZxpMqaNdKnoY33nyaZdVEQ/IwcQYI
+KwYBBQUHAQEEZTBjMCIGCCsGAQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjQwMDIv
+MD0GCCsGAQUFBzAChjFodHRwOi8vMTI3LjAuMC4xOjQwMDEvYWlhL2lzc3Vlci82
+NjA1NDQwNDk4MzY5NzQxMB0GA1UdEQQWMBSCEmhvbWV3b3JrLmphY2t5dS5jbjAn
+BgNVHR8EIDAeMBygGqAYhhZodHRwOi8vZXhhbXBsZS5jb20vY3JsMEAGA1UdIAQ5
+MDcwCAYGZ4EMAQIBMCsGAyoDBDAkMCIGCCsGAQUFBwIBFhZodHRwOi8vZXhhbXBs
+ZS5jb20vY3BzMIIBAwYKKwYBBAHWeQIEAgSB9ASB8QDvAHUAUtToynGEyMkkXDMQ
+ei8Ll54oMwWHI0IieDEKs12/Td4AAAGHaQ06EQAABAMARjBEAiBCQaL1zYJtbVW4
+Csnc2C3Vc5kbMWwpRVK6rxTJhP0j2AIgVHSwpnVphjLT136M35Kobj1DwlfJ4O9/
+sWKyrAwlMC4AdgA6qT9O/RxRKcQnhtlrR6mubchBDheA1y/bT9teLGXGdAAAAYdp
+DToRAAAEAwBHMEUCIDEnWPSbMr9PgnJ43lbYLyPeRUk8S4jXoWpTHFzVPK6ZAiEA
+2nsrYbRsJFgPVxW6kqKth89EhMtLP9uJD50OQWzQsb4wDQYJKoZIhvcNAQELBQAD
+ggEBAEcjUOtRmA8c1pqjEkiIo4vsmJT4Zwy4BhpmGoqRqCfq6IUP+HSjVokJGCGp
+mNh16k4vaAgpA1Nu0wXsfaMklR0nuGvqyZ1+/o9iqbEpkBhgxI+kliAbwMtCB8y+
+UOcv4GOkOpbqlmvQgoSb5q25hQ3i4nxxhmN2KV9WS6+mYrCs09FjUIx6fTK05DQQ
+u9/q94glVMqteOj0fiyaHuPZbyy/NeF/5KjLVZGfWypFDOHUpZn58FpAw33XQIxL
+Yurjh7dbyk/Rv6qcoT89EYmUwEegjQne2XTIljpvlR1WEvZE/BcHqIyvZ6WTIZAB
+NKhxlKkKY7tAq43RAigiJjNdjFU=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIFZzCCA0+gAwIBAgIQHPTBy0utaJ82mHJs9V3u8zANBgkqhkiG9w0BAQsFADA5
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJZ29vZCBndXlzMRYwFAYDVQQDEw1DQSBy
+b290IChSU0EpMB4XDTIwMDEwMTEyMDAwMFoXDTQwMDEwMTEyMDAwMFowQzELMAkG
+A1UEBhMCVVMxEjAQBgNVBAoTCWdvb2QgZ3V5czEgMB4GA1UEAxMXQ0EgaW50ZXJt
+ZWRpYXRlIChSU0EpIEEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCk
+f1rlGJeno27J8UAltWo8PopRsTP93Il6+L+SScaOUQsM+TCbTO5EJ4xC+d3Unp8v
+iZRLAB1/lGhHh/Uifzov2ux2sa9J4kxlfCxVaaCx6maOs9KnfGUug2hcUCh1oUVv
+zD9X9VkWdBdR+kKJvYqWJlU/EJxEa5ERjFp591LQBpR7ksZrsbLvXeywqVS3ek8s
+d7w+ZqpYOfo6DNLl5aEJlk6F6CiSjmT352n8dnsOEIEL+bOusLhP5F8pED85geU5
+rijc38fZ+gfZAVVenz7kqBh7ld6qT5inIM4uQa7oCuFX2dZ0jqm5TFBBtQp9dkFv
+WFz9kEb/CVJr1IsTdp1PAgMBAAGjggFfMIIBWzAOBgNVHQ8BAf8EBAMCAYYwHQYD
+VR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYBAf8CAQAw
+KQYDVR0OBCIEIGI1hqilwtQoFMkbW0tW2caTKmjXSp6GN958mmXVREPyMCsGA1Ud
+IwQkMCKAINmvCHaWHo5MD5lKL52otAsr/TsCX5Hwfy5euQ6zIAWEMFgGCCsGAQUF
+BwEBBEwwSjAjBggrBgEFBQcwAYYXaHR0cDovL2V4YW1wbGUuY29tL29jc3AwIwYI
+KwYBBQUHMAKGF2h0dHA6Ly9leGFtcGxlLmNvbS9yb290MCcGA1UdHwQgMB4wHKAa
+oBiGFmh0dHA6Ly9leGFtcGxlLmNvbS9jcmwwOwYDVR0gBDQwMjAEBgIqAzAqBgIt
+BjAkMCIGCCsGAQUFBwIBFhZodHRwOi8vZXhhbXBsZS5jb20vY3BzMA0GCSqGSIb3
+DQEBCwUAA4ICAQCTLNQlCzHynESAvtPRV1FPaOQhx01RofwS/0Zg3IH5oXxSC98C
+n2L0xHN1gCaJai9XutrFtMCjeBmese48QoPa8MxrB1UpmZ1AuFOQAfHWJZbYPp0V
+PxgY34W9Onb+JPnKTbL9ofKUV0aX67eJ5KKFD1G2z+y9Lz1oA3yJpGzqOY/JCWYz
+q46ik0bmgcGfol6F/T5hoE8pZk8Wr+nNUpSuOSNp7c/g2/pKDRWK8trTrG3owtaJ
+LbQc+W4e97AtTg6DGvR5gftar/+4g2o0xhKSnep+s/bf5NFXVDCTvCmemrbR8Hr7
+NLDKXWuGMoMKIxhyPX6ttpU2Um3rQ1rCQbJ5yWIREZvbdaeK8HSRE3GYE71Z3n/0
+0Kmtg2BKGkrJzcqUSG4o+9mdSjhJ65J76ri5tVQby7Ai7W2KlNjpdI6GYtejUAlf
+vZz5N0e2X36XLPZ8tz04Ix9KLHXMEuA7w/aOglH1Lei+PPp7kBjvXAL66soqCTqu
+49yNbPPGIjGO453+jNzxhbeimh6a5/Fwd4SjsdSBe8AwIGGZTzLiIzCNM5OmcoUf
+Tl5RrVXau4DvX5KvfwOLusl/uJH+7oETJlbi8+fNn2ioYfHg5/Tu3zKZw/Y+6wSA
+LsOIJrFmJEgIBUnWp/B1ZC6TeIokmw5FeJsY1UnFDWsPVcax2T/tg6BZ5Q==
+-----END CERTIFICATE-----

+ 27 - 0
resources/development/nginx/ssl/homework.jackyu.cn/private.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAtjUvQj/cxxx584ouGGHw4BKy/iUqgGXQVsSXG5I36EJy5b3r
+CeK/6h8IFmoepiJGJg8HskLcOvA/yJl6kEwF/QUCd9+sklKvZSSCi1WhSp42MgSZ
+SKvl1uwOsJotCQxpejYVRQOfvgZxCN/tgbgEBQCRhCftUmyfz4xbs2szLbb81kdJ
+9LQ4dsXoXurBWU4hb3yHs/FemqpijWR459EgJ8hqVTj7T5NvRVMxWvmhRIW6+Wck
+Ks1NS3OCe88sCZN9D3hHMyHB/FcxbWEPooZqBqeiqtZikl9mJZbOs3I1W5tO6Uln
+HMBoZkWqKGjJ8uG9scoMJdvTQfm1dB15xUDoYQIDAQABAoIBAFAflReJ47j/EbWB
+lwGL2BOAxYsyprztiK8PJe+u3bzZs5LJcBjZyFDYsoLAyZd+zOAhjd3avuOAEFxS
++W2IsL1xvYMfLdDuYUiVxH4m+pVIe0aFdS5awOhAx7jrI1CuT5e5PqMpk85JIN2p
+MtTvKX1Voae+swKi16e57f0477ly1s3+xftR+v94PQAvUrxdB0xRQiz5145XpfQ8
+vutA0BrNYPUm5LnvGAgLzJckrCjJ2MMxwIojzT5EPmu+fO091mwzuUE1KC20DdLO
+qBgdW66a0tH2jX5FLH1RU+kFsjBanrTZunNAvYVycCKJmc96iPMrdfk0YWJfRBuk
+w8UEnBECgYEA6BISJACsjxK3P4bLEJfbjG98SUHR2z/k6R8svotwXhPaOuxebH5N
+KttS2l2cq5Zj7iYWmtOXVcN9yYDih0Zs3MRm/1XRCkvp9MKiok6TOEbV4Xfi8s1/
+yMkpIa3muaO+Xlh40iwmkVnitxIQffdqsHSAI4UL5Y3YUqdV7Wqv5U0CgYEAyP7k
+hGfY4X33iq6+Z3t6YmPr04ubvM7xGuqHimR7TmpU0mQDiU/ArPmWjhd1iU2b5ryj
++iWvVRPhiMNhLteugQHBK2Uf0CLx1Ero0543issIvKKSXiEAmXmMcdS35YO/fe9V
+0M/GxbvTom36dBIYjyN4keo+vTRZ5T98tsWstWUCgYEArdWTdxp2J7nKQDC0/Vnz
+IBAGlk1SaBxFWQZ8GsMSSbYvOwIBfN1i6l5dgqqqh7Fga2xmdFVYv+pu17jOdqwf
+MYOA73SV4FObDTeaYV/gUUBmR7zo6B1cwcdFIzBDav0nxT4aSry9qxUciStj5Sem
+6ERsE68+iRYmW0tzRyMqXOUCgYAYN12g9kITKPIiK1uVbDMal59aJX/mB6jU7VzX
+N7QDhpwhnRsv+APm00toYzsuB8O40RGQmem9/l818xRKaIIF2QhFCjIDCbLJOR1E
+IdPfTQcIcy3fWWqREyvwqwhdBrqTmbplJiN0v2SINWfvhB6hYEyuh+J3OU97Z2LH
+QpnEYQKBgQCz08jYIxPAMc1HReNCv2gFvUkaKa0QMdkuqIyyBcMUvE24E1xgp9tI
+7BGkSu+GGV8m/e/9ll37O5iEXU2y9Y+8O/ZEimRG++e9miqVdpt449xWcr62HluV
+CjzA5WBT5NZIVdTIiHe2HKFuKMXdyWkRWN5SClSSZ6aWzO8awf6UbA==
+-----END RSA PRIVATE KEY-----

+ 64 - 0
resources/development/nginx/ssl/ojbk.me/fullchain.cer

@@ -0,0 +1,64 @@
+-----BEGIN CERTIFICATE-----
+MIIFbTCCBFWgAwIBAgITAP/1MpNXKZIVpnbIa9/M+0pUCzANBgkqhkiG9w0BAQsF
+ADBDMQswCQYDVQQGEwJVUzESMBAGA1UEChMJZ29vZCBndXlzMSAwHgYDVQQDExdD
+QSBpbnRlcm1lZGlhdGUgKFJTQSkgQTAeFw0yMzA0MTAwMTU3MDhaFw0yMzA3MDkw
+MTU3MDdaMBIxEDAOBgNVBAMTB29qYmsubWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDH2mgsoGSFeXM3h3W0n0KofOPUxo+6Qx5hPcvtDN+HkTss+Udb
+UYUOxK5wsqFErOwbGS6gKCVwNeLuVDCkC/r2eAf3MSSAUpAMu10wZlPT/UYMCMs8
+mwLz2EN4MBvd3bxZmfmvjzRjYqK7kcvQhxIEjPwzGeQKoHjtbgTRcbJen17cR5i8
+jmHelcE+xt+R88MGyNP3LquudKujh7X+URiBwq4YedUl7GiCUIVxl1pGEW/8QK/5
+OvrcgCKpkNJU8vhWMsuhqvXLhTYQ3JXe2H7QNBPknGI8uNxGdCSasejyQsyXtamg
+w9bQ3D8gH3ooFE4CNFHRtr9Wgmg+ZyQb21/HAgMBAAGjggKJMIIChTAOBgNVHQ8B
+Af8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB
+/wQCMAAwHQYDVR0OBBYEFNfN19b9UyI7RL60PL/AicpNxp0/MCsGA1UdIwQkMCKA
+IGI1hqilwtQoFMkbW0tW2caTKmjXSp6GN958mmXVREPyMHEGCCsGAQUFBwEBBGUw
+YzAiBggrBgEFBQcwAYYWaHR0cDovLzEyNy4wLjAuMTo0MDAyLzA9BggrBgEFBQcw
+AoYxaHR0cDovLzEyNy4wLjAuMTo0MDAxL2FpYS9pc3N1ZXIvNjYwNTQ0MDQ5ODM2
+OTc0MTASBgNVHREECzAJggdvamJrLm1lMCcGA1UdHwQgMB4wHKAaoBiGFmh0dHA6
+Ly9leGFtcGxlLmNvbS9jcmwwQAYDVR0gBDkwNzAIBgZngQwBAgEwKwYDKgMEMCQw
+IgYIKwYBBQUHAgEWFmh0dHA6Ly9leGFtcGxlLmNvbS9jcHMwggEGBgorBgEEAdZ5
+AgQCBIH3BIH0APIAdwA6qT9O/RxRKcQnhtlrR6mubchBDheA1y/bT9teLGXGdAAA
+AYdpGIqzAAAEAwBIMEYCIQD8GVPhm9jPxwla9uVtuYk5ateCOqv9f6T0A5IVGWpb
+iAIhAOgnep1Go8Zvl/3ig5IV+J1E3rc5udUigq2Lbxt1q5u8AHcAUtToynGEyMkk
+XDMQei8Ll54oMwWHI0IieDEKs12/Td4AAAGHaRiKswAABAMASDBGAiEAlOUvnuUF
+BUWIzMgsH3TTbaQN1gga8OTYxDySjQdj/mQCIQDgGQPuqp1cgjQHPik/aVCWYtbq
+Pf79O3zv0Pz7p9ROvzANBgkqhkiG9w0BAQsFAAOCAQEAWodvuzVbZNalTo03JO0s
+bCugOhOWyi9dqfr1Zk2X/WvKFd/qMjNj0pVRU5as6ihS8zzhSL4fllO+RoNGOnJc
+Mw8QgfdHkrWc2XwmSmrKvGNpS68ZVjxv5TsZVvK+O2ZzHMQgKDXdgyF0P02MDkQP
+/FF8FvJc4HaQRaI3CMg2bXXwMQ8efvkaWZGs538acldJpgxloeUTM+5Y6RDcXkqR
+ihDD9R13GlXZgJ5N+z83ipeBorJLIIOMlqxGB//4gS9qxEqmnU4yISEw9efXICak
+Ny/wlpRqqK1jTrp3SuuAe4XCorQ4J9SZS+aa5BRU6rH5w5wKhXLd55vphPkFdtPO
+DA==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIFZzCCA0+gAwIBAgIQHPTBy0utaJ82mHJs9V3u8zANBgkqhkiG9w0BAQsFADA5
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJZ29vZCBndXlzMRYwFAYDVQQDEw1DQSBy
+b290IChSU0EpMB4XDTIwMDEwMTEyMDAwMFoXDTQwMDEwMTEyMDAwMFowQzELMAkG
+A1UEBhMCVVMxEjAQBgNVBAoTCWdvb2QgZ3V5czEgMB4GA1UEAxMXQ0EgaW50ZXJt
+ZWRpYXRlIChSU0EpIEEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCk
+f1rlGJeno27J8UAltWo8PopRsTP93Il6+L+SScaOUQsM+TCbTO5EJ4xC+d3Unp8v
+iZRLAB1/lGhHh/Uifzov2ux2sa9J4kxlfCxVaaCx6maOs9KnfGUug2hcUCh1oUVv
+zD9X9VkWdBdR+kKJvYqWJlU/EJxEa5ERjFp591LQBpR7ksZrsbLvXeywqVS3ek8s
+d7w+ZqpYOfo6DNLl5aEJlk6F6CiSjmT352n8dnsOEIEL+bOusLhP5F8pED85geU5
+rijc38fZ+gfZAVVenz7kqBh7ld6qT5inIM4uQa7oCuFX2dZ0jqm5TFBBtQp9dkFv
+WFz9kEb/CVJr1IsTdp1PAgMBAAGjggFfMIIBWzAOBgNVHQ8BAf8EBAMCAYYwHQYD
+VR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYBAf8CAQAw
+KQYDVR0OBCIEIGI1hqilwtQoFMkbW0tW2caTKmjXSp6GN958mmXVREPyMCsGA1Ud
+IwQkMCKAINmvCHaWHo5MD5lKL52otAsr/TsCX5Hwfy5euQ6zIAWEMFgGCCsGAQUF
+BwEBBEwwSjAjBggrBgEFBQcwAYYXaHR0cDovL2V4YW1wbGUuY29tL29jc3AwIwYI
+KwYBBQUHMAKGF2h0dHA6Ly9leGFtcGxlLmNvbS9yb290MCcGA1UdHwQgMB4wHKAa
+oBiGFmh0dHA6Ly9leGFtcGxlLmNvbS9jcmwwOwYDVR0gBDQwMjAEBgIqAzAqBgIt
+BjAkMCIGCCsGAQUFBwIBFhZodHRwOi8vZXhhbXBsZS5jb20vY3BzMA0GCSqGSIb3
+DQEBCwUAA4ICAQCTLNQlCzHynESAvtPRV1FPaOQhx01RofwS/0Zg3IH5oXxSC98C
+n2L0xHN1gCaJai9XutrFtMCjeBmese48QoPa8MxrB1UpmZ1AuFOQAfHWJZbYPp0V
+PxgY34W9Onb+JPnKTbL9ofKUV0aX67eJ5KKFD1G2z+y9Lz1oA3yJpGzqOY/JCWYz
+q46ik0bmgcGfol6F/T5hoE8pZk8Wr+nNUpSuOSNp7c/g2/pKDRWK8trTrG3owtaJ
+LbQc+W4e97AtTg6DGvR5gftar/+4g2o0xhKSnep+s/bf5NFXVDCTvCmemrbR8Hr7
+NLDKXWuGMoMKIxhyPX6ttpU2Um3rQ1rCQbJ5yWIREZvbdaeK8HSRE3GYE71Z3n/0
+0Kmtg2BKGkrJzcqUSG4o+9mdSjhJ65J76ri5tVQby7Ai7W2KlNjpdI6GYtejUAlf
+vZz5N0e2X36XLPZ8tz04Ix9KLHXMEuA7w/aOglH1Lei+PPp7kBjvXAL66soqCTqu
+49yNbPPGIjGO453+jNzxhbeimh6a5/Fwd4SjsdSBe8AwIGGZTzLiIzCNM5OmcoUf
+Tl5RrVXau4DvX5KvfwOLusl/uJH+7oETJlbi8+fNn2ioYfHg5/Tu3zKZw/Y+6wSA
+LsOIJrFmJEgIBUnWp/B1ZC6TeIokmw5FeJsY1UnFDWsPVcax2T/tg6BZ5Q==
+-----END CERTIFICATE-----

+ 27 - 0
resources/development/nginx/ssl/ojbk.me/private.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAx9poLKBkhXlzN4d1tJ9CqHzj1MaPukMeYT3L7Qzfh5E7LPlH
+W1GFDsSucLKhRKzsGxkuoCglcDXi7lQwpAv69ngH9zEkgFKQDLtdMGZT0/1GDAjL
+PJsC89hDeDAb3d28WZn5r480Y2Kiu5HL0IcSBIz8MxnkCqB47W4E0XGyXp9e3EeY
+vI5h3pXBPsbfkfPDBsjT9y6rrnSro4e1/lEYgcKuGHnVJexoglCFcZdaRhFv/ECv
++Tr63IAiqZDSVPL4VjLLoar1y4U2ENyV3th+0DQT5JxiPLjcRnQkmrHo8kLMl7Wp
+oMPW0Nw/IB96KBROAjRR0ba/VoJoPmckG9tfxwIDAQABAoIBAQCVNSGrl8AUyrzT
+i2W8iV657iwm8mviEzQ+Q2XZwE+upiY5CI9WxUEC6qKV7zdpz3SjMqTV28M/yGt5
+pg9+mpcupiTET8NBruJvLv9/IBab4a8HUxVxVQXaSe7tb3WOqnpxpvx8Lv1c6go2
+4b36HK2+CghMmprfuDkwgoBEYo9aBm5C9kH2EThZjvgqYb+3C2OPWKu4so6kn+pr
+BVgoslTlYEhmbdv3CVmEKpjfYJ2PFW0XQvHuNX1S6OSKgm7oPK8efgixdJ9DArH2
+B5ST8UasjCyGzdjXBiBMZl9hMwTQHM5dhEA0I8Ay1UOIpkJsBARrWYXXpacfMKYx
+TbN9yFqhAoGBAOuro28hNN7zazeI2rUIPQ03ALQUYS/fCHPF+Zj9pnX0G4JfSiAm
+lJjFZLosgByUTT1BfsRCvi8U1XXigR+cR1b7e/wQU0nY7dX5kTvdYtgy1EVIatjP
+ZE0gAkfPGfpBcvkuRpEn1d76NY+Tc0Skyczw1PenIsgAMX3lBEuIero3AoGBANkX
+zqBc2Ky5WZYOdceTDBQoYWMjFnFtyhN8uKDPCFVBmUPe8zjjVYcDxJhbUxSdHufZ
+iZ9m++VbghkMRsom/aQhtGSDA/G+0KFLZHkKI+2Kp5nlql+U5pBMaRAz3y7DDYUY
+tdmw0vKr3wyGG4a1OpX/3GyCUo0AWraNSe/rLX7xAoGAEKvHl+jlcJAPmZIYxo2a
+pACsEBEQ/u3sDySGD4iB6f4mpAZRnAyenl/4TCMxvNPQ0vB7Iy8FfRcgMoKfV7ka
+YtDPaHlPKv4pdOV+nJmAkIKn+W6yADxLgBkvkBzaXZWbqHzZiRMkUe2pNErd8JEn
+pVOz/QDZuQQqfBljQGSbKekCgYA+ktgh7OEfWAV0dRKJxd6zaLg5ZQGxDB4047wr
+zcDvIgtVPswIV65tTi66Y4hc5rTjyxYZ9gshHvEu2xUEa5ysVHK0jfbzFTb5Zsu8
+/6k/bLnGaCZlinuyl/OokesAhYQ+GtM/vfHvtI6EA5unhlEuryMPu7ijn7iF6c+n
+8beZYQKBgQDgXUhEV6jKvq8tDxsqSz+GuKt6tr18pHdFUrr3rbLOsRrvsEawnqkk
+R2MsC50rfIcpji+KMEG04olYiE9bHtWnwrm7ADP7rfqwB6M0FHbxbzidVqSlLTdH
+VvlDbBXGVwS7pFSXi7GVnAod+7EAt/zAvda3zVojBz7W3SOgaWobgQ==
+-----END RSA PRIVATE KEY-----

+ 64 - 0
resources/development/nginx/ssl/qi.jackyu.cn/fullchain.cer

@@ -0,0 +1,64 @@
+-----BEGIN CERTIFICATE-----
+MIIFdjCCBF6gAwIBAgITAP/njBCTrCjMpiq9Xh8Xh4hU0DANBgkqhkiG9w0BAQsF
+ADBDMQswCQYDVQQGEwJVUzESMBAGA1UEChMJZ29vZCBndXlzMSAwHgYDVQQDExdD
+QSBpbnRlcm1lZGlhdGUgKFJTQSkgQTAeFw0yMzA0MTAwMTQ5MzVaFw0yMzA3MDkw
+MTQ5MzRaMBcxFTATBgNVBAMTDHFpLmphY2t5dS5jbjCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBANBt8w+53ef/mHfz8JRHIz/C2/5pEZP0VM4rW8NfbO26
+KnugGnfGtsRzCxKNHQ1SWamMzqgyEjLzcM0L9U7/yjWW3sSBCglVfg5BFrYiX5gY
+S2a7pUPh3/zpfEUHRV6PfpPgDWVFzPzAGF3rwJIeQoxwQho9ljfffYsf7llBBCKU
+DOHHiBgGh2cmf7eg6Wu+mzWI+dnOzS2mW0QX9+X7Nz5q5ph1bRikYHP2yJ6kix8t
+DSeNpwlKFYynv/FfHbCg+mTfQ8gWPCXU/Wr3TnK5VQtqr3FzCq2IdzfEYYjaq1Mn
+7zdQ7gE07v/Ovq53/hXdjdiaDflF+2uDQ12cPdt7t40CAwEAAaOCAo0wggKJMA4G
+A1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYD
+VR0TAQH/BAIwADAdBgNVHQ4EFgQU2C4AQmUi47BO+ZnPqn+5WYH0BaswKwYDVR0j
+BCQwIoAgYjWGqKXC1CgUyRtbS1bZxpMqaNdKnoY33nyaZdVEQ/IwcQYIKwYBBQUH
+AQEEZTBjMCIGCCsGAQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjQwMDIvMD0GCCsG
+AQUFBzAChjFodHRwOi8vMTI3LjAuMC4xOjQwMDEvYWlhL2lzc3Vlci82NjA1NDQw
+NDk4MzY5NzQxMBcGA1UdEQQQMA6CDHFpLmphY2t5dS5jbjAnBgNVHR8EIDAeMByg
+GqAYhhZodHRwOi8vZXhhbXBsZS5jb20vY3JsMEAGA1UdIAQ5MDcwCAYGZ4EMAQIB
+MCsGAyoDBDAkMCIGCCsGAQUFBwIBFhZodHRwOi8vZXhhbXBsZS5jb20vY3BzMIIB
+BQYKKwYBBAHWeQIEAgSB9gSB8wDxAHcAHRrTQca8iy14Qbrw6/itgVzVWTcaENF3
+tWnJP743pq8AAAGHaRGgTAAABAMASDBGAiEA6F91bdTgx9slRzhi3ep1LSgVSUzA
+iotTuU5cQJDIdyACIQCsrhyGncGIE8ljh5yQ3NI7cFnlD27zz166EV8MwWfu8wB2
+AHvdIE8nOCpGaR79qYHkjkttuDHev9tVJliMURfZl73iAAABh2kRokMAAAQDAEcw
+RQIgLfLzsUf8xwA8WH7F/lO/loAz7vUeglFn2nqhf3nzyN4CIQDo4llhw/V1eqYq
+pJ0IjezwIzreOdPBXza3J0PXSRTlNzANBgkqhkiG9w0BAQsFAAOCAQEAcMUXX5/w
+n7n12daDqe9UQczlngpkC10o7j4rVqkOZ9m+fmcz/PKt3mMfQZ92z4zRh60AUgpw
+SL0Gfvkz1nRJ2exMipuTkT8ftpGJD77+Wqb8pKNek/7T9LbDhv8QPWXcB9T8qTIR
+jw4gP4jF1HmAa2I05M5ofx+EF6WEYUahJduYs5CoQ8gpk4frchAvo8V6wNnALQHV
+xMW3lppLItGIrfu3o+m32LELI+Hz8nyvuguT9JRXKhtCYqadtWlVqPLisj8l1CjK
+NcZz0DtALqtQqBWfE0MeWkb94TDLu8BahQM4AtPHqzZ3DFkJGB2VGMAWtl0tt0DB
+Pf6fDkASgWZKNQ==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIFZzCCA0+gAwIBAgIQHPTBy0utaJ82mHJs9V3u8zANBgkqhkiG9w0BAQsFADA5
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJZ29vZCBndXlzMRYwFAYDVQQDEw1DQSBy
+b290IChSU0EpMB4XDTIwMDEwMTEyMDAwMFoXDTQwMDEwMTEyMDAwMFowQzELMAkG
+A1UEBhMCVVMxEjAQBgNVBAoTCWdvb2QgZ3V5czEgMB4GA1UEAxMXQ0EgaW50ZXJt
+ZWRpYXRlIChSU0EpIEEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCk
+f1rlGJeno27J8UAltWo8PopRsTP93Il6+L+SScaOUQsM+TCbTO5EJ4xC+d3Unp8v
+iZRLAB1/lGhHh/Uifzov2ux2sa9J4kxlfCxVaaCx6maOs9KnfGUug2hcUCh1oUVv
+zD9X9VkWdBdR+kKJvYqWJlU/EJxEa5ERjFp591LQBpR7ksZrsbLvXeywqVS3ek8s
+d7w+ZqpYOfo6DNLl5aEJlk6F6CiSjmT352n8dnsOEIEL+bOusLhP5F8pED85geU5
+rijc38fZ+gfZAVVenz7kqBh7ld6qT5inIM4uQa7oCuFX2dZ0jqm5TFBBtQp9dkFv
+WFz9kEb/CVJr1IsTdp1PAgMBAAGjggFfMIIBWzAOBgNVHQ8BAf8EBAMCAYYwHQYD
+VR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYBAf8CAQAw
+KQYDVR0OBCIEIGI1hqilwtQoFMkbW0tW2caTKmjXSp6GN958mmXVREPyMCsGA1Ud
+IwQkMCKAINmvCHaWHo5MD5lKL52otAsr/TsCX5Hwfy5euQ6zIAWEMFgGCCsGAQUF
+BwEBBEwwSjAjBggrBgEFBQcwAYYXaHR0cDovL2V4YW1wbGUuY29tL29jc3AwIwYI
+KwYBBQUHMAKGF2h0dHA6Ly9leGFtcGxlLmNvbS9yb290MCcGA1UdHwQgMB4wHKAa
+oBiGFmh0dHA6Ly9leGFtcGxlLmNvbS9jcmwwOwYDVR0gBDQwMjAEBgIqAzAqBgIt
+BjAkMCIGCCsGAQUFBwIBFhZodHRwOi8vZXhhbXBsZS5jb20vY3BzMA0GCSqGSIb3
+DQEBCwUAA4ICAQCTLNQlCzHynESAvtPRV1FPaOQhx01RofwS/0Zg3IH5oXxSC98C
+n2L0xHN1gCaJai9XutrFtMCjeBmese48QoPa8MxrB1UpmZ1AuFOQAfHWJZbYPp0V
+PxgY34W9Onb+JPnKTbL9ofKUV0aX67eJ5KKFD1G2z+y9Lz1oA3yJpGzqOY/JCWYz
+q46ik0bmgcGfol6F/T5hoE8pZk8Wr+nNUpSuOSNp7c/g2/pKDRWK8trTrG3owtaJ
+LbQc+W4e97AtTg6DGvR5gftar/+4g2o0xhKSnep+s/bf5NFXVDCTvCmemrbR8Hr7
+NLDKXWuGMoMKIxhyPX6ttpU2Um3rQ1rCQbJ5yWIREZvbdaeK8HSRE3GYE71Z3n/0
+0Kmtg2BKGkrJzcqUSG4o+9mdSjhJ65J76ri5tVQby7Ai7W2KlNjpdI6GYtejUAlf
+vZz5N0e2X36XLPZ8tz04Ix9KLHXMEuA7w/aOglH1Lei+PPp7kBjvXAL66soqCTqu
+49yNbPPGIjGO453+jNzxhbeimh6a5/Fwd4SjsdSBe8AwIGGZTzLiIzCNM5OmcoUf
+Tl5RrVXau4DvX5KvfwOLusl/uJH+7oETJlbi8+fNn2ioYfHg5/Tu3zKZw/Y+6wSA
+LsOIJrFmJEgIBUnWp/B1ZC6TeIokmw5FeJsY1UnFDWsPVcax2T/tg6BZ5Q==
+-----END CERTIFICATE-----

+ 27 - 0
resources/development/nginx/ssl/qi.jackyu.cn/private.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEA0G3zD7nd5/+Yd/PwlEcjP8Lb/mkRk/RUzitbw19s7boqe6Aa
+d8a2xHMLEo0dDVJZqYzOqDISMvNwzQv1Tv/KNZbexIEKCVV+DkEWtiJfmBhLZrul
+Q+Hf/Ol8RQdFXo9+k+ANZUXM/MAYXevAkh5CjHBCGj2WN999ix/uWUEEIpQM4ceI
+GAaHZyZ/t6Dpa76bNYj52c7NLaZbRBf35fs3PmrmmHVtGKRgc/bInqSLHy0NJ42n
+CUoVjKe/8V8dsKD6ZN9DyBY8JdT9avdOcrlVC2qvcXMKrYh3N8RhiNqrUyfvN1Du
+ATTu/86+rnf+Fd2N2JoN+UX7a4NDXZw923u3jQIDAQABAoIBAEd+b3FlgAikU9hR
+hKRYAm9Ml8mcoLrvhGdz1/YcNXEV+pyNPob3UpnwHEwwu1ZmePr/oaNwCW4QsxCi
+mXKPqvzW03L0EE1DVgntqayv/bpeGv8SPo4aXIqUTFwhMlpNPk3a/L1QRBAulC0j
+QNreJlWl7Aa0OWLQ9m9SdJ+I/bIeF54AXnkJDu6HoGHyMm6bgBirvM8KEpMaGULH
+9XU5Jn//7NYVZ5PrCP89Xm+tWvzbGp5QOUUTZYe4fqtetDFu4BZsEU9zA/3gqHG5
+WQWk+SDZdTlyzVbigAmiqsWI20duPTsJ6Be7xIU/mORI4If/h4VYVjzriyXJlUFl
+KYxLEMECgYEA1fkYQfk6z85JhLUUG/KkfM+kJ7G4/cshci53LDf4GCNzUVEf1o4P
+hzrJspDftbu+k1bdyybJsRYt0+Gi3cbSoIQZkL7R3OSUDigUkORpD3d4xBL9ZkI3
+C02o15BSsBU54IXi8JRwj5zLcqcaS6UtKDgYORyLj5jSZ347kB8iljcCgYEA+V4d
+6dEXD1WN6lH2brdwrnnNQP9f8yElHICRwsihU0tcYRlkjjximD2opgfN0on9bDmD
+rbnoT78y+Jb2YOQfamYCSTmvSb6PB3e0hRVZ8VUN6PeajYh5EE8E5Smvgszaghs1
+1a9pIT4pCO6/fK3o4u3yTZrucLo4qLrRVv0pPlsCgYA5E8tevebsS/Dcj5kfo2gx
+SwpU9FmOicMQPEjZ6MwrVDmMtYEysI5/2jS3h2HFjqFVmFRtvpkKvgnXfVb+pezF
+mLdhHyXIMMk1xYdG50cHMy1p0E78GimowDyL1Bnakq7vr4dL+azVAlRa7yxahWM4
+WU5M3cp0saVeqhOlbEjDnQKBgHYpAKegafrcIUjc2ZaQ2ZXzJS0dVQvRstIUofzY
+MIlVdkqUS6+SMW3OGbHClOakeC7l+d1B8DCJes+MSOaUccZq275y1PpujzuMnz9I
+ZLwT/2lamiNifWsa5kjoPcAO7aMk3ZeJbJlR6QPQjW+4wFd3RI89UKqdsudQzo0X
+nIltAoGBAKydemZxoMxhjazemBVTB8b90sb3vHZf/oZMQy87kbUGlD4KvrWr6SR1
+XVPzjGGdTNAKPSL7u4mz8CtK9XJh9qU7zSSNhIJ0EnAk9Rj58iUS+bePNn8xj3Ld
+YgRKVYtR0HgpY97uAXK/TWQG87DEB8E7vGXtihVOnpwQMIyIZoco
+-----END RSA PRIVATE KEY-----

+ 64 - 0
resources/development/nginx/ssl/qi.jackyu.cn_amstourship.jackyu.cn/fullchain.cer

@@ -0,0 +1,64 @@
+-----BEGIN CERTIFICATE-----
+MIIFizCCBHOgAwIBAgITAP9Cy1z0kRtn5/A05Sgxi91RqjANBgkqhkiG9w0BAQsF
+ADBDMQswCQYDVQQGEwJVUzESMBAGA1UEChMJZ29vZCBndXlzMSAwHgYDVQQDExdD
+QSBpbnRlcm1lZGlhdGUgKFJTQSkgQTAeFw0yMzA0MTAwMTU1MzRaFw0yMzA3MDkw
+MTU1MzNaMBcxFTATBgNVBAMTDHFpLmphY2t5dS5jbjCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAMRaGc7UU9LVxq26aV3dChWKsKPI/Jl6oSgc8OFd8JKh
+o8L6cF+PibeVEThOOEJVwZ/KkBNvi23LtZt/YpxvqvGQedxIwrRMO2b1sdEB+rvX
+wkHRCAFPjhUPssji/6K/b0cCVAR8eEV4NF63OCmGQbqyITxHBRxCbdzn+/t0bJAd
+qQiRF5N8NVegCKwyBahrDiJZ/+t5NMp5xOpIA7aYaSCxPFqV2TJtuM1xibR+ihhD
+7isvLnXS37OmGvJ47ej+Vt1aSA/qS/EOK7z1Qyw8MS3f1vHp/el6MxleX//zLoxq
+JJiK0L2PN2tbgVk2L+zgFJwON+IszbfmLxYVv44jzDUCAwEAAaOCAqIwggKeMA4G
+A1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYD
+VR0TAQH/BAIwADAdBgNVHQ4EFgQUY3dWka0CyhAEHj+wY8UWVJQ47qwwKwYDVR0j
+BCQwIoAgYjWGqKXC1CgUyRtbS1bZxpMqaNdKnoY33nyaZdVEQ/IwcQYIKwYBBQUH
+AQEEZTBjMCIGCCsGAQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjQwMDIvMD0GCCsG
+AQUFBzAChjFodHRwOi8vMTI3LjAuMC4xOjQwMDEvYWlhL2lzc3Vlci82NjA1NDQw
+NDk4MzY5NzQxMC4GA1UdEQQnMCWCFWFtc3RvdXJzaGlwLmphY2t5dS5jboIMcWku
+amFja3l1LmNuMCcGA1UdHwQgMB4wHKAaoBiGFmh0dHA6Ly9leGFtcGxlLmNvbS9j
+cmwwQAYDVR0gBDkwNzAIBgZngQwBAgEwKwYDKgMEMCQwIgYIKwYBBQUHAgEWFmh0
+dHA6Ly9leGFtcGxlLmNvbS9jcHMwggEDBgorBgEEAdZ5AgQCBIH0BIHxAO8AdQAd
+GtNBxryLLXhBuvDr+K2BXNVZNxoQ0Xe1ack/vjemrwAAAYdpFxjPAAAEAwBGMEQC
+IClnqIozudKr21hQr5KnaXwSh+YZz/NVJVp+Rzz0urXGAiAamh8HeKIR73f4UzyR
+foE8M13U7ukO+WAYZzgVyO+5DgB2AHvdIE8nOCpGaR79qYHkjkttuDHev9tVJliM
+URfZl73iAAABh2kXGM8AAAQDAEcwRQIhAO0Vpl5twRA3b+do3hRHIR9cGjFG9py3
+mbleaKRyRfmsAiA2cGX38jZuxhKTb2i4BOWyJ9UlQiwhabMBLK57wKW3dzANBgkq
+hkiG9w0BAQsFAAOCAQEAGHXtZKcr0RNxaP3icV48Pc6LMTdtPIILbbbfzEGvqCQa
+JmI0hdX6E4QeLsSJyrX8JvVebAILYsqEZgnkx/EQg43PDlz6giD69PV/QBmS6FW9
+z7P62xGjrI696obeH2/jKUdgjSUhxPmluDZnTyizg8dCAOpKcReu2LIFNcE0+qiE
+9kfRi8FRjvauF/y8xhvJ+OxkvMDIEXKlobjffP8Q61Cf7fEGe2PiAoiTndRUqR72
+pTwHDmilZKLEKFIFbxmTZxLa9pMOeRDpwl5wqrXW43FoihoJpt15H72R14f2apaM
+bJDegluaH9Jq3ACB7JIivyn3J9XddLHlTGG+nqDA9Q==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIFZzCCA0+gAwIBAgIQHPTBy0utaJ82mHJs9V3u8zANBgkqhkiG9w0BAQsFADA5
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJZ29vZCBndXlzMRYwFAYDVQQDEw1DQSBy
+b290IChSU0EpMB4XDTIwMDEwMTEyMDAwMFoXDTQwMDEwMTEyMDAwMFowQzELMAkG
+A1UEBhMCVVMxEjAQBgNVBAoTCWdvb2QgZ3V5czEgMB4GA1UEAxMXQ0EgaW50ZXJt
+ZWRpYXRlIChSU0EpIEEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCk
+f1rlGJeno27J8UAltWo8PopRsTP93Il6+L+SScaOUQsM+TCbTO5EJ4xC+d3Unp8v
+iZRLAB1/lGhHh/Uifzov2ux2sa9J4kxlfCxVaaCx6maOs9KnfGUug2hcUCh1oUVv
+zD9X9VkWdBdR+kKJvYqWJlU/EJxEa5ERjFp591LQBpR7ksZrsbLvXeywqVS3ek8s
+d7w+ZqpYOfo6DNLl5aEJlk6F6CiSjmT352n8dnsOEIEL+bOusLhP5F8pED85geU5
+rijc38fZ+gfZAVVenz7kqBh7ld6qT5inIM4uQa7oCuFX2dZ0jqm5TFBBtQp9dkFv
+WFz9kEb/CVJr1IsTdp1PAgMBAAGjggFfMIIBWzAOBgNVHQ8BAf8EBAMCAYYwHQYD
+VR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYBAf8CAQAw
+KQYDVR0OBCIEIGI1hqilwtQoFMkbW0tW2caTKmjXSp6GN958mmXVREPyMCsGA1Ud
+IwQkMCKAINmvCHaWHo5MD5lKL52otAsr/TsCX5Hwfy5euQ6zIAWEMFgGCCsGAQUF
+BwEBBEwwSjAjBggrBgEFBQcwAYYXaHR0cDovL2V4YW1wbGUuY29tL29jc3AwIwYI
+KwYBBQUHMAKGF2h0dHA6Ly9leGFtcGxlLmNvbS9yb290MCcGA1UdHwQgMB4wHKAa
+oBiGFmh0dHA6Ly9leGFtcGxlLmNvbS9jcmwwOwYDVR0gBDQwMjAEBgIqAzAqBgIt
+BjAkMCIGCCsGAQUFBwIBFhZodHRwOi8vZXhhbXBsZS5jb20vY3BzMA0GCSqGSIb3
+DQEBCwUAA4ICAQCTLNQlCzHynESAvtPRV1FPaOQhx01RofwS/0Zg3IH5oXxSC98C
+n2L0xHN1gCaJai9XutrFtMCjeBmese48QoPa8MxrB1UpmZ1AuFOQAfHWJZbYPp0V
+PxgY34W9Onb+JPnKTbL9ofKUV0aX67eJ5KKFD1G2z+y9Lz1oA3yJpGzqOY/JCWYz
+q46ik0bmgcGfol6F/T5hoE8pZk8Wr+nNUpSuOSNp7c/g2/pKDRWK8trTrG3owtaJ
+LbQc+W4e97AtTg6DGvR5gftar/+4g2o0xhKSnep+s/bf5NFXVDCTvCmemrbR8Hr7
+NLDKXWuGMoMKIxhyPX6ttpU2Um3rQ1rCQbJ5yWIREZvbdaeK8HSRE3GYE71Z3n/0
+0Kmtg2BKGkrJzcqUSG4o+9mdSjhJ65J76ri5tVQby7Ai7W2KlNjpdI6GYtejUAlf
+vZz5N0e2X36XLPZ8tz04Ix9KLHXMEuA7w/aOglH1Lei+PPp7kBjvXAL66soqCTqu
+49yNbPPGIjGO453+jNzxhbeimh6a5/Fwd4SjsdSBe8AwIGGZTzLiIzCNM5OmcoUf
+Tl5RrVXau4DvX5KvfwOLusl/uJH+7oETJlbi8+fNn2ioYfHg5/Tu3zKZw/Y+6wSA
+LsOIJrFmJEgIBUnWp/B1ZC6TeIokmw5FeJsY1UnFDWsPVcax2T/tg6BZ5Q==
+-----END CERTIFICATE-----

+ 27 - 0
resources/development/nginx/ssl/qi.jackyu.cn_amstourship.jackyu.cn/private.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAxFoZztRT0tXGrbppXd0KFYqwo8j8mXqhKBzw4V3wkqGjwvpw
+X4+Jt5UROE44QlXBn8qQE2+Lbcu1m39inG+q8ZB53EjCtEw7ZvWx0QH6u9fCQdEI
+AU+OFQ+yyOL/or9vRwJUBHx4RXg0Xrc4KYZBurIhPEcFHEJt3Of7+3RskB2pCJEX
+k3w1V6AIrDIFqGsOIln/63k0ynnE6kgDtphpILE8WpXZMm24zXGJtH6KGEPuKy8u
+ddLfs6Ya8njt6P5W3VpID+pL8Q4rvPVDLDwxLd/W8en96XozGV5f//MujGokmIrQ
+vY83a1uBWTYv7OAUnA434izNt+YvFhW/jiPMNQIDAQABAoIBABKyAYMP9Gs+r4wb
+E608PpmOewMdP+/dHTsUhlru9tj/SvhloA15PUOdjeYujGzEfYsZXl57YGsz2jbU
+Ci+a8kvN1cyDoQZJu94xxpx/87+u63AY1wpI6N5YgE1gT7bPQ2kfb6B9uXXj3Bio
+mVBa2CdOjpuOp43pRUyjSfrHOw79mPOlCyOmYF3xrJr0EeZxxh06KKqRZUUTQjA4
+V75gRkjwMwWFJWBe8OL+YPcSxunN37MrtFsxgGn6tDgTLJC3S5Q4AjbvUyVA4M1F
+5FiloWWTwO7MBKZmd0S77e/LTG8ysejXHyLy/n5arM7H6YjkANx9vBb3Tgs+3PdB
+8d+qHIECgYEAxehYduV7TN6RTSP3IJMi0aCCDAId/1xK/qh9iFX/VznZX7gIluM7
+1QWU1Zblbk1OeXaJTCwKf2hTIfkLhs8FnhHKcoReWBKEJzl76xwrlwwUKI+JXf1O
+vdQk3OwRVS1iKayWaBQnC2/fT+CzUBuQKH3tMGVvhMuTXJ2iqmL7fQcCgYEA/fzb
+d6AoIL81rzLeeFgV1X3k1tXoV/RlnWq2doG+81QynLqA/yERrJAY7k/89yyRSqcN
+SbfRvwCxkc3NDFt0R2uUKkPvUDw9oCidYU/711/xfGR4xT0bzMUX7O9mmUTPe8Lj
+A9FcTBdVqdy/lEwpc1Fi+YKCAJ0GV3h+hgFP2eMCgYEAl4SGTijtWHHB7rxNVKwx
+aSqoxgbM7pe7dvKKgVnNzvskOEtOkC7SvQmz5D7N0r/vB8E/5oiFVPwLQaRJNeHD
+nDxksX40ONucP+ebvunnWZJO0Krr8YCgy2bi/hziPEMtt1hCItbi+beh0abnwboI
+iWe3s2jFk3bEkJDDXA3CGvsCgYAbLsK2TNe+mXg/ZexVaOf9T1n8fCw/rZJqhI8+
+o6gyFqLMD1Ha/EkN9OYWK01hjs2F9dcAOsIh9QsMFcCKQAdz1VmoJFkqdygJSg99
+6LeFV2la7M3YHjApfDaRTxXl9W1XS4ZMVE3SfvTWFyAR2QzeoKk9FvCe7C9PkT/J
+S76mDQKBgQCTdNUdbwGsalySqB6EHlaNQnmlhW1yGTKIobQ/fbEYS/aCm1yhKkVD
+V9H10LXOeEQGZaLKdS4I8i46ldDpcvHsdBYpvaZ3w+sWzHanyiEcq6goXwloQ8a2
+j8Fqvj+G4S06gvNQ4Xkv8eHSZM1FGsqezTBFgNr+C7Kb0xNdQ9ISag==
+-----END RSA PRIVATE KEY-----

+ 64 - 0
resources/development/nginx/ssl/test.jackyu.cn/fullchain.cer

@@ -0,0 +1,64 @@
+-----BEGIN CERTIFICATE-----
+MIIFeTCCBGGgAwIBAgITAP8yxO86Bnt3WApmIOscI9aZGzANBgkqhkiG9w0BAQsF
+ADBDMQswCQYDVQQGEwJVUzESMBAGA1UEChMJZ29vZCBndXlzMSAwHgYDVQQDExdD
+QSBpbnRlcm1lZGlhdGUgKFJTQSkgQTAeFw0yMzA0MTAwMTU5MjBaFw0yMzA3MDkw
+MTU5MTlaMBkxFzAVBgNVBAMTDnRlc3QuamFja3l1LmNuMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA0DgmFoPB+e+V573Fn04jdk+MGj4K5OA7pNM/72ZM
++u12IzdRl9tkCtq+LEr5rPqd6i+jeQPMR7jYz5rgeeaE6uxgxqjJvL7UcrCaFZs8
+ONFPYp/R/VLsV0fNU6HVFxGlTh6cYpL91JC/SA66xWv14MEvesUPs1Ia8XtroFyc
+OaLwc73DVi6jGzaoJOsx5AjCv1a8FP6/71uenBwkjDt5l5glwkYiRWl6p+XrWvSe
+MBd2/ufneFRoDUnOcnqtAGPagRdJuUZnVzxhXJsSUC+RrK6ZjyWrbUCr0mrYx6qb
+ta5BkyqZnyXTx/iSqTo/87/OX7I/TAhlrfl6B6P5NbkarQIDAQABo4ICjjCCAoow
+DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM
+BgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTHv0Rn8yDyoE5Z7djfQJcft3aJ0DArBgNV
+HSMEJDAigCBiNYaopcLUKBTJG1tLVtnGkypo10qehjfefJpl1URD8jBxBggrBgEF
+BQcBAQRlMGMwIgYIKwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6NDAwMi8wPQYI
+KwYBBQUHMAKGMWh0dHA6Ly8xMjcuMC4wLjE6NDAwMS9haWEvaXNzdWVyLzY2MDU0
+NDA0OTgzNjk3NDEwGQYDVR0RBBIwEIIOdGVzdC5qYWNreXUuY24wJwYDVR0fBCAw
+HjAcoBqgGIYWaHR0cDovL2V4YW1wbGUuY29tL2NybDBABgNVHSAEOTA3MAgGBmeB
+DAECATArBgMqAwQwJDAiBggrBgEFBQcCARYWaHR0cDovL2V4YW1wbGUuY29tL2Nw
+czCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB2AHvdIE8nOCpGaR79qYHkjkttuDHe
+v9tVJliMURfZl73iAAABh2kajMwAAAQDAEcwRQIhAP2N2X1BWt78YEzZaAxJTODa
+pRE/x6RLEt49sNRYuGVvAiBIGFoEpvFGcxBnjA0aMXo0nTP5fxwMlCNT5hSKEQ/Z
+qAB2AB0a00HGvIsteEG68Ov4rYFc1Vk3GhDRd7VpyT++N6avAAABh2kajMsAAAQD
+AEcwRQIgOKLaqF47SLuWMnUnKvD3L8FvVTfwqtAkY/VOCBH4dCsCIQDjjhfO2EQA
+gR1J3mbMpoYko+9fFkH3etYq15+ZGUPUmTANBgkqhkiG9w0BAQsFAAOCAQEATVu8
+bLs32RpgBfLM2197IFSKEdx7UU62WhL2u7SH7NYdFxzGP15pME3UbjPwFFyylu4G
+2zopfUrz7bmnNsQ46eQh8cPVi7KkEnGIywRPLNIWMsLxG5qDA+87NtiOrqHdpIFH
+YynlPO4KQ03MaT2EUDSMDpW33J+1e+9Brsg17LwM/qUHdUH51vxkPL+QnWo576AG
+hKlK9lR8gg6xosEoL9vdzaXWGiWlYvfDAnHWaS/HRS2U1ImYhrAPAWLyqtbHhr6f
+anpGFeu0Qr8X5YxXH349/W1oWU83GkSPeHM0JBjXw+Mo7zM5chaAqksC7efQN6Lm
+JSTu/JAJ4yqhEJcaTw==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIFZzCCA0+gAwIBAgIQHPTBy0utaJ82mHJs9V3u8zANBgkqhkiG9w0BAQsFADA5
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJZ29vZCBndXlzMRYwFAYDVQQDEw1DQSBy
+b290IChSU0EpMB4XDTIwMDEwMTEyMDAwMFoXDTQwMDEwMTEyMDAwMFowQzELMAkG
+A1UEBhMCVVMxEjAQBgNVBAoTCWdvb2QgZ3V5czEgMB4GA1UEAxMXQ0EgaW50ZXJt
+ZWRpYXRlIChSU0EpIEEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCk
+f1rlGJeno27J8UAltWo8PopRsTP93Il6+L+SScaOUQsM+TCbTO5EJ4xC+d3Unp8v
+iZRLAB1/lGhHh/Uifzov2ux2sa9J4kxlfCxVaaCx6maOs9KnfGUug2hcUCh1oUVv
+zD9X9VkWdBdR+kKJvYqWJlU/EJxEa5ERjFp591LQBpR7ksZrsbLvXeywqVS3ek8s
+d7w+ZqpYOfo6DNLl5aEJlk6F6CiSjmT352n8dnsOEIEL+bOusLhP5F8pED85geU5
+rijc38fZ+gfZAVVenz7kqBh7ld6qT5inIM4uQa7oCuFX2dZ0jqm5TFBBtQp9dkFv
+WFz9kEb/CVJr1IsTdp1PAgMBAAGjggFfMIIBWzAOBgNVHQ8BAf8EBAMCAYYwHQYD
+VR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYBAf8CAQAw
+KQYDVR0OBCIEIGI1hqilwtQoFMkbW0tW2caTKmjXSp6GN958mmXVREPyMCsGA1Ud
+IwQkMCKAINmvCHaWHo5MD5lKL52otAsr/TsCX5Hwfy5euQ6zIAWEMFgGCCsGAQUF
+BwEBBEwwSjAjBggrBgEFBQcwAYYXaHR0cDovL2V4YW1wbGUuY29tL29jc3AwIwYI
+KwYBBQUHMAKGF2h0dHA6Ly9leGFtcGxlLmNvbS9yb290MCcGA1UdHwQgMB4wHKAa
+oBiGFmh0dHA6Ly9leGFtcGxlLmNvbS9jcmwwOwYDVR0gBDQwMjAEBgIqAzAqBgIt
+BjAkMCIGCCsGAQUFBwIBFhZodHRwOi8vZXhhbXBsZS5jb20vY3BzMA0GCSqGSIb3
+DQEBCwUAA4ICAQCTLNQlCzHynESAvtPRV1FPaOQhx01RofwS/0Zg3IH5oXxSC98C
+n2L0xHN1gCaJai9XutrFtMCjeBmese48QoPa8MxrB1UpmZ1AuFOQAfHWJZbYPp0V
+PxgY34W9Onb+JPnKTbL9ofKUV0aX67eJ5KKFD1G2z+y9Lz1oA3yJpGzqOY/JCWYz
+q46ik0bmgcGfol6F/T5hoE8pZk8Wr+nNUpSuOSNp7c/g2/pKDRWK8trTrG3owtaJ
+LbQc+W4e97AtTg6DGvR5gftar/+4g2o0xhKSnep+s/bf5NFXVDCTvCmemrbR8Hr7
+NLDKXWuGMoMKIxhyPX6ttpU2Um3rQ1rCQbJ5yWIREZvbdaeK8HSRE3GYE71Z3n/0
+0Kmtg2BKGkrJzcqUSG4o+9mdSjhJ65J76ri5tVQby7Ai7W2KlNjpdI6GYtejUAlf
+vZz5N0e2X36XLPZ8tz04Ix9KLHXMEuA7w/aOglH1Lei+PPp7kBjvXAL66soqCTqu
+49yNbPPGIjGO453+jNzxhbeimh6a5/Fwd4SjsdSBe8AwIGGZTzLiIzCNM5OmcoUf
+Tl5RrVXau4DvX5KvfwOLusl/uJH+7oETJlbi8+fNn2ioYfHg5/Tu3zKZw/Y+6wSA
+LsOIJrFmJEgIBUnWp/B1ZC6TeIokmw5FeJsY1UnFDWsPVcax2T/tg6BZ5Q==
+-----END CERTIFICATE-----

+ 27 - 0
resources/development/nginx/ssl/test.jackyu.cn/private.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpgIBAAKCAQEA0DgmFoPB+e+V573Fn04jdk+MGj4K5OA7pNM/72ZM+u12IzdR
+l9tkCtq+LEr5rPqd6i+jeQPMR7jYz5rgeeaE6uxgxqjJvL7UcrCaFZs8ONFPYp/R
+/VLsV0fNU6HVFxGlTh6cYpL91JC/SA66xWv14MEvesUPs1Ia8XtroFycOaLwc73D
+Vi6jGzaoJOsx5AjCv1a8FP6/71uenBwkjDt5l5glwkYiRWl6p+XrWvSeMBd2/ufn
+eFRoDUnOcnqtAGPagRdJuUZnVzxhXJsSUC+RrK6ZjyWrbUCr0mrYx6qbta5BkyqZ
+nyXTx/iSqTo/87/OX7I/TAhlrfl6B6P5NbkarQIDAQABAoIBAQCKOVv/gkQZGVVY
+XAB++q5L8g69tQYiXkD58Er3L+BWi6DrS+PcfYXyNrgcS0Fn9Y8zUaChy0WnLyyu
+1M/D3KXMFlNATfhuVfhOkrIXOdBGn5ylihcqpgvC/SVvKXV+NPaZ33RNc+sRW22/
+9hdCy6KUK2rLg1oi3pSITjhqYlBLaY7RC+CReIOvtrNs9HSQ3JylEP9Cp6geIdDp
+v9dLbpRaJdhK7scq8Bt6TVwHgb6TyhmB2q86t8PRK8K9zkWPW/GTmg7gWqWYjRPt
+70MJoBboWS4QVrFgulhZNOWgCiqyn15IbXb/AQdkQ9JgsOpWf45+yISt+zM8+xdn
+gmgmIcW5AoGBAOZYyfwdZJ7fSHgpVssYJAuC4nYph+ds3on0nH23Sdj+5zbT7xc8
+XBd0z9RH6/ueIxUte0hkBCA/vmaTOqbMkY0qejdnx+0RpFKonspawCBsXWEmgv+9
+yUngvEkBxOrr/KxkG275h/Ts2XKhUvv41iM+cCN/X1kcJml0gKD/cZMXAoGBAOdo
+gKY6EMYPUFR3kr65DpFC2LofuQPyzrZqLiwaPMtAwX0vGIE3WpMYS9i+Skd5FXSo
+4XbhtwoweRUtbBbVXtkCbIYSH5+2TwHwqCR1sYf2O+3Ak7Dm+t2ZJua8lu52Pi/2
+17eDVb02x3s70X/inIgs7Ta/EYXItfWA8fFFFarbAoGBANgMfV6/vumYaaNyupqB
+CQXW/EtyBqtUnKHuUX1Elbo202zEeWNk1MeXY3sq/jahiyxI3XH3hTsuLoqNGxzp
+kLdEGR+wcn9z5Zk12MHZPozqtubxNTtjqdFmPZOIWkcxkmuq9WQwHYnnQMjYcTou
+mcKyxIE27Zpp4clVYXQgQ0l/AoGBAM/lRN8R/4vQqjyYiE+sdffu9EKSyWdQtoGP
+dxfMIp3/+VT8AKnmDwtjopCAtL7te2cpahWhxw3yanWqLxd8bg/Ma68vjRWxdd2q
+VYUb73jUsRZyEr21Zd+7/gUBnR9zP39b5oVKCrdJBYIjRZ38+uAkbKDom1dz8HU1
+eSdnB4ZNAoGBAJG3qb0yEuTkIjDTV1goYlayLhX/RUPGSgnPMObY36CgarwY/Qxm
+Ny3q0qFuKURg9j56WVWkobxTE4E9/iQopXRmRep8UG41Fwzc6vZaXLUHU7m6GtQ3
+FVl6x+aZmLPf1YLVvMWW1TrVIiX+pElV1RhEXDksYO8vT0dZjIhz81/h
+-----END RSA PRIVATE KEY-----

+ 0 - 16
server/api/template.go

@@ -3,21 +3,11 @@ package api
 import (
 	"github.com/0xJacky/Nginx-UI/server/pkg/nginx"
 	"github.com/0xJacky/Nginx-UI/server/service"
-	"github.com/0xJacky/Nginx-UI/server/settings"
 	"github.com/gin-gonic/gin"
 	"net/http"
-	"strings"
 )
 
 func GetTemplate(c *gin.Context) {
-	content := `proxy_set_header Host $host;
-proxy_set_header X-Real_IP $remote_addr;
-proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
-proxy_pass http://127.0.0.1:{{ HTTP01PORT }};
-`
-	content = strings.ReplaceAll(content, "{{ HTTP01PORT }}",
-		settings.ServerSettings.HTTPChallengePort)
-
 	var ngxConfig *nginx.NgxConfig
 
 	ngxConfig = &nginx.NgxConfig{
@@ -42,12 +32,6 @@ proxy_pass http://127.0.0.1:{{ HTTP01PORT }};
 						Directive: "index",
 					},
 				},
-				Locations: []*nginx.NgxLocation{
-					{
-						Path:    "/.well-known/acme-challenge",
-						Content: content,
-					},
-				},
 			},
 		},
 	}

+ 2 - 0
server/service/template.go

@@ -3,6 +3,7 @@ package service
 import (
 	"bufio"
 	"github.com/0xJacky/Nginx-UI/server/pkg/nginx"
+	"github.com/0xJacky/Nginx-UI/server/settings"
 	"github.com/0xJacky/Nginx-UI/template"
 	"github.com/pkg/errors"
 	"github.com/tufanbarisyildirim/gonginx/parser"
@@ -112,6 +113,7 @@ func ParseTemplate(path, name string) (c ConfigDetail, err error) {
 			content += orig + "\n"
 		}
 	}
+	content = strings.ReplaceAll(content, "{{ HTTP01PORT }}", settings.ServerSettings.HTTPChallengePort)
 	p := parser.NewStringParser(content)
 	config := p.Parse()
 	c.Custom = custom

+ 13 - 0
template/block/letsencrypt.conf

@@ -0,0 +1,13 @@
+# Nginx UI Template Start
+# Name: Let's Encrypt
+# Description[en]: Let's Encrypt HTTPChallange
+# Description[zh_CN]: Let's Encrypt HTTP 鉴权
+# Author: @0xJacky
+# Nginx UI Template End
+
+location /.well-known/acme-challenge {
+    proxy_set_header Host $host;
+    proxy_set_header X-Real_IP $remote_addr;
+    proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
+    proxy_pass http://127.0.0.1:{{ HTTP01PORT }};
+}