
简介面向 Delphi 13.1 的 SecureBlackbox 2024 版v24.0.9390是一套安全控件库专为金融交易、医疗健康、政府机构等高安全需求的应用场景设计。它可在客户端与服务端快速实现 SSL/TLS 加密通信、SFTP/FTP/FTPS 文件传输及 SSH 安全壳集成并支持 S/MIME 消息创建解析、PKI 证书管理、SMTP/POP3/IMAP 加密访问以及 Kerberos、OAuth 等多种身份验证方式涵盖数字签名、加解密、哈希等基础安全能力。压缩包共 2000 个文件以 dproj 工程文件、pas 源码、dfm 窗体为主另有 bpl、dll、pfx、cer 等运行库和证书文件整体约 180.12MB目录结构清晰便于按模块检索目前已有 111 人学习下载。该版本修复了既往安全漏洞新增对 AES、RSA、ECDSA、ECDH 等加密算法的支持并附详尽文档与示例代码帮助开发者快速完成安全功能集成。借助封装好的组件无需深究底层加密机制即可在 Windows、Linux、macOS 等平台构建跨平台安全应用专注业务逻辑。1. SecureBlackbox 2024 是 Delphi 13.1 下最值得先装的安全通信控件包如果你在 RAD Studio 13.1 里写 Delphi 业务需要 SSL/TLS、SSH、SFTP、PGP 签名验签或 PDF 数字签名SecureBlackbox 2024 Delphi Edition v24.0.9390 就是一套完整覆盖这些场景的商用加密通信控件包。它在工作流里像个黑匣子接口封装到位业务代码很少直接碰底层 OpenSSL序列号交给证书管理器处理就行。我把它拿到手后先跑了一遍 SFTP 上传和 PDF 签名两个用例确实把原来要分别拼的若干底层库合并成了统一操作方式。适合做金融、医疗、车联网这类对传输链路要求高的 Delphi 开发者尤其是需要在客户端直连 SFTP 服务器或给电子合同盖签名章的项目。2. 解压与安装先把目录结构和 IDE 接入方式搞清楚2.1 解压后先核对目录别急着装包拿到手的是一个 rar 压缩包v24.0.9390 是 nSoftware 2024 年发布的构建版本配套的是 Delphi 13.1。用 WinRAR 或 7-Zip 解压后里面通常是这么几类目录我每次安装前会先照着核对一遍目录/文件作用检查要点Lib\Delphi13IDE 库路径源文件包含 .dcu/.dcp需要确认版本号与 RAD Studio 13.1 匹配Bin运行时 DLL发布给客户时需要随 EXE 一起分发Packages.bpl/.dcl 文件带 dcl 前缀的是设计期包不带的是运行期包Docs/Help帮助文档通常是 chm 或 html 格式SFTP/PDF 组件的参数说明在里面Demos各协议示例工程SSHClient、SFTPClient、PDFSigner 都有可直接编译的 Demo我在安装前习惯先看 Packages 目录下有没有 dcl 开头的 .bpl。带 dcl 前缀的是设计期包负责把组件注册到 IDE 的工具面板不带 dcl 的是运行期包。这两个类别都要处理否则会出现编译能过、但设计期拖不了控件的情况。另外注意Demos 目录里通常还带着各协议的示例源码这是比帮助文档更接地气的参考资料建议解压后单独留一份后面对参数有疑问时翻 Demo 比翻手册快。2.2 在 RAD Studio 13.1 里挂库路径和安装包打开 RAD Studio 13.1顺着 Tools Options Environment Options Delphi Options Library 进入库路径设置在 Library Path 里新增解压目录下的 Lib\Delphi13。这一步不能只加顶层目录SecureBlackbox 的单元按协议拆得比较碎建议把 Lib\Delphi13 下的所有子目录全部递归加进去。漏掉任何一个子目录编译时都会报 Unit not found: SBXXX 之类的错误排查起来很费时间。库路径确认之后还要处理设计期包。在 Project Options Packages 里分别点 Runtime Packages 和 Design Packages 的 Add 按钮选择 Packages 目录下对应的 .bpl。这里有个先后顺序问题先加运行期包再加设计期包。装完之后保存设置重启 IDE工具面板上就能看到一组 TEl 开头的组件包括 TElSFTPClient、TElHTTPSClient、TElPDFSigner 这些常用件。提示网上有些安装教程只让挂库路径、不装设计期包结果是编译能过、面板上却看不到组件。对这种组件数量大的包设计期包一定不能省。2.3 版本配套先做一次体检标题里的 v24.0.9390 是构建号Delphi 13.1 是 RAD Studio 的版本线两者必须匹配。如果拿 v24 的包往 Delphi 12 里硬塞大概率会撞上 dcu 版本不兼容的链接错误这种错误在 IDE 里提示得比较隐晦常常是 F2613 Unit XXX not found 这类信息实际原因是编译目标平台和包内置的平台不一致。头一次装完建议别直接写业务代码先在 Demos 里挑一个最简单的工程编译比如 SSHClient。确认整条工具链通了再继续下一件事检查当前工程的 Target Platforms。RAD Studio 13.1 默认的新工程是 Win32如果你业务要发布 Win64Library Path 里要同时存在 Lib\Delphi13\Win64 的 dcu 路径否则切到 Win64 编译时又是满屏的 Unit not found。SecureBlackbox 是区分平台重新编译 dcu 的这一点和源码安装类控件不同需要多留个心眼。版本匹配这块还有一个隐含坑IDE 里同时装了多个 Delphi 版本时工具面板可能被旧版本的包污染这时候需要在 Packages 列表里把不匹配的包项手动勾掉。3. 核心组件选型SSH、SFTP、PGP、PDF 签名该用哪几个单元3.1 按业务场景选组件别把整个包堆到界面层SecureBlackbox 不是单一控件它是一组按协议划分的组件集合。第一次接触的人容易犯的错是把所有 TEl 组件拖到同一个 Form 上回头发现 IDE 设计期渲染越来越慢。我一般按依赖关系组织代码证书类放一个基础单元网络传输类放另一个单元业务层只引用自己需要的接口。下面是按业务场景整理的选型表照着选基本不会错业务场景组件类名典型单元说明HTTPS 客户端请求TElHTTPSClientSBHTTPSClient可替代 Indy 的 IdHTTPTLS 握手细节封装得更好SSH 远程命令TElSSHClientSBSSHClient支持密码认证和公钥认证可执行远程 shell 命令SFTP 文件传输TElSFTPClientSBSFTPClient上传下载、目录列举、断线重连PGP 加解密TElPGPWriter / TElPGPReaderSBPGP邮件加密、文件加密都走这套PDF 数字签名TElPDFSignerSBPDFSigner电子合同、标书盖章场景XML 签名TElXMLSignerSBXMLSigner政务、税务系统对接常用证书管理TElCertificateStoreSBCertStore证书链校验、证书仓库加载证书解析TElX509CertificateSBCertificate解析 PEM/DER读取有效期、公钥、主题信息选型时还有一个原则能用高组件SFTP、HTTPS就不要直接用底层组件TElSSHChannel、TElTCPClient。SecureBlackbox 把很多协议细节都封装在高层组件里比如 SFTP 组件内部已经处理了 SSH 传输层的密钥交换你再手动去拼一层反而容易翻车。当然如果你做的是穿透内网的代理类工具需要自定义 TCP 隧道那就另说得回到 TElTCPClient 上做二次封装。3.2 许可证处理不注册能跑但有水印SecureBlackbox 是商业控件未注册状态下组件能工作但会在运行时弹试用提示。真实交付前必须处理许可证。常见做法是找 Demos 里的注册单元里面一般有一个 LicenseKey 常量或 TElLicManager 的初始化调用。把这个初始化放到主程序最前面在 Application.Initialize 之后、任何 TEl 组件被实例化之前执行否则可能出现奇怪的运行时异常。uses SBLicenseManager; procedure InitLicense; begin // 这个 key 替换成 nSoftware 官网购买后获取的授权码 TElLicManager.SetLicense(xxxxx-xxxxx-xxxxx-xxxxx); end;这段代码的逻辑很直白通过 TElLicManager 把授权码写入全局许可证服务后续所有 TEl 组件实例化时自动读取。参数说明就一个SetLicense 的字符串必须是完整授权码不能分段填写也不要带多余空格。如果公司买的是站点授权可能还需要额外设置用户名和公司名具体看授权邮件里的说明。不注册能不能用能但试用弹窗和签名水印会影响交付体验我见过有人带着水印上线被客户截图投诉的这种低级错误不值得踩。3.3 通用基础类证书和密钥的操作是地基TElX509Certificate 是整个包最常用的基础类解析 PEM/DER 证书、读取主题、有效期、公钥信息全靠在它上面做操作。TElCertificateStore 负责证书链的建立和验证在 SFTP、HTTPS、PDF 签名三个场景里都会用到。如果你要校验服务器身份先通过 TElX509Certificate 把服务器证书加载进来再调 TElCertificateStore 的 ValidateChain 方法拿到验证结果做二次业务判断。这两个类值得花半小时好好读一下 Demo后面所有组件和它们都有交集基础通了其他组件的参数就不会再看不懂。4. 写一个能交付的 SFTP 客户端连接、认证、传输与参数4.1 最小可用代码从连接开始第一次跑 SecureBlackbox 的 SFTP我只写了一个最小的连接用例。注意这个包不像 Indy 那样连上就算完它默认会校验证服务器指纹没写回调连接会被直接断开。uses SBSFTPClient, SBSecurityUtility, SBConstants; var Client: TElSFTPClient; begin Client : TElSFTPClient.Create(nil); try // 基本连接参数地址、端口、账号 Client.HostName : 192.168.1.100; Client.Port : 22; Client.Username : deploy; Client.Password : your-password; // 只使用密码认证不用公钥 Client.AuthMethods : [sfTUserPassword]; // 服务器身份回调不写这个回调会被默认拒绝 Client.OnServerAuthentication : AuthHandler; // 超时设置为 30 秒内网够用外网建议再放大 Client.Timeout : 30000; // 建立连接 Client.Connect; // 上传本地文件到远端目录 Client.UploadFile(C:\release\app.tar.gz, /home/deploy/release/app.tar.gz); // 断开并释放 Client.Disconnect; finally Client.Free; end; end;代码逻辑拆开看先是设置 SFTP 连接的四个基础参数HostName、Port、Username、Password这是最传统的密码登录方式。AuthMethods 限定用密码认证如果你不想让客户端尝试公钥登录这一步是必要的。然后挂上 OnServerAuthentication 回调这个回调是 SecureBlackbox 的强制安全检查机制服务器返回的指纹必须先经过业务代码确认否则默认拒绝连接。Timeout 是连接超时和传输超时的统一配置单位毫秒。Connect 完成后协议栈才真正进入可用状态上传走 UploadFile两个参数分别表示本地完整路径和远端绝对路径。4.2 服务器身份认证回调不写这个连不上第一次跑的时候我栽在这里debug 看到连接被拒日志里写着 Server authentication failed。原因是 SecureBlackbox 默认策略是不信任任何未确认的服务器指纹必须自己在回调里决定信任谁。procedure TMainForm.AuthHandler(Sender: TObject; const Server: TBytes); var Fingerprint: string; begin // 把服务器证书指纹计算成可读字符串 Fingerprint : TElSFTPClient(Sender).GetServerKeyFingerprint; // 与维护的已知指纹清单比对 if Fingerprint aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd then TElSFTPClient(Sender).AcceptServerAuthentication : True else TElSFTPClient(Sender).AcceptServerAuthentication : False; end;这个回调在 SSH 层握手完成后被触发Sender 就是当前的 TElSFTPClient 实例。Server 参数是服务器公钥的原始字节一般不直接看字节调用 GetServerKeyFingerprint 换算成十六进制字符串。逻辑上就是拿指纹和预设清单比对匹配就赋 True。实际项目里我会把合法指纹放到配置表里而不是硬编码在代码中这样可以做到不重新发版就能更换服务器证书。注意这里的属性名是 AcceptServerAuthentication新版文档里还有 AcceptAllServerAuthentication 的写法那是一个跳过所有校验的危险开关只在临时调试时用正式代码千万别开。4.3 参数与传输细节超时、缓冲区、多线程SFTP 组件在日常使用里需要关心的参数主要是这几个参数名典型值说明Timeout30000 毫秒覆盖连接、认证、传输各环节外网环境建议调到 60000ForceUtf8FileNamesTrue处理中文文件名时必须开否则服务器端存成乱码TransferMode默认二进制传文本文件想转换换行符时再改 ASCII 模式MaxPacketSize默认即可局域网可适当调大公网大包容易触发 MTU 问题关于中文文件名的坑我在 5.5 里还会专门讲这里先记住 ForceUtf8FileNames 这个参数。SecureBlackbox 系列组件还有一套通用日志机制通过 SBUtils 里的 TElLogger 可以把协议栈内部日志输出到文件连不上的时候看日志比猜快得多。多线程场景下有一个铁律每个线程必须创建自己的 TElSFTPClient 实例绝对不能在多个线程间共享同一个对象。SFTP 客户端的会话状态是从连接建立时就绑定的跨线程共享对象会出现偶发挂死而且这种问题特别难复现属于典型的玄学故障。我现在的多线程下载写法是线程内 Create、线程内 Free连接和认证都放在 Execute 里配合 Sleep 重连机制来做断线补偿。如果业务需要并发上传大量小文件建议按 CPU 核心数控制线程数量开太多线程会先把服务器连接数打满。5. 避坑SecureBlackbox 2024 安装与运行常见问题5.1 安装后 IDE 弹 Cannot load package ... 提示现象RAD Studio 13.1 打开时弹错误框提示无法加载某个 .bpl 设计期包IDE 工具面板里看不到 TEl 组件。原因两种常见情况一是安装包时 IDE 还开着bpl 文件被 IDE 进程占用导致写入不完整二是 Packages 目录里混着不同构建号的包dcl 包和运行时包版本对不上。解决先彻底关闭 RAD Studio检查 Packages 目录下所有 .bpl 的修改时间是否一致把零散的旧版本包清出去。然后重新打开 IDE在 Packages 对话框里用 Add 重新加载安装包携带的 dcl 包。如果弹框还是出现就检查一下系统 PATH 环境变量里 Bin 目录是否在最前面加载 bpl 依赖的 DLL 找不到也会报这个错。5.2 编译提示找不到 TElSFTPClient现象新建工程写代码uses 里加了 SBSFTPClient编译时 IDE 报 Unit not found: SBSFTPClient 或者 E2003 Undeclared identifier。原因Library Path 没有递归添加 Lib\Delphi13 下的全部子目录SecureBlackbox 按协议拆了多个物理目录少加一个目录就找不到对应单元。还有个隐蔽原因编译目标是 Win64但库路径里只有 Win32 的 dcu。解决回到 Tools Options Library 重新检查路径把 Lib\Delphi13\Win32 和 Lib\Delphi13\Win64 都加进去子目录也一并加干净。切到 Project Options Delphi Compiler Target Platforms 确认当前选中的是你要发布的位数然后 Build 一次。如果你同时装了 32 位和 64 位的包注意两边的 dcu 目录不能混用。5.3 发布 EXE 到干净机器报 DLL 丢失现象程序在开发机上跑得好好的拷到没装 RAD Studio 的客户机器上双击启动直接报缺少 sb*.dll 或 xxx.bpl 文件。原因SecureBlackbox 的运行期 DLL 没有随着 EXE 一起发布开发机能跑是因为 IDE 已经把这些路径写入系统环境了。解决把 Bin 目录下的 sb 开头的 DLL 全部拷贝到 EXE 同目录或者打包时把运行期包那几项从 Project Options Packages 里改成静态链接让编译产物不依赖外部 bpl。我建议正式交付用静态链接虽然 EXE 体积会涨几 MB但省去了给客户补 DLL 的麻烦。这个操作和所有商业 VCL 控件发布是一样的套路别等客户现场报错再处理。5.4 SFTP 服务器指纹校验总是不通过现象连接公司内网 SFTP 服务器时回调里比对指纹总是不相等连接被拒绝。日志显示服务器指纹和代码里硬编码的值不一样。原因服务器证书或主机密钥换过了代码里维护的指纹是旧值。还有一种情况是开发环境连的是测试服务器生产环境指纹本来就是另一套代码没做环境区分。解决在 AuthHandler 回调里先把实际的指纹输出到日志文件观察一轮拿到新指纹后同步到配置表。我在实际项目里会把指纹放到 ini 或数据库配置项里环境不同读不同的值避免测试环境和生产环境互相踩。另外提醒一句如果服务器做了负载均衡多台机器的主机密钥可能不一致这种情况下要用统一分发的密钥文件而不是每台各自生成。5.5 中文文件名上传乱码现象上传一个名为对账单_2024.xlsx的文件登录 SFTP 服务器查看文件名变成了一串下划线或问号。原因绝大多数 SFTP 服务器默认使用 UTF-8 编码解析文件名而 SecureBlackbox 早期版本或未配置状态下会按本地代码页去编码中文在 ISO-8859-1 这类编码下直接丢失。解决在连接建立之前设置 ForceUtf8FileNames 为 True。这个属性在 TElSFTPClient 里直接可用设置后组件内部所有文件名相关的编码都走 UTF-8 通道。还有一些服务器要求客户端主动发送 UTF-8 扩展请求SecureBlackbox 会在握手时自动带上这个扩展前提是 ForceUtf8FileNames 已经打开。凡是涉及中文文件名的业务这条必须在代码 Review 时检查到。6. 用证书链自检确认控件可用一张自签证书验证签名链路6.1 自签证书做签名验签装完控件包后我最怕的事情是看起来装了实际跑业务代码时才发现某条链路有问题。所以现在养成了一个习惯每次装完 SecureBlackbox强制走一遍签名验签流程用自签证书把整条链路跑通确认证书库、哈希算法、签名组件都正常工作再继续写业务代码。uses SBCertificate, SBCertStore, SBPublicKeyCrypto, SBConstants; procedure SelfTestSign; var Cert: TElX509Certificate; Store: TElCertificateStore; Signer: TElPublicKeyCryptographer; Input, Output: TBytes; begin // 1. 创建证书存储并加载自签证书 Store : TElCertificateStore.Create(nil); try Store.LoadFromFile(selfsigned.p12, password); Cert : TElX509Certificate.Create(nil); try Cert.LoadFromContainer(Store.Certificates[0].Handle, password); // 2. 用证书私钥对一段数据做 RSA SHA256 签名 Signer : TElPublicKeyCryptographer.Create(nil); try Signer.Key : Cert.Key; Signer.HashAlgorithm : haSHA256; Input : BytesOf(welcome to delphi secureblackbox); Output : Signer.Sign(Input); // 3. 验签返回 True 表示链路通畅 if not Signer.Verify(Input, Output) then raise Exception.Create(Signature verification failed); finally Signer.Free; end; finally Cert.Free; end; finally Store.Free; end; end;这段自检代码的逻辑是先从 p12 证书文件里加载证书和私钥再用 TElPublicKeyCryptographer 指定 SHA256 哈希算法对一段测试文本做 RSA 签名最后立刻验签。整个过程覆盖了证书容器解析、密钥读取、哈希组件调用、签名算法执行四个环节任何一个环节有问题都会在这里暴露。自检通过后我才开始写业务代码。从那以后我每次装完这类加密控件包都强制把这段自检跑一遍不通过就先排查环境而不是埋头写代码。这套习惯帮我躲过了好几次控件包与 IDE 版本不匹配的隐患希望帮到你。本文还有配套的精品资源点击获取