Преглед изворни кода

fix(tls): correct pinned cert SHA-256 hint to hex, not base64

xray-core hex-decodes pinnedPeerCertSha256 and the panel forwards the value as-is into share links and the JSON subscription, so clients hex-decode it too. The tooltip/placeholder wrongly said base64 (copied from the retired pinnedPeerCertificateChainSha256 field), and the "generate random hash" button emitted base64 via btoa, producing an unusable pin. Tooltip/placeholder now say hex across all locales and the generator emits hex.

Closes #4793
MHSanaei пре 13 часа
родитељ
комит
c9abda7ab8

+ 1 - 3
frontend/src/pages/inbounds/form/useSecurityActions.ts

@@ -99,9 +99,7 @@ export function useSecurityActions({ form, setSaving, messageApi }: UseSecurityA
   const generateRandomPinHash = () => {
     const bytes = new Uint8Array(32);
     crypto.getRandomValues(bytes);
-    let binary = '';
-    for (const b of bytes) binary += String.fromCharCode(b);
-    const hash = btoa(binary);
+    const hash = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
     const current = (form.getFieldValue(
       ['streamSettings', 'tlsSettings', 'settings', 'pinnedPeerCertSha256'],
     ) as string[] | undefined) ?? [];

+ 2 - 2
web/translation/ar-EG.json

@@ -555,8 +555,8 @@
         "echKey": "ECH key",
         "echConfig": "تكوين ECH",
         "pinnedPeerCertSha256": "SHA-256 لشهادة النظير المثبَّتة",
-        "pinnedPeerCertSha256Tip": "تجزئات SHA-256 المُرمَّزة بـ Base64 لشهادة النظير. للوحة فقط — لا تُكتب في إعدادات xray على الخادم، لكنها تُضمَّن في روابط المشاركة ليتمكَّن العملاء من تثبيت الشهادة.",
-        "pinnedPeerCertSha256Placeholder": "تجزئة (تجزئات) base64، مفصولة بفواصل",
+        "pinnedPeerCertSha256Tip": "تجزئات SHA-256 لشهادة النظير كسلسلة سداسية عشرية (مثل e8e2d3…)، مفصولة بفواصل. للوحة فقط — لا تُكتب في إعدادات xray على الخادم، لكنها تُضمَّن في روابط المشاركة ليتمكَّن العملاء من تثبيت الشهادة.",
+        "pinnedPeerCertSha256Placeholder": "تجزئة (تجزئات) سداسية عشرية، مفصولة بفواصل",
         "generateRandomPin": "إنشاء تجزئة عشوائية",
         "getNewEchCert": "احصل على شهادة ECH جديدة",
         "show": "عرض",

+ 2 - 2
web/translation/en-US.json

@@ -555,8 +555,8 @@
         "echKey": "ECH key",
         "echConfig": "ECH config",
         "pinnedPeerCertSha256": "Pinned Peer Cert SHA-256",
-        "pinnedPeerCertSha256Tip": "Base64-encoded SHA-256 hashes of the peer certificate. Panel-only — not written to the server's xray config, but included in share links so clients can pin the certificate.",
-        "pinnedPeerCertSha256Placeholder": "base64 hash(es), comma-separated",
+        "pinnedPeerCertSha256Tip": "SHA-256 hash(es) of the peer certificate as a hex string (e.g. e8e2d3…), comma-separated. Panel-only — not written to the server's xray config, but included in share links so clients can pin the certificate.",
+        "pinnedPeerCertSha256Placeholder": "hex hash(es), comma-separated",
         "generateRandomPin": "Generate random hash",
         "getNewEchCert": "Get New ECH Cert",
         "show": "Show",

+ 2 - 2
web/translation/es-ES.json

@@ -555,8 +555,8 @@
         "echKey": "ECH key",
         "echConfig": "Config ECH",
         "pinnedPeerCertSha256": "SHA-256 del cert. del par fijado",
-        "pinnedPeerCertSha256Tip": "Hashes SHA-256 codificados en Base64 del certificado del par. Solo en el panel — no se escribe en la config xray del servidor, pero se incluye en los enlaces para que los clientes puedan fijar el certificado.",
-        "pinnedPeerCertSha256Placeholder": "hash(es) base64, separados por comas",
+        "pinnedPeerCertSha256Tip": "Hashes SHA-256 del certificado del par como cadena hexadecimal (p. ej. e8e2d3…), separados por comas. Solo en el panel — no se escribe en la config xray del servidor, pero se incluye en los enlaces para que los clientes puedan fijar el certificado.",
+        "pinnedPeerCertSha256Placeholder": "hash(es) hexadecimal, separados por comas",
         "generateRandomPin": "Generar hash aleatorio",
         "getNewEchCert": "Obtener nuevo cert ECH",
         "show": "Mostrar",

+ 2 - 2
web/translation/fa-IR.json

@@ -555,8 +555,8 @@
         "echKey": "کلید ECH",
         "echConfig": "پیکربندی ECH",
         "pinnedPeerCertSha256": "SHA-256 پین‌شدهٔ گواهی همتا",
-        "pinnedPeerCertSha256Tip": "هش‌های SHA-256 با کدگذاری Base64 از گواهی همتا. فقط در پنل — در پیکربندی xray سرور نوشته نمی‌شود، اما در لینک‌های اشتراک‌گذاری گنجانده می‌شود تا کلاینت‌ها بتوانند گواهی را پین کنند.",
-        "pinnedPeerCertSha256Placeholder": "هش(های) base64، با کاما جدا شوند",
+        "pinnedPeerCertSha256Tip": "هش‌های SHA-256 گواهی همتا به‌صورت رشتهٔ هگزادسیمال (مثل e8e2d3…)، با کاما جدا شوند. فقط در پنل — در پیکربندی xray سرور نوشته نمی‌شود، اما در لینک‌های اشتراک‌گذاری گنجانده می‌شود تا کلاینت‌ها بتوانند گواهی را پین کنند.",
+        "pinnedPeerCertSha256Placeholder": "هش(های) هگزادسیمال، با کاما جدا شوند",
         "generateRandomPin": "تولید هش تصادفی",
         "getNewEchCert": "دریافت گواهی ECH جدید",
         "show": "نمایش",

+ 2 - 2
web/translation/id-ID.json

@@ -555,8 +555,8 @@
         "echKey": "ECH key",
         "echConfig": "Konfig ECH",
         "pinnedPeerCertSha256": "SHA-256 Sertifikat Peer Tersemat",
-        "pinnedPeerCertSha256Tip": "Hash SHA-256 berenkode Base64 dari sertifikat peer. Hanya panel — tidak ditulis ke konfig xray server, tetapi disertakan dalam link berbagi agar klien dapat menyematkan sertifikat.",
-        "pinnedPeerCertSha256Placeholder": "hash base64, dipisah koma",
+        "pinnedPeerCertSha256Tip": "Hash SHA-256 dari sertifikat peer sebagai string heksadesimal (mis. e8e2d3…), dipisah koma. Hanya panel — tidak ditulis ke konfig xray server, tetapi disertakan dalam link berbagi agar klien dapat menyematkan sertifikat.",
+        "pinnedPeerCertSha256Placeholder": "hash heksadesimal, dipisah koma",
         "generateRandomPin": "Hasilkan hash acak",
         "getNewEchCert": "Dapatkan sertifikat ECH baru",
         "show": "Tampilkan",

+ 2 - 2
web/translation/ja-JP.json

@@ -555,8 +555,8 @@
         "echKey": "ECH key",
         "echConfig": "ECH config",
         "pinnedPeerCertSha256": "ピン留めピア証明書 SHA-256",
-        "pinnedPeerCertSha256Tip": "ピア証明書の Base64 エンコード SHA-256 ハッシュ。パネルのみ — サーバーの xray 設定には書き込まれませんが、共有リンクには含まれ、クライアントが証明書をピン留めできます。",
-        "pinnedPeerCertSha256Placeholder": "Base64 ハッシュ、カンマ区切り",
+        "pinnedPeerCertSha256Tip": "ピア証明書の SHA-256 ハッシュ(16進数文字列、例: e8e2d3…)、カンマ区切り。パネルのみ — サーバーの xray 設定には書き込まれませんが、共有リンクには含まれ、クライアントが証明書をピン留めできます。",
+        "pinnedPeerCertSha256Placeholder": "16進ハッシュ、カンマ区切り",
         "generateRandomPin": "ランダムハッシュを生成",
         "getNewEchCert": "新しい ECH 証明書を取得",
         "show": "表示",

+ 2 - 2
web/translation/pt-BR.json

@@ -555,8 +555,8 @@
         "echKey": "ECH key",
         "echConfig": "Config ECH",
         "pinnedPeerCertSha256": "SHA-256 do cert. do par fixado",
-        "pinnedPeerCertSha256Tip": "Hashes SHA-256 codificados em Base64 do certificado do par. 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) base64, separados por vírgula",
+        "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",
         "generateRandomPin": "Gerar hash aleatório",
         "getNewEchCert": "Obter novo certificado ECH",
         "show": "Mostrar",

+ 2 - 2
web/translation/ru-RU.json

@@ -555,8 +555,8 @@
         "echKey": "ECH key",
         "echConfig": "ECH config",
         "pinnedPeerCertSha256": "Закреплённый SHA-256 сертификата пира",
-        "pinnedPeerCertSha256Tip": "SHA-256-хеши сертификата пира в кодировке Base64. Только для панели — не записывается в конфиг xray сервера, но включается в ссылки-приглашения, чтобы клиенты могли закрепить сертификат.",
-        "pinnedPeerCertSha256Placeholder": "Base64-хеш(и), через запятую",
+        "pinnedPeerCertSha256Tip": "SHA-256-хеши сертификата пира в виде шестнадцатеричной строки (напр. e8e2d3…), через запятую. Только для панели — не записывается в конфиг xray сервера, но включается в ссылки-приглашения, чтобы клиенты могли закрепить сертификат.",
+        "pinnedPeerCertSha256Placeholder": "шестнадцатеричный хеш(и), через запятую",
         "generateRandomPin": "Сгенерировать случайный хеш",
         "getNewEchCert": "Получить новый ECH-сертификат",
         "show": "Показать",

+ 2 - 2
web/translation/tr-TR.json

@@ -555,8 +555,8 @@
         "echKey": "ECH key",
         "echConfig": "ECH yapılandırması",
         "pinnedPeerCertSha256": "Sabitlenmiş Peer Sertifikası SHA-256",
-        "pinnedPeerCertSha256Tip": "Peer sertifikasının Base64 kodlu SHA-256 hash'leri. Sadece panel — sunucunun xray yapılandırmasına yazılmaz, ancak istemcilerin sertifikayı sabitleyebilmesi için paylaşım bağlantılarına eklenir.",
-        "pinnedPeerCertSha256Placeholder": "base64 hash(ler), virgülle ayrılmış",
+        "pinnedPeerCertSha256Tip": "Peer sertifikasının SHA-256 hash'leri onaltılık (hex) dizge olarak (örn. e8e2d3…), virgülle ayrılmış. Sadece panel — sunucunun xray yapılandırmasına yazılmaz, ancak istemcilerin sertifikayı sabitleyebilmesi için paylaşım bağlantılarına eklenir.",
+        "pinnedPeerCertSha256Placeholder": "onaltılık (hex) hash(ler), virgülle ayrılmış",
         "generateRandomPin": "Rastgele hash üret",
         "getNewEchCert": "Yeni ECH sertifikası al",
         "show": "Göster",

+ 2 - 2
web/translation/uk-UA.json

@@ -555,8 +555,8 @@
         "echKey": "ECH key",
         "echConfig": "ECH config",
         "pinnedPeerCertSha256": "Закріплений SHA-256 сертифіката пира",
-        "pinnedPeerCertSha256Tip": "SHA-256-хеші сертифіката пира в кодуванні Base64. Лише панель — не записується в конфіг xray сервера, але додається до посилань спільного доступу, щоб клієнти могли закріпити сертифікат.",
-        "pinnedPeerCertSha256Placeholder": "Base64-хеш(і), через кому",
+        "pinnedPeerCertSha256Tip": "SHA-256-хеші сертифіката пира у вигляді шістнадцяткового рядка (напр. e8e2d3…), через кому. Лише панель — не записується в конфіг xray сервера, але додається до посилань спільного доступу, щоб клієнти могли закріпити сертифікат.",
+        "pinnedPeerCertSha256Placeholder": "шістнадцятковий хеш(і), через кому",
         "generateRandomPin": "Згенерувати випадковий хеш",
         "getNewEchCert": "Отримати новий ECH-сертифікат",
         "show": "Показати",

+ 2 - 2
web/translation/vi-VN.json

@@ -555,8 +555,8 @@
         "echKey": "ECH key",
         "echConfig": "Cấu hình ECH",
         "pinnedPeerCertSha256": "SHA-256 chứng chỉ peer đã ghim",
-        "pinnedPeerCertSha256Tip": "Hash SHA-256 mã hóa Base64 của chứng chỉ peer. Chỉ panel — không ghi vào cấu hình xray máy chủ, nhưng được đưa vào liên kết chia sẻ để client có thể ghim chứng chỉ.",
-        "pinnedPeerCertSha256Placeholder": "hash base64, phân tách bằng dấu phẩy",
+        "pinnedPeerCertSha256Tip": "Hash SHA-256 của chứng chỉ peer dưới dạng chuỗi thập lục phân (vd. e8e2d3…), phân tách bằng dấu phẩy. Chỉ panel — không ghi vào cấu hình xray máy chủ, nhưng được đưa vào liên kết chia sẻ để client có thể ghim chứng chỉ.",
+        "pinnedPeerCertSha256Placeholder": "hash thập lục phân, phân tách bằng dấu phẩy",
         "generateRandomPin": "Tạo hash ngẫu nhiên",
         "getNewEchCert": "Lấy chứng chỉ ECH mới",
         "show": "Hiện",

+ 2 - 2
web/translation/zh-CN.json

@@ -555,8 +555,8 @@
         "echKey": "ECH key",
         "echConfig": "ECH 配置",
         "pinnedPeerCertSha256": "固定对端证书 SHA-256",
-        "pinnedPeerCertSha256Tip": "对端证书的 Base64 编码 SHA-256 哈希。仅面板使用 — 不写入服务器的 xray 配置,但会包含在分享链接中,以便客户端固定证书。",
-        "pinnedPeerCertSha256Placeholder": "base64 哈希,逗号分隔",
+        "pinnedPeerCertSha256Tip": "对端证书的 SHA-256 哈希(十六进制字符串,如 e8e2d3…),逗号分隔。仅面板使用 — 不写入服务器的 xray 配置,但会包含在分享链接中,以便客户端固定证书。",
+        "pinnedPeerCertSha256Placeholder": "十六进制哈希,逗号分隔",
         "generateRandomPin": "生成随机哈希",
         "getNewEchCert": "获取新 ECH 证书",
         "show": "显示",

+ 2 - 2
web/translation/zh-TW.json

@@ -555,8 +555,8 @@
         "echKey": "ECH key",
         "echConfig": "ECH 設定",
         "pinnedPeerCertSha256": "釘選對端憑證 SHA-256",
-        "pinnedPeerCertSha256Tip": "對端憑證的 Base64 編碼 SHA-256 雜湊。僅面板使用 — 不寫入伺服器的 xray 設定,但會包含在分享連結中,以便用戶端釘選憑證。",
-        "pinnedPeerCertSha256Placeholder": "base64 雜湊,以逗號分隔",
+        "pinnedPeerCertSha256Tip": "對端憑證的 SHA-256 雜湊(十六進位字串,如 e8e2d3…),以逗號分隔。僅面板使用 — 不寫入伺服器的 xray 設定,但會包含在分享連結中,以便用戶端釘選憑證。",
+        "pinnedPeerCertSha256Placeholder": "十六進位雜湊,以逗號分隔",
         "generateRandomPin": "產生隨機雜湊",
         "getNewEchCert": "取得新 ECH 憑證",
         "show": "顯示",