feat(tls): add a dynamic DoH helper for echConfigList, with CDN guidance (#6869)

echConfigList already accepted Xray's dynamic form, target domain + DoH URL,
but nothing in the inbound or host forms explained or built it. A helper now
builds that value from presets or a custom domain and resolver, accepts only the
schemes Xray dials (https, h2c, udp; scheme case normalised), warns that a key
generated locally does not work behind a CDN, and asks before overwriting local
ECH keys. The helper's controls carry accessible labels, and the resolver list
holds only identified public resolvers.
This commit is contained in:
55575455
2026-10-24 12:07:11 +08:00
committed by GitHub
parent 41bafb3fd5
commit f43645656c
21 changed files with 1380 additions and 53 deletions
+30 -2
View File
@@ -475,6 +475,36 @@
"form": {
"echSockopt": "Sockopt ECH",
"echSockoptTip": "Opções de socket para a conexão que o Xray usa ao buscar a lista de configurações ECH (por exemplo, rotear a consulta por um outbound dialerProxy). Deixe desativado para usar os padrões.",
"echCdnWarningTitle": "Chaves ECH geradas localmente só funcionam em conexões diretas",
"echCdnWarningBody": "Um par de chaves criado com «Get New ECH Cert» só é válido quando os clientes se conectam diretamente a este VPS. Se o inbound for proxiado pelo Cloudflare CDN (VLESS + xhttp/WS atrás da nuvem laranja), o Cloudflare encerra o TLS externo com as próprias chaves ECH e as rotaciona, então uma chave local sempre falha no handshake. Use o assistente de ECH dinâmico em vez disso.",
"echDynamicTitle": "ECH dinâmico do Cloudflare (funciona atrás da nuvem laranja)",
"echPresetLabel": "Combinação predefinida",
"echPresetOtherDomains": "Outros domínios de destino ECH",
"echPresetAdvanced": "Combinação personalizada…",
"echDynamicIntro": "Preenche a lista de configurações ECH com uma consulta dinâmica do lado do cliente (domínio de destino + resolvedor DoH). O cliente consulta o resolvedor pelo registro HTTPS do domínio a cada conexão, então sempre vê as chaves ECH atuais — incluindo as rotacionadas do Cloudflare.",
"echDynamicDomain": "Domínio de destino ECH",
"echDynamicDoh": "Resolvedor DoH",
"echDomainAuto": "Automático — resolver o registro ECH do SNI do nó",
"echDynamicApply": "Aplicar à lista de configurações ECH",
"echDynamicCustom": "URL personalizada…",
"echDynamicInvalid": "Informe um domínio válido e uma URL de resolvedor (https, h2c ou udp) para montar o valor.",
"echDynamicUnsupportedScheme": "O Xray só resolve a configuração ECH via https://, h2c:// ou udp://. Este destino nunca responderá.",
"echDynamicPlaceholder": "cloudflare-ech.com+https://dns.alidns.com/dns-query",
"echDynamicOverwriteTitle": "Este inbound tem um par de chaves ECH gerado localmente",
"echDynamicOverwriteBody": "Atrás de um CDN esse par de chaves nunca é usado: o CDN encerra o handshake TLS. Aplicar o valor dinâmico substituirá a lista de configurações ECH e apagará a chave ECH local.",
"echDynamicOverwriteConfirm": "Substituir e apagar chave local",
"echExistingNotDynamic": "Esta lista de configurações ECH não está na forma dinâmica; preenchê-la substituirá o que você definiu manualmente.",
"echDohGroup": {
"china": "China continental (acessível atrás da GFW)",
"global": "Mundial",
"europe": "Europa",
"udp": "DNS simples (udp://)"
},
"echRecommended": "recomendado",
"echMainlandAdvisory": "Resolvedores da China continental exigem um domínio de destino cujo registro HTTPS carregue ECH; verifique o par antes de salvar.",
"echConfigList": "Lista de configurações ECH",
"echConfigListHint": "Enviada aos clientes nos links de compartilhamento e nas assinaturas. Aceita um ECHConfigList local (do botão abaixo) ou a forma dinâmica domínio+URL de DoH.",
"echKeyHint": "Somente para conexões diretas — deixe vazio quando o inbound estiver atrás de um CDN.",
"curvePreferences": "Preferências de curva",
"curvePreferencesTip": "Restringe as curvas de troca de chaves TLS que o servidor oferece, em ordem de preferência (por exemplo, X25519MLKEM768, X25519). Deixe vazio para usar os padrões do Xray-core.",
"masterKeyLog": "Log da chave mestra",
@@ -632,7 +662,6 @@
"usageOption": "Opção de uso",
"buildChain": "Construir cadeia",
"echKey": "ECH key",
"echConfig": "Config ECH",
"pinnedPeerCertSha256": "SHA-256 do cert. do par fixado",
"pinnedPeerCertSha256Tip": "Hashes SHA-256 do certificado do par como string hexadecimal (ex. e8e2d3…), separados por vírgula. Apenas no painel — não é gravado na config xray do servidor, mas é incluído nos links de compartilhamento para que clientes possam fixar o certificado.",
"pinnedPeerCertSha256Placeholder": "hash(es) hexadecimal, separados por vírgula",
@@ -2361,7 +2390,6 @@
"pins": "SHA-256 do certificado fixado",
"verifyPeerCertByName": "Verificar certificado do par pelo nome",
"allowInsecure": "Permitir inseguro",
"echConfigList": "Lista de configurações ECH",
"muxParams": "Mux",
"sockoptParams": "Sockopt",
"finalMask": "Final Mask",