我正在为自己的娱乐写一个小的ftp项目,假设能做4件事:
我正在使用标准库1和2编写我的程序in plain C(unix,在这种情况下并不重要),使用libssh2 for 3和4以及OpenSSL for 2和4。
我能够1-3工作,但不能4.这就是我所在的地方:
类似的东西:
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.我被卡住,因为我(试图保持简单)需要以某种方式将此频道转换为套接字。所以我看到它的方式有两个选择:
或
理想情况下,我会选择2,因为这个原因:由于我的项目是用C语言编写的,因此在执行其他代码时保持套接字读/写会比我更喜欢复杂一点。
然而,b。提出了一个问题:我担心握手会如何运作;特别是我担心我最终会与localhost握手,而不是与remotehost握手。
总结一下我的问题:我可以通过渠道读取/写入SSL(在它周围放一个包装),这样4的流程就变成了:纯文本 - > SSL(明文) - >通过ssh - >从ssh主机向目标主机发送SSL(纯文本)?
这有点长,但我希望这是可以理解的。如果没有,请告诉我,我会澄清。从谷歌搜索/搜索stackoverflow似乎是我和一个与mysql一起工作的人有同样的问题和有限的答案。
非常感谢任何输入!
答案 0 :(得分:2)
是的,选项2是正确的方法。使用BIO_make_bio_pair()
创建BIO对,并使用SSL_set_bio()
将其分配给SSL对象。
然后使用BIO_read()
读取加密端SSL数据并将其写入libssh隧道,并从libssh隧道读取并使用BIO_write()
写入。
<强>附录:强>
当您使用此方法时,您的SSL对象没有自己的文件描述符 - BIO替换文件描述符/套接字。 OpenSSL不是从文件描述符读取和写入,而是从您提供的BIO读取和写入。
BIO只是位于OpenSSL库和您自己的代码之间的接口。它们是您实现加密端SSL数据与另一端(而不是直接使用套接字的OpenSSL)的实际传输方式。
当您在BIO_read()
wbio
上提供的BIO上SSL_set_bio()
时,您将读取加密端SSL数据,然后您必须将其发送给其他人站在自己身边(大概使用一些libssh2
功能)。同样,当您从另一方(再次,从某些libssh2
函数)接收加密端SSL数据时,您使用BIO_write()
在您提供的BIO rbio
上将其泵入SSL }。
也许这个插图会有所帮助。当您从SSL对象读取和写入时,OpenSSL将只是从底层BIO读取和写入,将数据留在那里供您稍后处理:
+------+ +-----+ +-----+
| Your | SSL_write() | SSL | BIO_read() | BIO |
| code | ------------> | | <------------ | |
| | | | | |
| | | | BIO_write() | |
| | | | ------------> | |
+------+ +-----+ +-----+
+------+ +-----+ +-----+
| Your | SSL_read() | SSL | BIO_read() | BIO |
| code | <----------- | | <------------ | |
| | | | | |
| | | | BIO_write() | |
| | | | ------------> | |
+------+ +-----+ +-----+
(但请注意,SSL_write()
可能导致基础BIO的读取,反之亦然。)
如果wbio
中有数据,您必须阅读并将其发送到另一方:
+------+ +-----+
| Your | BIO_read() | BIO |
| code | <----------- | |
| | +-----+
| | +---------+
| | libssh2_channel_write() | libssh2 |
| | ------------------------> | | -> (... to other side)
| | +---------+
+------+
相反,当有另一方提供的数据时,您应该阅读并将其传递到rbio
:
+------+
| Your | +---------+
| code | libssh2_channel_read() | libssh2 |
| | <----------------------- | | -> (... from other side)
| | +---------+
| | +-----+
| | BIO_write() | BIO |
| | -----------> | |
| | +-----+
+------+