- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 zeromq 和 openssl 来编写我的服务器和客户端。
握手成功后,客户端再次向服务器发送消息时,服务器中的ssl_read()返回-1,ssl_get_erro()返回SSL_ERROR_SYSCALL,
当服务器再次收到消息时,这种情况会重复出现。我找不到原因。我需要 BIO_flush() 吗?我真的很感激你,即使只是给我一些灵感来解决这个问题。
好吧,我的程序太复杂了,无法显示。我被要求在 rpcz 中添加 ssl 以提高其安全性(我不知道 rpcz 是否流行到大多数人都知道。用我的话说,它结合了 zeromq、protobuf 和 rpc 来实现远程过程调用)。所以有很多代码片段,我认为将它们全部显示在这里不会有帮助。
我正在努力提供更多细节。
握手成功后,当服务器尝试解密它收到的数据时,使用这样的方法
`{
//.......
bio_write();
//.......
ssl_read();
}`
事实证明,bio_write() 已通过返回数据数成功将数据写入 bio,但 ssl_read() 始终返回 -1。所以我使用 ssl_get_error() 检查错误号,它返回 SSL_ERROR_SYSCALL,对于接收到的下一个数据,它返回 SSL_ERROR_WANT_READ。
希望有人能帮忙解释一下为什么ssl_read会返回这些代码?我认为如果 ssl 连接没有成功握手,ssl_write() 不会返回正数。所以问题可能不是 ssl 连接。
再次添加一些细节
void TLSZmq::ssl_decrypt()
{
//........
ERR_clear_error();
int rc = BIO_write(rbio,zmq_to_ssl->data(),zmq_to_ssl->size());
ERR_get_error();
check_ssl_err(rc); //written by myself
//.........
ERR_clear_error();
aread = SSL_read(ssl_,buffer,BUFFERSIZE);
ERR_get_error();
check_ssl_err(rc); //written by myself
//..........
}
void TLSZmq::check_ssl_err(int rc)
{
//...................
int err = SSL_get_error(ssl_, rc);
if (err == SSL_ERROR_NONE)
{
std::cout<<"SSL_ERROR_NONE:"<<SSL_ERROR_NONE<<std::endl;
}
else if (err == SSL_ERROR_WANT_READ )
{
std::cout<<"SSL_ERROR_WANT_READ:"<<SSL_ERROR_WANT_READ<<std::endl;
}
else if (SSL_ERROR_SYSCALL)
{
std::cout<<"SSL_ERROR_SYSCALL:"<<SSL_ERROR_SYSCALL<<std::endl;
}
//.....................
}
我不确定这是检查错误堆栈或其他东西的正确方法。当出现SSL_ERROR_SYSCALL时,ERR_get_error()返回一个奇怪的数字,如336130315,当出现SSL_ERROR_WANT_READ时,ERR_get_error()返回0。
呃……我们说的是 openssl 吧? rc获取openssl的BIO_write()函数的返回值。附言我使用 zeromq 套接字发送消息,我已经指出了这一点。我很困惑。通过或调用 perror() 获取 errno 是否有意义?
非常感谢您花时间阅读本文。
最佳答案
SSL连接不是可以独立使用的解密函数和加密函数。如果您想要 block 密码或流密码,您可以使用 OpenSSL 代码获得其中的一部分。但是您不能那样使用 SSL 本身。
可以使用 BIO 对允许 SSL 在 TCP 以外的传输层上运行。但是您必须复制 TCP 的语义——它很复杂,而且代码看起来与您上面的代码完全不同。 (例如,TCP 允许在任何时候向任一方向传输。您不能复制它。SSL 设计为在 TCP 之上分层,需要您复制它才能在其他传输上工作。)
如果你想要一个流密码,就用一个。
关于c++ - 使用 openssl 及其未阻塞的 bio,ssl_read 返回 SSL_ERROR_SYSCALL 和 SSL_ERROR_WANT_READ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29211061/
在进行 BIOS 开发时,我看到了对英特尔 BIOS 引用设计和英特尔固件支持包 (FSP) 的引用。英特尔是否积极支持两者,或者引用设计正在逐步淘汰以支持 FSP。 最佳答案 为了创建 FSP,引用
我知道有一些程序,比如 lojack 用于安装在 BIOS 上的笔记本电脑,但我仍然有点困惑。在阅读有关 lojack 的信息时,在我看来,在用户登录并尝试访问互联网之前,他们无法完全定位笔记本电脑的
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 8年前关闭。 Improve thi
我对 BIO 例程 BIO_read()/BIO_write() 和 SSL_read()/ 之间的区别感到困惑SSL_write() 当 BIO 是内存 BIO 而不是套接字 BIO 时。 我正在尝
我想知道什么样的序列号wmic bios get serialnumber Windows命令实际上给了你什么? 是你主板的序列号吗?文档对此不清楚。 最佳答案 wmic bios get seria
我正在尝试使用 OpenSSL 在 C++ 中创建一个简单的 FTP/FTPS 客户端实现。我已经设法使用 BIO API 与普通 FTP 一起工作。现在的问题是:一旦我有一个不安全的连接和 BIO
pe启动acpl bios error是一个非常简单解决的问题,一般都是主板不支持支持ACPI造成的,只要禁用一下就可以解决了,想要解决的用户可以来看看详细的内容。 pe启动acpl b
这里是代码的上下文: void THREAD_CC server_thread(void *arg) { BIO *client = (BIO *)arg; ... } 表达式
我正在使用 UEFI EDK2 创建 BIOS。我修改了 FDF 以将驱动程序(UEFI 和旧版本)从主固件卷移动到我严格创建的单独固件卷 (FV) 以保存驱动程序。 在我从主 FV 移动驱动程序之前
我们正在运行 32 位和 64 位的 windows xp pro service pack 3。我们正在使用 WMI 来获取 BIOS 制造商和型号,但我们确实更喜欢使用 Win32 API 或汇编
OpenSSL 中的 BIO 对到底是什么?它的用途是什么?我已经检查过 OpenSSL 文档,但任何细节都很少。 最佳答案 OpenSSL 中的 BIO 类似于文件句柄。您可以使用一对它们来安全地相
在此示例代码中: BIO *bio1 = BIO_new(BIO_s_mem()); BIO *bio2 = BIO_new(BIO_s_mem()); SSL_set_bio(ssl, bio1,
我试图将 QEMU 与我正在构建的内核 ISO 一起使用,但我无法运行测试。 我使用的是 Windows 10 64 位,并添加了 pc-bios如果这很重要,请将文件夹添加到 PATH。 到目前为止
我处于不幸的情况,我需要使用 BIOS 未在 ia32 功能控制 MSR 寄存器中启用的 CPU 功能。 BIOS 确实设置了锁定位,因此我无法自己设置该位。 BIOS (Asus UEFI BIOS
我升级了我的 mac 安装,Mountain Lion 10.8.4,但现在每次我尝试加载 Android AVD 时“Eclipse”都会出错。返回的错误是这样的: qemu: 无法加载 PC BI
下面是一些示例代码,展示了我如何使用 OpenSSL: BIO *CreateMemoryBIO() { if (BIO *bio = BIO_new(BIO_s_mem())) {
BIOS 是用汇编语言编写的,机器只能理解二进制文件。 BIOS 是系统启动时加载到内存中的第一个程序。什么编译BIOS生成二进制文件? 最佳答案 BIOS 工程师用 x86 汇编语言编写 BIOS,
使用 OpenGL VBO 时,您可以交错数据 例如,您甚至可以将顶点数据与供 CPU 而不是 GPU 使用的其他数据交错。 交错是有助于还是阻碍主流独立显卡和集成显卡的性能? 最佳答案 一般的答案是
我目前正在编写一个引导加载程序,旨在加载一个比引导扇区允许的时间更长的程序。但是,每次运行程序(我在Virtualbox和QEMU中都测试过),磁盘读取失败,磁盘重置也失败。 bootloader 被
我正在开发一个操作系统项目,使用 isolinux (syslinux 4.5) 作为引导加载程序,加载我的内核与组织在 0x200000 的多重引导头文件。 据我所知,内核已经处于 32 位保护模式
我是一名优秀的程序员,十分优秀!