【问题标题】:libssh2 channel SSL BIO usagelibssh2 通道 SSL BIO 使用情况
【发布时间】:2011-03-05 10:26:15
【问题描述】:

我正在编写一个小型 ftp 项目以供自己消遣,假设它能够做 4 件事:

  1. 直接连接到 ftp
  2. 使用 SSL(包装器)直接连接到 ftp
  3. 通过 ssh 隧道连接到 ftp
  4. 通过 ssh 隧道连接到使用 SSL 的 ftp。

我正在用普通 C(unix,在这种情况下并不重要)编写我的程序,使用标准库作为 1 和 2,使用 libssh2 作为 3 和 4,除了 OpenSSL 用于 2 和 4。

我可以让 1-3 个工作,但不是 4 个。这就是我所在的位置:

  1. 通过打开一个到 host:port 的套接字、连接、从套接字写入/读取来完成。
  2. 通过打开一个到主机的套接字来完成:端口、连接、写入“AUTH SSL”、使用来自先前套接字的 BIO 启动一个 SSL 对象 -> SSL_connect()、SSL_read()、SSL_write()。
  3. 通过在目标和本地主机之间打开一个隧道来完成(虽然我不确定我在我的 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 的人遇到了同样的问题,而且答案有限。

非常感谢任何输入!

  • 詹姆斯

【问题讨论】:

    标签: c ssl openssl libssh


    【解决方案1】:

    是的,选项 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)。

    当您在作为wbioSSL_set_bio() 提供的 BIO 上执行 BIO_read() 时,您将读取加密端 SSL 数据,然后您必须自己将其发送到另一端(大概使用一些libssh2 函数)。同样,当您从另一端(同样,来自某些 libssh2 函数)接收加密端 SSL 数据时,您通过在作为 rbio 提供的 BIO 上使用 BIO_write() 将其泵入 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 |
    |      | -----------> |     |
    |      |              +-----+
    +------+
    

    【讨论】:

      猜你喜欢
      • 2017-05-06
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 2011-11-15
      • 2018-04-20
      • 2012-06-13
      相关资源
      最近更新 更多