【发布时间】:2011-03-05 10:26:15
【问题描述】:
我正在编写一个小型 ftp 项目以供自己消遣,假设它能够做 4 件事:
- 直接连接到 ftp
- 使用 SSL(包装器)直接连接到 ftp
- 通过 ssh 隧道连接到 ftp
- 通过 ssh 隧道连接到使用 SSL 的 ftp。
我正在用普通 C(unix,在这种情况下并不重要)编写我的程序,使用标准库作为 1 和 2,使用 libssh2 作为 3 和 4,除了 OpenSSL 用于 2 和 4。
我可以让 1-3 个工作,但不是 4 个。这就是我所在的位置:
- 通过打开一个到 host:port 的套接字、连接、从套接字写入/读取来完成。
- 通过打开一个到主机的套接字来完成:端口、连接、写入“AUTH SSL”、使用来自先前套接字的 BIO 启动一个 SSL 对象 -> SSL_connect()、SSL_read()、SSL_write()。
- 通过在目标和本地主机之间打开一个隧道来完成(虽然我不确定我在我的 approac 中使用本地主机绑定来做什么:)
类似:
test_ssh_channel = libssh2_channel_direct_tcpip_ex(test_ssh_session, "100.100.100.100", 21, "127.0.0.1", 21);
然后我写入/读取该通道 (libssh2_channel_read()) - 在我看来,它提供了以下流程: 纯文本 -> 通过 ssh 发送 -> 将纯文本从 ssh 主机传送到目标。 出于 3. 的目的,这很好并且可以完成工作。
现在,对于 4。我被卡住了,因为我(试图保持简单)需要以某种方式将此通道变成一个套接字。所以在我看来,我有两个选择:
- 一个。制作一个伪套接字和每个 我需要读/写的时候,我 从通道读/写, 将其发送/检索到套接字中, 并让 SSL_connect(pseudo_socket) 与我的伪套接字通信, 每次接受什么 ssl_write 发送,将其发送到 频道,反之亦然。
或
- 乙。设置一个 BIO 缓冲区(有 比我能做的更多的 BIO 功能 把我的头包起来;这 文档还没有完全 有帮助)并以某种方式读/写 那个。
理想情况下,我会选择 2,原因是:由于我的项目是用 C 编写的,因此在执行其他代码时维护一个套接字读/写将变得比我希望的要复杂一些。
但是,b。给出一个问题:我担心握手会如何工作;特别是我担心我最终会与 localhost 而不是 remotehost 握手。
总结我的问题:我可以通过通道在 SSL 中读/写(在其周围放置一个包装器),以便 4. 的流程变为:纯文本 -> SSL(plaintext) ->通过 ssh -> 将 SSL(明文)从 ssh 主机传递到目标主机?
有点长,但我希望它是可以理解的。如果没有,请告诉我,我会澄清的。从谷歌搜索/搜索 stackoverflow 看来,似乎是我和一个使用 mysql 的人遇到了同样的问题,而且答案有限。
非常感谢任何输入!
- 詹姆斯
【问题讨论】: