From c93f09e9acc7ca10b72c57c8d82c0eb49e77a77b Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Thu, 15 Oct 2026 14:36:36 +0200 Subject: [PATCH] Feat: TLS certificate menu and config dialog for the MFC server MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a "TLSè¯�书" item to the Extensions menu below "MCP设置" that opens a runtime-built dialog to enable one-way TLS and set the certificate and private-key paths. On OK it writes the [tls] Enabled/CertPath/KeyPath keys and calls ServerTlsIdentity::Load() so the change takes effect for new connections immediately (design doc §7.1), mirroring the existing CMcpSettingsDlg runtime-template pattern. All new strings are wired into the en_US / zh_TW / de_DE language files, and the menu item is gated by HIDE_MENU_TLS_CERTIFICATE / MF_TLS_CERTIFICATE like MCP settings. Co-Authored-By: deepseek-v4-pro --- server/2015Remote/2015RemoteDlg.cpp | 28 +++ server/2015Remote/2015RemoteDlg.h | 1 + server/2015Remote/2015Remote_vs2015.vcxproj | 2 + .../2015Remote_vs2015.vcxproj.filters | 2 + server/2015Remote/FeatureFlags.h | 3 +- server/2015Remote/TlsCertificateDlg.cpp | 234 ++++++++++++++++++ server/2015Remote/TlsCertificateDlg.h | 43 ++++ server/2015Remote/UIBranding.h | 1 + server/2015Remote/lang/de_DE.ini | 12 + server/2015Remote/lang/en_US.ini | 12 + server/2015Remote/lang/zh_TW.ini | 12 + server/2015Remote/resource.h | 3 +- 12 files changed, 351 insertions(+), 2 deletions(-) create mode 100644 server/2015Remote/TlsCertificateDlg.cpp create mode 100644 server/2015Remote/TlsCertificateDlg.h diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 05624ad..e66148a 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -50,6 +50,7 @@ #include "CFileSpeedDlg.h" #include "McpServer.h" #include "McpSettingsDlg.h" +#include "TlsCertificateDlg.h" #include "common/md5.h" #include #include @@ -1059,6 +1060,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(ID_TOOL_RELOAD_PLUGINS, &CMy2015RemoteDlg::OnToolReloadPlugins) ON_COMMAND(ID_TOOL_PLUGIN_SETTINGS, &CMy2015RemoteDlg::OnToolPluginSettings) ON_COMMAND(ID_MCP_SETTINGS, &CMy2015RemoteDlg::OnMcpSettings) + ON_COMMAND(ID_TLS_CERTIFICATE, &CMy2015RemoteDlg::OnTlsCertificate) ON_COMMAND(ID_CONNECTION_MANAGE, &CMy2015RemoteDlg::OnConnectionManage) ON_COMMAND(ID_TALK_MANAGE, &CMy2015RemoteDlg::OnChat) ON_COMMAND(ID_MACHINE_MANAGE, &CMy2015RemoteDlg::OnMachineManager) @@ -1323,6 +1325,17 @@ VOID CMy2015RemoteDlg::CreateSolidMenu() ID_MCP_SETTINGS, _TR("MCP设置(&M)...")); } + // 动æ€�æ�’入「TLSè¯�书ã€�è�œå�•项,ä½�于「MCP设置ã€�之å�Žã€�「æ�’件设置ã€�之å‰�(对å�Œä¸€é”šç‚¹ + // ID_TOOL_PLUGIN_SETTINGS 二次 InsertMenu,å�Žæ�’者更贴近锚点,故排在 MCP 下方)。 + if (!SHOULD_HIDE_MENU(HIDE_MENU_TLS_CERTIFICATE, MF_TLS_CERTIFICATE)) { + UINT tlsFlags = MF_BYCOMMAND; + if (THIS_CFG.GetInt("tls", "Enabled", 0)) { + tlsFlags |= MF_CHECKED; // å·²å�¯ç”¨ TLS 则è�œå�•打勾 + } + pExtMenu->InsertMenu(ID_TOOL_PLUGIN_SETTINGS, tlsFlags, + ID_TLS_CERTIFICATE, _TR("TLSè¯�书(&T)...")); + } + // å°† 3 个æ�’件相关è�œå�•项收拢到「æ�’ä»¶ã€�二级è�œå�•(ä½�于「MCP设置ã€�之下ã€�原「æ�’件设置ã€�之å‰�, // 顺åº�ä¸�å�˜ï¼šæ�’件设置 / 刷新æ�’ä»¶ / 获å�–æ�’件)。 // 注æ„�:先删除顶层项ã€�å†�按ä½�ç½®æ�’å…¥å­�è�œå�•,é�¿å…�å�Œä¸€å‘½ä»¤ ID å�Œæ—¶å­˜åœ¨äºŽå­�è�œå�•与顶层时, @@ -11558,6 +11571,21 @@ void CMy2015RemoteDlg::OnMcpSettings() ApplyFrpSettings(); } +void CMy2015RemoteDlg::OnTlsCertificate() +{ + CTlsCertificateDlg dlg(this); + if (dlg.DoModal() != IDOK) return; + + // 对è¯�框内已写入 [tls] 三键并调 ServerTlsIdentity::Load(THIS_CFG) 热é‡�载, + // 对新建连接å�³æ—¶ç”Ÿæ•ˆï¼ˆè®¾è®¡æ–‡æ¡£ §7.1)。 + // è�œå�•在å�¯åŠ¨æ—¶å�ªæž„建一次(CreateSolidMenu),勾选状æ€�ä¸�会自动刷新, + // 这里å�Œæ­¥ã€Œæ‰©å±•ã€�è�œå�•上「TLSè¯�书ã€�的勾选,使其与 [tls] Enabled 一致。 + if (CMenu* pExtMenu = m_MainMenu.GetSubMenu(3)) { + pExtMenu->CheckMenuItem(ID_TLS_CERTIFICATE, MF_BYCOMMAND | + (THIS_CFG.GetInt("tls", "Enabled", 0) ? MF_CHECKED : MF_UNCHECKED)); + } +} + void CMy2015RemoteDlg::OnConnectionManage() { BYTE cmd = COMMAND_CONNECTION; diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 909dd23..528de9b 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -696,6 +696,7 @@ public: afx_msg void OnCancelShare(); afx_msg void OnWebRemoteControl(); afx_msg void OnMcpSettings(); + afx_msg void OnTlsCertificate(); afx_msg void OnConnectionManage(); afx_msg void OnProxyPortAutorun(); afx_msg void OnScreenpreviewLoop(); diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj index 12777e9..bf88d5c 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj +++ b/server/2015Remote/2015Remote_vs2015.vcxproj @@ -329,6 +329,7 @@ + @@ -397,6 +398,7 @@ + NotUsing NotUsing diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj.filters b/server/2015Remote/2015Remote_vs2015.vcxproj.filters index 073178e..3d077a0 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj.filters +++ b/server/2015Remote/2015Remote_vs2015.vcxproj.filters @@ -90,6 +90,7 @@ + @@ -203,6 +204,7 @@ + diff --git a/server/2015Remote/FeatureFlags.h b/server/2015Remote/FeatureFlags.h index 888a9a3..27fb09f 100644 --- a/server/2015Remote/FeatureFlags.h +++ b/server/2015Remote/FeatureFlags.h @@ -89,8 +89,9 @@ typedef struct FeatureFlags { #define MF_REQUEST_AUTH (1ULL << 42) // HIDE_MENU_REQUEST_AUTH #define MF_MCP_SETTINGS (1ULL << 43) // HIDE_MENU_MCP_SETTINGS +#define MF_TLS_CERTIFICATE (1ULL << 44) // HIDE_MENU_TLS_CERTIFICATE -// [44-63] Reserved +// [45-63] Reserved // ============================================================ diff --git a/server/2015Remote/TlsCertificateDlg.cpp b/server/2015Remote/TlsCertificateDlg.cpp new file mode 100644 index 0000000..873566f --- /dev/null +++ b/server/2015Remote/TlsCertificateDlg.cpp @@ -0,0 +1,234 @@ +#include "stdafx.h" +#include "TlsCertificateDlg.h" +#include "LangManager.h" // _TR / MessageBoxL +#include "2015Remote.h" // THIS_CFG (GetThisCfg) +#include "ServerTlsSession.h" // ServerTlsIdentity::Load / IsLoadError +#include "common/iniFile.h" // config::GetInt/GetStr/SetInt/SetStr +#include +#include + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +namespace { + +// 构造一个无控件的 DLGTEMPLATE:cdit=0,控件由 OnInitDialog 动æ€�创建。 +// (与 McpSettingsDlg.cpp / ZstaPickerDlg.cpp 内å�Œå��函数一致) +void BuildDialogTemplate(std::vector& out, LPCWSTR caption, short cx, short cy) +{ + out.clear(); + auto append = [&](const void* p, size_t n) { + const BYTE* b = (const BYTE*)p; + out.insert(out.end(), b, b + n); + }; + auto appendW = [&](WORD v) { + out.push_back((BYTE)(v & 0xFF)); + out.push_back((BYTE)((v >> 8) & 0xFF)); + }; + auto appendWStr = [&](LPCWSTR s) { + size_t n = wcslen(s); + append(s, (n + 1) * sizeof(WCHAR)); + }; + + DLGTEMPLATE dt = { 0 }; + dt.style = DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | + WS_POPUP | WS_CAPTION | WS_SYSMENU; + dt.dwExtendedStyle = 0; + dt.cdit = 0; + dt.x = 0; dt.y = 0; + dt.cx = cx; dt.cy = cy; + append(&dt, sizeof(dt)); + appendW(0); // no menu + appendW(0); // default dialog class + appendWStr(caption); // caption + appendW(8); // font point size + appendWStr(L"MS Shell Dlg"); // typeface + + while (out.size() % 4) out.push_back(0); // DWORD align +} + +} // namespace + +BEGIN_MESSAGE_MAP(CTlsCertificateDlg, CDialog) + ON_BN_CLICKED(IDC_TLS_CERT_BROWSE, &CTlsCertificateDlg::OnBrowseCert) + ON_BN_CLICKED(IDC_TLS_KEY_BROWSE, &CTlsCertificateDlg::OnBrowseKey) +END_MESSAGE_MAP() + +CTlsCertificateDlg::CTlsCertificateDlg(CWnd* parent) + : CDialog((LPCTSTR)NULL, parent) +{ +} + +INT_PTR CTlsCertificateDlg::DoModal() +{ + USES_CONVERSION; + CString title = _TR("TLSè¯�书"); + BuildDialogTemplate(m_Template, T2CW(title), 340, 180); + InitModalIndirect((LPCDLGTEMPLATE)m_Template.data()); + return CDialog::DoModal(); +} + +BOOL CTlsCertificateDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + CRect cli; + GetClientRect(&cli); + + // å� ä½� rect,真正布局在 LayoutControls 里 + CRect r0(0, 0, 10, 10); + + m_btnEnable.Create(_TR("å�¯ç”¨åР坆"), + WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX, + r0, this, IDC_TLS_ENABLE); + m_lblCert.Create(_TR("è¯�书路径"), WS_CHILD | WS_VISIBLE, r0, this, (UINT)-1); + m_editCert.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL, + r0, this, IDC_TLS_CERT); + m_btnCertBrowse.Create(_TR("æµ�览"), WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, + r0, this, IDC_TLS_CERT_BROWSE); + m_lblKey.Create(_TR("ç§�钥路径"), WS_CHILD | WS_VISIBLE, r0, this, (UINT)-1); + m_editKey.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL, + r0, this, IDC_TLS_KEY); + m_btnKeyBrowse.Create(_TR("æµ�览"), WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, + r0, this, IDC_TLS_KEY_BROWSE); + m_btnOK.Create(_TR("确定"), WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON, + r0, this, IDOK); + m_btnCancel.Create(_TR("å�–消"), WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, + r0, this, IDCANCEL); + + // å­�控件继承对è¯�框字体 (DS_SETFONT) + HFONT hFont = (HFONT)::SendMessage(GetSafeHwnd(), WM_GETFONT, 0, 0); + if (hFont) { + m_btnEnable.SendMessage(WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); + m_lblCert.SendMessage(WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); + m_editCert.SendMessage(WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); + m_btnCertBrowse.SendMessage(WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); + m_lblKey.SendMessage(WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); + m_editKey.SendMessage(WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); + m_btnKeyBrowse.SendMessage(WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); + m_btnOK.SendMessage(WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); + m_btnCancel.SendMessage(WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); + } + + // 回填é…�ç½® + int enabled = THIS_CFG.GetInt("tls", "Enabled", 0); + std::string cert = THIS_CFG.GetStr("tls", "CertPath", ""); + std::string key = THIS_CFG.GetStr("tls", "KeyPath", ""); + + m_btnEnable.SetCheck(enabled ? BST_CHECKED : BST_UNCHECKED); + m_editCert.SetWindowText(CString(cert.c_str())); + m_editKey.SetWindowText(CString(key.c_str())); + + LayoutControls(cli.Width(), cli.Height()); + return TRUE; +} + +void CTlsCertificateDlg::OnOK() +{ + CString sCert, sKey; + m_editCert.GetWindowText(sCert); + m_editKey.GetWindowText(sKey); + bool enabled = (m_btnEnable.GetCheck() == BST_CHECKED); + + std::string cert = CT2A(sCert); + std::string key = CT2A(sKey); + + // 校验:å�¯ç”¨åŠ å¯†æ—¶å¿…é¡»å¡«å†™è¯�书/ç§�钥路径 + if (enabled && cert.empty()) { + MessageBoxL("请填写è¯�书路径", "æ��示", MB_ICONWARNING); + return; + } + if (enabled && key.empty()) { + MessageBoxL("请填写ç§�钥路径", "æ��示", MB_ICONWARNING); + return; + } + + // è�½ç›˜ [tls] 三键 + THIS_CFG.SetInt("tls", "Enabled", enabled ? 1 : 0); + THIS_CFG.SetStr("tls", "CertPath", cert); + THIS_CFG.SetStr("tls", "KeyPath", key); + + // 热é‡�载身份(设计文档 §7.1):开关与è¯�书/ç§�钥路径对新建连接å�³æ—¶ç”Ÿæ•ˆã€‚ + // 已知窄竞æ€�:Load 内部 FreeIdentity 与「已å�– Cred 副本ã€�尚在æ�¡æ‰‹ã€�的连接存在竞æ€�, + // 未æ�¥çƒ­åˆ‡æ�¢éœ€å¼•用计数 + 惰性释放(è§� ServerTlsSession.cpp FreeIdentity 注释),本次ä¸�å�šã€‚ + ServerTlsIdentity::Load(THIS_CFG); + + if (ServerTlsIdentity::IsLoadError()) { + MessageBoxL("è¯�书/ç§�钥加载失败,加密功能未生效。请检查文件路径与格å¼�(è¯�书 PEMã€�ç§�é’¥ PKCS#8)。", + "æ��示", MB_ICONWARNING); + } else { + MessageBox(_TR("TLS é…�置已ä¿�存。") + _T("\r\n") + + _TR("改动对新建连接å�³æ—¶ç”Ÿæ•ˆã€‚"), + _TR("æ��示"), MB_ICONINFORMATION); + } + + CDialog::OnOK(); +} + +void CTlsCertificateDlg::OnBrowseCert() +{ + CFileDialog dlg(TRUE, _T("crt"), nullptr, + OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, + _T("Certificate Files (*.crt;*.pem;*.cer;*.cert)|*.crt;*.pem;*.cer;*.cert|All Files (*.*)|*.*||"), + this); + dlg.m_ofn.lpstrTitle = _T("Select Certificate"); + + if (dlg.DoModal() == IDOK) { + m_editCert.SetWindowText(dlg.GetPathName()); + } +} + +void CTlsCertificateDlg::OnBrowseKey() +{ + CFileDialog dlg(TRUE, _T("key"), nullptr, + OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, + _T("Key Files (*.key;*.pem)|*.key;*.pem|All Files (*.*)|*.*||"), + this); + dlg.m_ofn.lpstrTitle = _T("Select Private Key"); + + if (dlg.DoModal() == IDOK) { + m_editKey.SetWindowText(dlg.GetPathName()); + } +} + +void CTlsCertificateDlg::LayoutControls(int cx, int cy) +{ + const int margin = 14; + const int labelW = 72; + const int rowH = 24; + const int gap = 10; + const int browseW = 64; + const int btnW = 88; + const int btnH = 26; + + int y = margin; + m_btnEnable.MoveWindow(margin, y, cx - margin * 2, 22); + y += 30; + + int editW = cx - margin * 2 - labelW - browseW - gap; + + m_lblCert.MoveWindow(margin, y, labelW, rowH); + m_editCert.MoveWindow(margin + labelW, y - 2, editW, rowH); + m_btnCertBrowse.MoveWindow(cx - margin - browseW, y - 2, browseW, rowH); + y += rowH + gap; + + m_lblKey.MoveWindow(margin, y, labelW, rowH); + m_editKey.MoveWindow(margin + labelW, y - 2, editW, rowH); + m_btnKeyBrowse.MoveWindow(cx - margin - browseW, y - 2, browseW, rowH); + y += rowH + gap; + + // 确定 / å�–消按钮紧éš�ç§�钥路径下方 + m_btnCancel.MoveWindow(cx - margin - btnW, y, btnW, btnH); + m_btnOK.MoveWindow(cx - margin - btnW * 2 - gap, y, btnW, btnH); + y += btnH + margin; + + // 收缩对è¯�框到内容实际高度并é‡�新居中,消除底部空白。 + if (y < cy) { + CRect wnd; + GetWindowRect(&wnd); + SetWindowPos(NULL, 0, 0, wnd.Width(), y + (wnd.Height() - cy), + SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); + CenterWindow(); + } +} diff --git a/server/2015Remote/TlsCertificateDlg.h b/server/2015Remote/TlsCertificateDlg.h new file mode 100644 index 0000000..895b0d1 --- /dev/null +++ b/server/2015Remote/TlsCertificateDlg.h @@ -0,0 +1,43 @@ +#pragma once + +#include +#include +#include + +// 「TLSè¯�书ã€�é…�置对è¯�框:å�¯ç”¨æœ�务端å�•å�‘ TLS 加密 + 指定è¯�书/ç§�钥路径。 +// å›  2015Remote.rc 为 UTF-16 ç¼–ç �ã€�ä¸�宜手工编辑,å�‚ç…§ CMcpSettingsDlg 用 +// InitModalIndirect + 内存 DLGTEMPLATE 程åº�化创建(è§� docs/TransportTLS_MFCServer_Design.md §7.1)。 +class CTlsCertificateDlg : public CDialog +{ +public: + explicit CTlsCertificateDlg(CWnd* parent = nullptr); + + virtual INT_PTR DoModal(); + +protected: + virtual BOOL OnInitDialog(); + virtual void OnOK(); + + DECLARE_MESSAGE_MAP() + +private: + enum CtrlId { + IDC_TLS_ENABLE = 2001, // 「å�¯ç”¨åР坆ã€�å¤�选框 + IDC_TLS_CERT = 2002, // è¯�书路径编辑框 + IDC_TLS_CERT_BROWSE = 2003, // è¯�书路径「æµ�览...ã€�按钮 + IDC_TLS_KEY = 2004, // ç§�钥路径编辑框 + IDC_TLS_KEY_BROWSE = 2005, // ç§�钥路径「æµ�览...ã€�按钮 + }; + + CButton m_btnEnable; + CStatic m_lblCert, m_lblKey; + CEdit m_editCert, m_editKey; + CButton m_btnCertBrowse, m_btnKeyBrowse; + CButton m_btnOK, m_btnCancel; + + std::vector m_Template; // 内存 DLGTEMPLATE 字节 + + void LayoutControls(int cx, int cy); + void OnBrowseCert(); + void OnBrowseKey(); +}; diff --git a/server/2015Remote/UIBranding.h b/server/2015Remote/UIBranding.h index 250a875..8748b69 100644 --- a/server/2015Remote/UIBranding.h +++ b/server/2015Remote/UIBranding.h @@ -172,6 +172,7 @@ #define HIDE_MENU_PLUGIN_REQUEST 0 // æ�’件请求 #define HIDE_MENU_FRPS_FOR_SUB 0 // 下级FRP #define HIDE_MENU_MCP_SETTINGS 0 // MCP设置 +#define HIDE_MENU_TLS_CERTIFICATE 0 // TLSè¯�书 // --- 扩展è�œå�• - 语言å­�è�œå�• --- #define HIDE_MENU_CHANGE_LANG 0 // 更改语言 diff --git a/server/2015Remote/lang/de_DE.ini b/server/2015Remote/lang/de_DE.ini index f208c71..1a21fe8 100644 --- a/server/2015Remote/lang/de_DE.ini +++ b/server/2015Remote/lang/de_DE.ini @@ -2069,3 +2069,15 @@ JPEG %s ¡¤ Ô¼ %.2f MB/s=%s ¡¤ ca. %.2f MB/s %s ¡¤ ²»ÊÜÏÞËÙ£¨ÊÜÍøÂç´ø¿íÔ¼Êø£©=%s ¡¤ Unbegrenzt (durch Netzwerkbandbreite begrenzt) Îļþ´«ÊäËÙ¶ÈÒѱ£´æ¡£ÉÏ´«ËÙ¶ÈÖØÆôÖ÷¿Ø¶ËºóÉúЧ£»ÏÂÔØËÙ¶ÈÒÑÍÆË͵½ÔÚÏ߿ͻ§¶Ë£¬ÐÂÁ¬½ÓµÄÖ÷»úÒ²»á×Ô¶¯»ñÈ¡¡£=Uebertragungsgeschwindigkeit gespeichert. Upload-Geschwindigkeit wird nach Neustart des Masters wirksam; Download-Geschwindigkeit wurde an Online-Clients gesendet, neu verbundene Hosts erhalten sie automatisch. + +; ===== TLS ===== +TLSÖ¤Êé(&T)...=TLS-Zertifikat(&T)... +TLSÖ¤Êé=TLS-Zertifikat +ÆôÓüÓÃÜ=Verschluesselung aktivieren +Ö¤Êé·¾¶=Zertifikatspfad +˽Կ·¾¶=Pfad zum privaten Schluessel +ÇëÌîд֤Êé·¾¶=Bitte Zertifikatspfad angeben +ÇëÌîд˽Կ·¾¶=Bitte Pfad zum privaten Schluessel angeben +TLS ÅäÖÃÒѱ£´æ¡£=TLS-Einstellungen gespeichert. +¸Ä¶¯¶Ôн¨Á¬½Ó¼´Ê±ÉúЧ¡£=Aenderungen gelten sofort fuer neue Verbindungen. +Ö¤Êé/˽Կ¼ÓÔØÊ§°Ü£¬¼ÓÃܹ¦ÄÜδÉúЧ¡£Çë¼ì²éÎļþ·¾¶Óë¸ñʽ£¨Ö¤Êé PEM¡¢Ë½Ô¿ PKCS#8£©¡£=Zertifikat/privater Schluessel konnte nicht geladen werden; Verschluesselung ist inaktiv. Bitte Pfad und Format pruefen (PEM-Zertifikat, PKCS#8-Schluessel). diff --git a/server/2015Remote/lang/en_US.ini b/server/2015Remote/lang/en_US.ini index 402da00..036c5c0 100644 --- a/server/2015Remote/lang/en_US.ini +++ b/server/2015Remote/lang/en_US.ini @@ -2084,3 +2084,15 @@ JPEG Á¬½ÓÊý:%d=Connections: %d Ç¿ÖÆ¶Ï¿ª=Force Disconnect Ô¶³Ì½»Ì¸=Talk + +; ===== TLS ===== +TLSÖ¤Êé(&T)...=TLS Certificate(&T)... +TLSÖ¤Êé=TLS Certificate +ÆôÓüÓÃÜ=Enable Encryption +Ö¤Êé·¾¶=Certificate Path +˽Կ·¾¶=Private Key Path +ÇëÌîд֤Êé·¾¶=Please specify the certificate path +ÇëÌîд˽Կ·¾¶=Please specify the private key path +TLS ÅäÖÃÒѱ£´æ¡£=TLS settings saved. +¸Ä¶¯¶Ôн¨Á¬½Ó¼´Ê±ÉúЧ¡£=Changes take effect immediately for new connections. +Ö¤Êé/˽Կ¼ÓÔØÊ§°Ü£¬¼ÓÃܹ¦ÄÜδÉúЧ¡£Çë¼ì²éÎļþ·¾¶Óë¸ñʽ£¨Ö¤Êé PEM¡¢Ë½Ô¿ PKCS#8£©¡£=Failed to load certificate/private key; encryption is not active. Check the file path and format (PEM certificate, PKCS#8 private key). diff --git a/server/2015Remote/lang/zh_TW.ini b/server/2015Remote/lang/zh_TW.ini index 32cd1fd..4b91698 100644 --- a/server/2015Remote/lang/zh_TW.ini +++ b/server/2015Remote/lang/zh_TW.ini @@ -2075,3 +2075,15 @@ JPEG Á¬½ÓÊý:%d=ßB¾€”µ:%d Ç¿ÖÆ¶Ï¿ª=�ŠÖÆÖДà Ô¶³Ì½»Ì¸=ßh³Ì½»Õ„ + +; ===== TLS ===== +TLSÖ¤Êé(&T)...=TLS ‘{×C(&T)... +TLSÖ¤Êé=TLS ‘{×C +ÆôÓüÓÃÜ=†¢ÓüÓÃÜ +Ö¤Êé·¾¶=‘{×C·�½ +˽Կ·¾¶=˽è€Â·�½ +ÇëÌîд֤Êé·¾¶=ÕˆÌ‘{×C·�½ +ÇëÌîд˽Կ·¾¶=ÕˆÌ˽è€Â·�½ +TLS ÅäÖÃÒѱ£´æ¡£=TLS ÔO¶¨Òу¦´æ¡£ +¸Ä¶¯¶Ôн¨Á¬½Ó¼´Ê±ÉúЧ¡£=׃¸üŒ¦ÐÂßB¾€¼´•rÉúЧ¡£ +Ö¤Êé/˽Կ¼ÓÔØÊ§°Ü£¬¼ÓÃܹ¦ÄÜδÉúЧ¡£Çë¼ì²éÎļþ·¾¶Óë¸ñʽ£¨Ö¤Êé PEM¡¢Ë½Ô¿ PKCS#8£©¡£=‘{×C/˽è€ÝdÈëʧ”¡£¬¼ÓÃܹ¦ÄÜδÉúЧ¡£Õˆ™z²é™n°¸Â·�½Åc¸ñʽ£¨‘{×C PEM¡¢Ë½è€ PKCS#8£©¡£ diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index 205ec5a..fef77a8 100644 --- a/server/2015Remote/resource.h +++ b/server/2015Remote/resource.h @@ -1011,6 +1011,7 @@ #define ID_WEB_REMOTE_CONTROL 33044 #define ID_TOOL_PLUGIN_SETTINGS 33045 #define ID_MCP_SETTINGS 33077 +#define ID_TLS_CERTIFICATE 33093 #define ID_CONNECTION_MANAGE 33086 #define ID_CONNECTION_KILL 33087 #define ID_CONNECTION_REFRESH 33088 @@ -1115,7 +1116,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 410 -#define _APS_NEXT_COMMAND_VALUE 33093 +#define _APS_NEXT_COMMAND_VALUE 33094 #define _APS_NEXT_CONTROL_VALUE 2620 #define _APS_NEXT_SYMED_VALUE 105 #endif