如何通过Visual Basic向使用自签名证书的安全FTP服务器上传文件
自签名证书FTP over SSL 上传相关问题解答
核心问题明确
- 自签名证书场景下,证书文件的合法获取渠道
- 自签名证书与
FtpWebRequest的正确配置方式 - PEM格式自签名证书的客户端、服务端交互逻辑
- 现有代码运行报错的原因排查
对应问题的解决方案
1. 自签名证书的获取渠道
自签名证书没有受公开CA的信任链路,不存在公开渠道可下载,需要主动从服务端侧获取:
- 对接企业内部FTPS服务时,直接向服务运维人员索要服务端用于TLS加密的PEM格式自签名证书文件即可,无需向第三方机构申请。
- 若未提前拿到证书,可通过临时允许证书校验的方式建立一次FTPS连接,将握手过程中服务端返回的证书导出保存为本地PEM文件。
2. 证书与FtpWebRequest的配置逻辑
- 注意核心概念区分:
request.ClientCertificates集合存储的是双向TLS场景下客户端出示给服务端的身份认证证书,并非用于信任服务端自签名证书的配置入口。原代码报错的核心原因就是混淆了两类证书的配置逻辑。 - 针对自签名服务端证书的信任配置,需要重写
ServerCertificateValidationCallback回调规则,将我们提前获取的服务端自签名证书加入信任列表,而非把服务端证书塞进客户端认证的证书集合。 - PEM格式证书的加载可直接通过
X509Certificate2.CreateFromPemFile()方法实现,无需额外做格式转换。
3. 服务端与客户端的证书交互逻辑
- FTPS协议的TLS握手阶段,服务端会默认向所有连接的客户端下发自身的证书,不存在需要客户端手动配置证书代替服务端下发的情况。
- 自签名证书的报错根源是系统内置的受信任CA列表没有对应根信任锚,客户端默认会抛出“证书链不受信任”的拦截报错,此时需要在客户端侧手动配置信任规则,而非修改服务端的证书下发流程。
修正后的可运行代码示例
' 加载本地保存的服务端自签名PEM证书 Dim trustedServerCert As X509Certificate2 = X509Certificate2.CreateFromPemFile("D:\certs\ftps_server.pem") Dim request As FtpWebRequest = WebRequest.Create(FTP_Address) request.Credentials = New NetworkCredential(FTP_Username, FTP_Password) ' 配置证书信任规则:仅信任我们提前获取的指定自签名证书,拒绝其他所有不受信任的证书 ServicePointManager.ServerCertificateValidationCallback = Function(sender, cert, chain, sslPolicyErrors) Dim currentCert = CType(cert, X509Certificate2) Return currentCert.RawData.SequenceEqual(trustedServerCert.RawData) End Function ' 仅在需要双向TLS客户端认证时,才向ClientCertificates集合添加对应的客户端证书 request.EnableSsl = True request.Method = WebRequestMethods.Ftp.UploadFile
报错说明

原代码报错本质:错误地将服务端自签名证书作为客户端认证证书添加到
ClientCertificates集合,且未配置自签名证书的信任回调规则,导致TLS握手阶段直接被系统的证书信任校验拦截。
内容的提问来源于stack exchange,提问作者Nathanael Swanson
相关产品推荐
相关产品推荐

