简介Delphi 13.1 可用的 Devart SecureBridge v11.0.1 Professional 组件库安装包支持常见 SSH/SSL 协议与安全套件面向 Delphi 与 CBuilder 开发者用于在桌面、移动、Web 和数据库应用中快速集成加密通信、身份验证与授权机制解决数据传输安全和未授权访问等网络防护问题。包体约 2.86MB 的 7z 压缩包共 938 个文件主要包含 153 个 pas 源码文件、123 个 inc 包含文件、110 个 res 资源文件以及 dpk/dproj/cfg 等工程与编译配置bmp/dfm 界面资源bat 构建脚本和 Demos 示例工程另有 16 个 dpr 项目文件、13 个 key 密钥示例和若干 html、chm 说明文档便于按源码、示例、库文件等类别查阅。已有 32 人学习浏览。压缩包内提供 Readme 与 History 更新记录、图形化安装指引、License 许可协议以及 Source、Demos、Include、Lib 等完整目录开发者不仅能直接安装运行还能通过演示项目快速掌握 SSH/SSL 的调用流程阅读源码调整加密策略适合需要强化网络通信安全能力的中高级 Delphi 开发者。1. Delphi 13.1 配 SecureBridge v11.0.1 Professional这套加密控件到底管什么用做 Delphi 13.1 桌面应用的人迟早会撞上 SecureBridge 这类加密通信控件。Devart SecureBridge v11.0.1 Professional 是一个在 IDE 里直接拖拽使用的 SSH/SFTP/SSL 组件包解决的是很多传统 Delphi 项目绕不开的痛点远程服务器要传文件、要执行命令、要连内网数据库但不想再裸写 Socket也不愿意为一个 SFTP 功能去移植一整套 OpenSSL。凡是维护过存量系统的开发都清楚应用功能本身不难难的往往是加密链路那部分——证书、密钥、协议协商全是黑匣子。SecureBridge 的价值就是把这条链路变成可视化组件适合两类人给既有 Delphi 应用补 SFTP/SSH 能力的维护者以及新项目里需要 SSH 隧道但不想在 Indy 和 OpenSSL 之间反复踩坑的人。2. 先看懂 SecureBridge 在协议栈里的位置SSH、SFTP、SSL 各自解决什么问题2.1 为什么不用 Indy 加 OpenSSL 裸写而要引入一整包控件Delphi 自带 IndyIndy 也支持 SSL常见做法是给 TIdFTP 挂一个 TIdSSLIOHandlerSocketOpenSSL再配合 ssleay32.dll 和 libeay32.dll 一起部署。但这么干有三个很现实的问题第一OpenSSL 版本升级后 DLL 接口经常变Indy 的封装跟不上时要么锁版本要么带病运行第二SFTP 和 SSH 不是 Indy 的强项TIdFTP 只支持 FTP 和 FTPS想走 SFTP 还得再找一套方案第三SSL 证书链校验、客户端证书、密钥管理等细节用 Indy 写出来是一大坨代码而且每台客户机都要处理 DLL 部署。SecureBridge 把这三件事收敛成组件TScSSHClient 管 SSH 连接和远程命令TScSFTPClient 管文件传输TScSSLClient 管 TLS 加密通道。传文件时不需要关心底层是 SSH-2 还是 TLS 1.3控件自己完成协商。Delphi 13.1 里装上 v11.0.1 Professional 后加密通道变成了设计期可配置、运行期可调试的对象出问题可以从事件日志里直接看协商过程而不是对着 Wireshark 猜。2.2 v11.0.1 的核心组件划分客户端、服务端、密钥工具组件面板安装好之后你会看到一组 TSc 开头的控件。我一般按用途把它们分成三组。客户端组TScSSHClient 是主入口负责建立 SSH-2 连接属性里有 HostName、Port、UserName、Password还有几个关键事件最常用的是 OnServerKeyValidate——服务器主机密钥校验这个事件建议每次都写。TScSFTPClient 不直接建连接它需要挂到一个已经连上的 TScSSHClient 上通过 SSH 通道跑 SFTP 协议这样只用一条 TCP 连接不容易被防火墙拦截。TScSSLClient 则是给那些不走 SSH 的场景用的比如访问 HTTPS 接口、TLS 加密的自定义协议。服务端组TScSSHServer 和 TScSFTPServer 可以在应用里内置一个 SSH/SFTP 服务端。典型场景是一个 Delphi 写的桌面程序给对端开一个临时 SFTP 口子收文件不用单独部署一台 OpenSSH 服务器。这个功能大多数项目用不到但真需要的时候能省一台机器。密钥工具组TScCryptographicKey 用来加载和管理 RSA/DSA/ECDSA 私钥和公钥TScMessageDigest 做哈希计算。这两个是辅助角色密钥认证、文件校验时会用到。这组组件之间不是平级的TScSFTPClient 依赖 TScSSHClientSSH 连接负责认证、加密、通道管理SFTP 只是通道里的一个子系统。搞清楚这条依赖链后面写代码才不会拧。2.3 和 Delphi 12 / C Builder 的兼容边界标题里是 Delphi 13.1 配 v11.0.1但很多项目是从老版本迁移过来的社区里还有人在问 securebridge for delphi xe10.3 rio 能不能直接用新版安装包或者 Delphi 12 上装的能不能无缝切到 13.1。这里有个关键点Devart 的控件一般会同时打多个 IDE 版本的包v11.0.1 的安装包里大概率带 Win32 和 Win64 两个平台的 DCU/BPL编译符号上会区分不同 Delphi 版本。你在 Delphi 13.1 里装就选对应 13.x 的那一组文件别拿 Delphi 12 的编译结果硬塞到 13.1 里——IDE 大版本升级后 RTL 内部接口有变化DCU 二进制不一定兼容。C Builder 用户如果要用 SecureBridge得确认装的是否包含对应 C Builder 的头文件生成。Devart 这类 Delphi 控件对 C Builder 通常只提供源码或 DCU设计期包BPL是 Delphi 格式C Builder 能加载但需要额外配置。我的建议是C Builder 项目里如果只是少量使用用 Delphi 写一个中间层 DLL 再给 C 调比直接在 C Builder 里折腾设计期组件省心。版本边界这里没有玄学核心就一句话安装目录里哪个文件夹的 CPU 架构和 IDE 版本跟你匹配就只用那一套混着拷必翻车。3. 把 v11.0.1 Professional 装进 Delphi 13.1解压、路径、编译三步走3.1 解压 .7z 后先确认目录结构别急着拖控件拿到的是一个 .7z 压缩包第一步是解压。Delphi 控件的发布包通常有固定的目录套路最上层是安装说明文件下面几个子目录分别放 Bin编译好的 DCU/BPL、Source控件源码、Demos示例工程。SecureBridge v11.0.1 Professional 这类包一般按 IDE 版本和 CPU 架构分子目录。解压时有两个习惯建议从一开始就养成。第一路径里不要带中文和空格统一放到 D:\DevComponents\SecureBridge避免编译时 IDE 解析路径出幺蛾子。第二先打开 Readme 或 Install 说明文件看那几行字里面通常会写明支持的最低 IDE 版本、要额外拷贝哪些运行期 DLL。这一步治好了我早年装完控件起不来、到处找原因的毛病。打开后你会发现 .7z 里可能包含源码目录。源码包的好处是出错能跟进去看但坏处是编译时间变长。如果你想追求稳定优先用编译好的 DCU想调试协议层再重新编译源码。3.2 把源码路径写进 Delphi 13.1 的 Library Path手动安装控件核心就两件事把控件源码目录挂到 IDE 搜索路径然后安装设计期包。先挂路径这一步不做后面编译代码时会报找不到 ScSSHClient.pas。具体操作分两步第一步在 Delphi 13.1 的 Tools Options Library Library Path 里分别针对 32-bit Windows 和 64-bit Windows 添加包内对应目录。第二步如果你拿到的是源码包还需要把 Source 目录也加进去。举例假设包解压在 D:\DevComponents\SecureBridge且目录结构里有 Win32\DCU 和 Win64\DCU那么在 32-bit 的 Library Path 里加 D:\DevComponents\SecureBridge\Win3264-bit 加 D:\DevComponents\SecureBridge\Win64。如果包内是统一源码目录加一个编译输出目录就把源码目录加进去。加完路径后做一次 IDE 缓存刷新Tools Options Library 页面底部有个 Update 按钮点一下让 IDE 重新扫描单元。这一步经常被漏掉漏掉会导致 IDE 一直用旧的搜索缓存控件装上后代码里明明写了 uses ScSSHClient 还是报找不到。3.3 安装设计期包并确认组件面板路径配好后开始装设计期包BPL。常见入口是 Component Install Packages或者直接双击包内的 .dpk 工程文件。双击 .dpk 后 Delphi 会打开 Package 编辑器先点 Compile 编译。如果编译报错检查两点一是 Library Path 是否漏了依赖目录二是当前活动平台是不是你要用的。编译通过后点 InstallIDE 会把包注册进组件面板你会在一个叫 Devart SecureBridge 或类似名称的页签下看到一批 TSc 开头组件。装完怎么验证新建一个空 VCL 项目拖一个 TScSSHClient 到窗体上看属性编辑器是否正常加载再建一个 TScSFTPClient看它的 SSHClient 属性下拉里能不能选到刚才那个实例。能选到说明相互依赖注册成功。注意 TScSFTPClient 和 TScSSHClient 之间的关联在设计期可见这一点比纯靠代码赋值直观很多也是很多人选择用控件而不是手写类的原因之一。这一套走完才算真正把 v11.0.1 Professional 变成了 Delphi 13.1 里一个可拖拽组件。多数安装失败都倒在这三步中间某一步高频坑在后面第 5 章细说。4. 最小可运行示例用 TScSFTPClient 上传文件用 TScSSHClient 跑命令4.1 SFTP 上传的完整代码与参数设置假设你已经有一台内网 Linux 服务器的临时账号密码现在要把本地一个部署包传上去。这是 SecureBridge 最高频的用法SFTP 上传。先在窗体上放好 TScSSHClient命名为 SSH和 TScSFTPClient命名为 SFTP在按钮事件里写procedure TForm1.BtnUploadClick(Sender: TObject); begin // 配置 SSH 连接参数 SSH.HostName : 192.168.10.20; SSH.Port : 22; SSH.UserName : deploy; SSH.Password : TempPass_2024; // 连接前先挂上主机密钥校验事件 SSH.OnServerKeyValidate : SSHServerKeyValidate; // 建立 SSH 连接 SSH.Connect; // 把 SFTP 客户端挂到已建立的 SSH 通道上 SFTP.SSHClient : SSH; SFTP.Connect; // 上传文件本地完整路径 远端完整路径 SFTP.Put(C:\release\app_update.zip, /home/deploy/release/app_update.zip); // Put 返回即表示传输完成这里读远端文件大小做确认 LogMemo.Lines.Add(上传完成远端大小 IntToStr(SFTP.GetFileSize(/home/deploy/release/app_update.zip))); end;逻辑说明步骤上先 SSH 后 SFTP。SSH.Connect 是真正建立 TCP 连接并完成认证SFTP.Connect 只是在已有 SSH 会话里打开一个 SFTP 子系统不产生新的 TCP 连接。这一点在防火墙环境里很重要——很多内网只开放 22 端口如果 SFTP 自己再连一个端口就废了。参数说明HostName 用 IP 或域名均可Port 默认 22 不用改。UserName 和 Password 是临时凭据要免密登录用密钥见第 6 章。OnServerKeyValidate 事件必须处理至少做到首次连接时提示用户确认指纹。忽略这个事件直接连等于放弃对服务器身份的验证中间人攻击时可被任意替换。Put 方法的第一个参数是本地文件路径第二个是远端完整路径不是目录。有些版本还支持传流适合从内存直接上传。4.2 SSH 远程执行命令与主机密钥校验传完文件后通常还要执行一条命令重启服务或解压文件。TScSSHClient 本身就能执行命令procedure TForm1.BtnCmdClick(Sender: TObject); var OutputText: string; begin if not SSH.Connected then SSH.Connect; // 执行远程命令命令执行完才会返回 SSH.Command : cd /home/deploy/release unzip -o app_update.zip systemctl restart app_service; SSH.Execute; // 命令的 stdout 和 stderr 会合并到 Output 属性 OutputText : SSH.Output; LogMemo.Lines.Add(OutputText); end;逻辑说明给 SSH.Command 赋值后调用 Execute控件会打开一个远程 shell 通道执行这条命令并等待退出。注意这个过程是同步阻塞的如果命令里有 sleep 或长任务UI 会卡住生产环境建议放到 TThread 里执行。主机密钥校验是 SecureBridge 里最不该省的一段代码。常见做法是在 OnServerKeyValidate 事件里读取指纹并和已知值比对procedure TForm1.SSHServerKeyValidate(Sender: TObject; AHost: string; APort: Integer; AFingerprint: string; var AValid: Boolean); begin // 首次连接时把 AFingerprint 记录下来 // 后续所有连接都拿它跟记录值比对 AValid : AFingerprint SavedFingerprint; if not AValid then LogMemo.Lines.Add(警告主机密钥指纹变化 AFingerprint); end;参数说明AFingerprint 是服务器主机密钥的哈希值格式类似 SSH-2 的 SHA256 指纹。SavedFingerprint 来自你的配置或首次连接时的提示。一旦服务器重装系统或换了密钥指纹会变这时所有客户端都会在这个事件里拿到 false。这个机制本身就是安全兜底别为了省事直接写 AValid : True。4.3 资源释放与异常处理SecureBridge 的运行期对象释放顺序有讲究先断开 SFTP再断开 SSH最后释放对象。反了会出现句柄残留或连接未释放的情况。procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin try if SFTP.Active then SFTP.Disconnect; finally if SSH.Connected then SSH.Disconnect; SFTP.Free; SSH.Free; end; end;逻辑说明SFTP.Disconnect 关闭的是 SSH 会话里的子系统通道SSH.Disconnect 才真正关闭 TCP。TScSSHClient 有 AutoDisconnect 属性设成 True 时对象释放会自动断连但我更习惯手动管理避免调试器里反复断点时连接被意外断开又自动重连的怪问题。异常处理方面连接失败通常抛 EScSSHClient 相关异常Message 里有具体描述认证失败、超时、密钥不匹配。建议在调用 Connect 的地方统一包一层 try/except把异常 Message 记录到日志。不要吞异常也不要在 except 里继续做文件操作因为此时连接状态不可靠黑匣子调试会很难受。5. SecureBridge 高频翻车点五条真实踩坑记录5.1 编译报找不到 ScSSHClient.pas但控件明明装了现象组件面板上能看到控件拖到窗体也正常一编译就报 EFileNotFound: ScSSHClient.pas 找不到。原因Delphi 里把控件拖到窗体是设计期行为IDE 已经从包里找到组件类但编译项目时链接器需要到 Library Path 里找单元文件.pas 或 .dcu。如果只装了设计期包没把源码/DCU 目录加进 Library Path编译就找不到单元。解决按 3.2 小节的步骤把包含 ScSSHClient.dcu 的目录分别加进 32-bit 和 64-bit 的 Library Path。路径里不要带中文和空格Delphi 某些版本解析带空格路径会失败。加完路径后点 Library 页面的 Update 刷新缓存再重新编译。5.2 运行时 SSL 证书校验失败OpenSSL DLL 被别的控件覆盖现象用 TScSSLClient 访问 HTTPS 接口开发机上正常打包到客户机后报证书链验证失败或者直接报 DLL 加载错误。原因SecureBridge 的 SSL 功能依赖 OpenSSL 的 DLL 文件。客户机上如果装了其他也用 OpenSSL 的程序比如某些旧版数据库驱动、其他加密控件两个程序往系统目录里各放各的 DLL版本冲突时谁后装谁生效SecureBridge 就翻车了。解决把 SecureBridge 需要的 OpenSSL DLL 放到 exe 同目录而不是系统目录并在程序启动时用 SetDllDirectory 指定加载路径或者干脆用静态链接版本。Devart 有些版本提供静态连接选项把 OpenSSL 编进 BPL/exe代价是体积大一些但完全不依赖系统 DLL。我一般优先静态链接省去大量部署层面的麻烦。做部署时列出程序会调用的所有 DLL 清单逐一核对版本。5.3 32 位项目好好的切 64 位就链接错误现象项目在 Win32 平台编译运行一切正常切到 Win64 后链接报找不到单元或无法解析的外部符号。原因在 32-bit 的 Library Path 里只加了 Win32 的 DCU 目录切到 64 位后 IDE 还是从同一个路径找 64 位需要的 DCU自然找不到。或者安装包时只编译了 32 位的 BPL64 位设计期包没装。解决用 Delphi 13.1 打开 Package 编辑器在项目管理器里把目标平台切到 64-bit Windows重新编译安装。同时确认 Library Path 里两个平台分别指向对应架构的目录。改完一定要做一次 Build而不是只 Compile否则 IDE 可能沿用旧缓存。5.4 SFTP 传大文件到一半断开现象小文件传得飞快2GB 以上的文件传到 60% 左右连接断开重连后继续传又断在差不多的位置。原因这类断连大部分不是 SecureBridge 的问题而是网络链路上的防火墙或 NAT 会话超时。SSH 连接如果长时间没有数据包中间设备的会话表会把连接清了。SecureBridge 有保活机制但默认可能没开或间隔太长。解决找 TScSSHClient 的保活相关属性设成 30 秒或 60 秒发一次空包让中间设备认为会话一直活跃。具体属性名在不同小版本略有差别常见的是 KeepAliveInterval 或 KeepAlive 开关加时间间隔。如果网络状况差还可以调大 SFTP 的传输超时。另外注意传大文件时不要用同步模式死等放到后台线程定期检测连接状态断了自动重连续传。5.5 连接慢或超时DNS 解析和超时参数的关系现象用域名连接时经常要等十几秒才报超时换 IP 立刻连接成功。原因TScSSHClient 没有独立设置 DNS 解析超时的属性整体超时由 ConnectTimeout 类参数控制。如果域名解析本身慢比如客户机 DNS 配置了不可达的服务器解析阻塞会吃掉整个超时预算。还有 IPv6 优先的情况尝试 AAAA 记录失败后才退回 IPv4白白多等几秒。解决内网机器直接用 IP。必须用域名的先在 hosts 里做静态映射验证是否 DNS 问题再把 ConnectTimeout 调长到 30 秒以上避免正常网络波动误报超时。如果确认是 IPv6 优先导致代码里可以先解析出 IPv4 地址再连接。这个问题表面像玄学实际是协议栈选择顺序的问题。6. 进阶用法私钥认证与连接复用以及如何确认流量真的加密了6.1 用 TScCryptographicKey 加载私钥做免密登录密码登录在批量部署场景里很别扭尤其服务器开了密码失败锁定策略后一次输错就是一堆麻烦。SecureBridge 支持密钥认证常见做法是用 TScCryptographicKey 加载 OpenSSH 格式私钥再挂到 TScSSHClient 上。核心代码框架如下var Key: TScCryptographicKey; begin Key : TScCryptographicKey.Create(nil); try Key.LoadFromFile(id_ed25519); // 私钥路径 SSH.KeyStorage.AddKey(Key); // 挂载到 SSH 客户端的密钥库 SSH.KeyStorage.SetKeyForUserName(deploy, Key.Fingerprint); SSH.UserName : deploy; SSH.Password : ; SSH.Connect; finally Key.Free; end; end;不同小版本里 KeyStorage 的方法名和参数格式可能有差异编译时以 v11.0.1 实际声明为准但流程是一致的加载私钥、关联到用户名、连接时用密钥认证。注意私钥文件权限Windows 上无所谓Linux 客户机上私钥权限必须是 600否则 OpenSSH 服务端直接拒绝。还有私钥如果有口令保护加载时需要在 LoadFromFile 的重载里传入口令别硬编码进代码。6.2 一个连接跑多次 SFTP 操作复用的正确姿势4.1 小节提到 SFTP 挂在 SSH 通道上。正确复用姿势是SSH 连接保持不动SFTP 客户端多次 Connect/Disconnect 不会重建底层 TCP只是重新打开 SFTP 子系统。批量传十几个文件时先连一次 SSH循环里反复用同一个 SFTP 实例全程只有一条 TCP 连接。前提是处理完把 SFTP 的 Active 状态归位避免下次 Connect 时报已经在通道里。我一般用一个方法封装「上传目录下所有文件」内部循环调用 Put最后统一 Disconnect比每个文件都重连 SSH 性能好得多。6.3 用抓包验证 SSH 协商过程确认没有走明文最后说一个我每换一套控件都会做的事抓包验证。Wireshark 抓 22 端口先看 TCP 三次握手然后看到 SSH 协议头的 banner 协商比如 SSH-2.0-OpenSSH 开头说明这条链路是加密通道而不是直接看到 FTP 的 USER/PASS 明文。SecureBridge 的调试日志会在连接细节里打印协商的算法套件比如密钥交换算法、加密算法是 aes128-ctr 还是 chacha20-poly1305。看到这些字段基本可以确认加密链路是活的。如果日志里出现明文密码字样先查是不是自己把 Password 属性打进日志里了——那种属于自毁式排错删掉就好。我现在的习惯是每个引入 SecureBridge 的项目都做三件事写一份密钥校验策略、把传输放到线程里并监控断连重试、首次联调时抓包留档。做到这三样SecureBridge 在 Delphi 13.1 里基本就不会再有黑匣子的感觉调试时也能有理有据地说话。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?