diff --git a/fe/src/views/Setup/Setup.js b/fe/src/views/Setup/Setup.js index 86a2482..798880d 100644 --- a/fe/src/views/Setup/Setup.js +++ b/fe/src/views/Setup/Setup.js @@ -123,7 +123,8 @@ export function usePage() { records.some((record) => record.type === 'AAAA') )) - const sslRuntime = ref({}) + const port = ref(80) + const sslRuntime = ref({}) const addDomain = () => { domainSettings.multi_domain.push([]) @@ -352,12 +353,14 @@ export function usePage() { sslSettings.type = res.data.type if (sslSettings.type === "2") { sslSettings.type = "0" + sslSettings.challenge = "dns" } if (sslSettings.type === "0") { - sslSettings.challenge = "" + sslSettings.challenge = sslSettings.challenge || "http" } sslRuntime.value = res.data || {} - return res + port.value = res.data?.port || res.data?.httpPort || 80 + return res }).catch((error) => { showSetupError(error) return null @@ -368,7 +371,7 @@ export function usePage() { fullscreenLoading.value = true; let sslType = sslSettings.type; - if (sslType === "0") { + if (sslType === "0" && sslSettings.challenge === "dns") { sslType = "2" } @@ -718,9 +721,10 @@ export function usePage() { fullscreenLoading, dnsChecking, dnsChallengeNotice, + port, dnsInfos, hasDNSIPv6, - addDomain, + addDomain, setPassword, getPassword, getDbConfig, diff --git a/fe/src/views/Setup/Setup.vue b/fe/src/views/Setup/Setup.vue index 8279c5e..6282a97 100644 --- a/fe/src/views/Setup/Setup.vue +++ b/fe/src/views/Setup/Setup.vue @@ -278,6 +278,11 @@

{{ lang.setSSL }}

+
{{ lang.setSSL }}
@@ -293,8 +298,9 @@
- + @@ -406,6 +412,7 @@ const { hasDNSIPv6, sslSettings, dnsChecking, + port, dnsChallengeNotice, waitDesc, next, diff --git a/server/res_init/init.go b/server/res_init/init.go index cb20ac9..52d81e8 100644 --- a/server/res_init/init.go +++ b/server/res_init/init.go @@ -19,6 +19,7 @@ import ( "git.pcux.cn/xuans/Smail/listen/pop3_server" "git.pcux.cn/xuans/Smail/listen/smtp_server" "git.pcux.cn/xuans/Smail/services/adminreset" + "git.pcux.cn/xuans/Smail/services/auth" "git.pcux.cn/xuans/Smail/services/credentials" "git.pcux.cn/xuans/Smail/services/dbmigration" "git.pcux.cn/xuans/Smail/services/externalemail" @@ -160,6 +161,9 @@ func Init(serverVersion string) error { // 等待 HTTP 服务就绪后再执行需要 HTTP 回调的 SSL 更新。 // ssl.Update(false) + if _, err := auth.DkimGen(); err != nil { + return err + } if err := parsemail.Init(); err != nil { return err } diff --git a/server/services/setup/ssl/ssl.go b/server/services/setup/ssl/ssl.go index 3b03fda..8daf1ff 100644 --- a/server/services/setup/ssl/ssl.go +++ b/server/services/setup/ssl/ssl.go @@ -290,7 +290,7 @@ func writeCertificateFiles(cfg *config.Config, privateKey, certificate, issuer [ if cfg == nil { return errors.New("SSL 配置不能为空") } - reference, err := config.ImportManagedSSL(config.ManagedSSLModeDefault, privateKey, certificate, issuer, wildcardCertificateDomains(cfg)) + reference, err := config.ImportManagedSSL(config.ManagedSSLModeDefault, privateKey, certificate, issuer, certificateDomains(cfg)) if err != nil { return err } @@ -343,6 +343,13 @@ func wildcardCertificateDomains(cfg *config.Config) []string { return []string{"*." + domain} } +func certificateDomains(cfg *config.Config) []string { + if cfg != nil && cfg.SSLType == config.SSLTypeAutoDNS { + return wildcardCertificateDomains(cfg) + } + return sslDomains(cfg) +} + func renewCertificate(privateKey *ecdsa.PrivateKey, cfg *config.Config) error { myUser := MyUser{ @@ -387,7 +394,7 @@ func renewCertificate(privateKey *ecdsa.PrivateKey, cfg *config.Config) error { myUser.Registration = reg - domains := wildcardCertificateDomains(cfg) + domains := certificateDomains(cfg) request := certificate.ObtainRequest{ Domains: domains, @@ -451,7 +458,7 @@ func generateCertificate(privateKey *ecdsa.PrivateKey, cfg *config.Config, newAc myUser.Registration = reg - domains := wildcardCertificateDomains(cfg) + domains := certificateDomains(cfg) request := certificate.ObtainRequest{ Domains: domains, diff --git a/server/services/setup/ssl/wildcard_test.go b/server/services/setup/ssl/wildcard_test.go index 9d0e449..4a3a721 100644 --- a/server/services/setup/ssl/wildcard_test.go +++ b/server/services/setup/ssl/wildcard_test.go @@ -50,6 +50,29 @@ func TestWildcardCertificateDomains(t *testing.T) { } } +func TestCertificateDomainsFollowChallengeMode(t *testing.T) { + cfg := &config.Config{ + Domain: "xuans.com", + WebDomain: "web.xuans.com", + Domains: []string{"xuans.com"}, + } + + cfg.SSLType = config.SSLTypeAutoHTTP + httpDomains := certificateDomains(cfg) + if len(httpDomains) != 5 { + t.Fatalf("got %d HTTP domains, want 5: %v", len(httpDomains), httpDomains) + } + if httpDomains[0] != "web.xuans.com" || httpDomains[1] != "xuans.com" { + t.Fatalf("unexpected HTTP domains: %v", httpDomains) + } + + cfg.SSLType = config.SSLTypeAutoDNS + dnsDomains := certificateDomains(cfg) + if len(dnsDomains) != 1 || dnsDomains[0] != "*.xuans.com" { + t.Fatalf("unexpected DNS domains: %v", dnsDomains) + } +} + func TestDNSChallengeWildcardProducesSingleRecord(t *testing.T) { challenge := &DNSChallenge{authInfo: map[string]*authInfo{}} if err := challenge.Present("*.xuans.com", "token", "key-auth"); err != nil {