6

我正在实现一个支持 EAP(PEAP) 身份验证的RADIUS服务器。RADIUS 依赖于 UDP,每个数据包将包含一个带有身份验证数据的 EAP 消息。为简化起见,每个 EAP (PEAP) 消息都包含 TLS 数据包,因此客户端首先将发送一个包含 TLS 客户端握手的 EAP 数据包,服务器将处理该数据包,然后返回 TLS 服务器握手,以此类推,并带有以下包。

我已经能够通过 TCP 实现一个简单的 TLS 服务器,但我需要的是直接在 SSL 连接中写入 TLS 字节。

SSLConn_init_thread();
SSL_load_error_strings();
ERR_load_crypto_strings();
SSL_library_init();

SSL_CTX *ctx;
...
ctx = SSL_CTX_new(SSLv23_server_method());
SSL_CTX_use_PrivateKey(...);
SSL_CTX_use_certificate(...);

ssl = SSL_new(ctx); // I want to read/write TLS packets directly with this object

我查看了 OpenSSL文档,但没有很好的文档记录。在指南中说,可以使用 SSL_read 和 SSL_write “手动”进行握手SSL_set_accept_state(),但我不明白该怎么做。

任何与此有关的建议或关于在不依赖 TCP 的情况下处理 OpenSSL 连接的建议将不胜感激。

4

2 回答 2

5

我最终阅读了《使用 OpenSSL 进行网络安全》一书,发现内存 BIO正是我所需要的。

OpenSSL 的网络安全

内存 BIO 将内存段视为文件或套接字,可以通过使用 BIO_s_mem 创建一个适合与 BIO_new 和 BIO_set 一起使用的 BIO_METHOD 对象

BIO_s_mem()

BIO_s_mem() 返回内存 BIO 方法函数。

内存 BIO 是使用内存进行 I/O 的源/接收器 BIO。写入内存 BIO 的数据存储在 BUF_MEM 结构中,该结构被适当扩展以容纳存储的数据。

任何写入内存 BIO 的数据都可以通过读取来调用。除非内存 BIO 是只读的,否则从中读取的任何数据都会从 BIO 中删除。

基本上,您可以使用内存 BIO 将加密数据直接读/写到 SSL 连接:

// setup SSL_context...
ssl = SSL_new(ctx);

// Create read/write BIOs 
rbio = BIO_new(BIO_s_mem());
wbio = BIO_new(BIO_s_mem());

SSL_set_bio(ssl, rbio, wbio);

if (/* Server */) {
  SSL_set_accept_state(ssl); 
} else {
  SSL_set_connect_state(ssl);
}

要从BIO写入/读取

BIO_read(wbio, buffer, strlen(buffer));
BIO_write(wbio, buffer, strlen(buffer));
于 2014-04-18T15:59:14.323 回答
5

在 ascii 图术语中,这就是字节流循环的样子。SSL_read/SSL_write 用于将未加密的字节传入/传出 SSL 对象,BIO_read/BIO_write 用于获取相应的加密字节传入/传出 SSL 对象。然后由您决定通过网络连接传输加密字节。

非阻塞套接字 / SSL 的 Git hub 示例

https://gist.github.com/darrenjs/4645f115d10aa4b5cebf57483ec82eca

  +------+                                    +-----+
  |......|--> read(fd) --> BIO_write(rbio) -->|.....|--> SSL_read(ssl)  --> IN
  |......|                                    |.....|
  |.sock.|                                    |.SSL.|
  |......|                                    |.....|
  |......|<-- write(fd) <-- BIO_read(wbio) <--|.....|<-- SSL_write(ssl) <-- OUT
  +------+                                    +-----+
          |                                  |       |                     |
          |<-------------------------------->|       |<------------------->|
          |         encrypted bytes          |       |  unencrypted bytes  |
于 2017-03-24T06:44:12.803 回答