OpenSSL的SSL/BIO_get_fd

只要是用到了OpenSSL,总会碰到让人心塞的事。
这次是SSL_get_fd。我用一种很简单的方式创建了一个SSL对象,直接在这个对象上进行SSL的accept:

bio = BIO_new(BIO_s_accept());
BIO_set_accept_port(bio, "1234");
BIO_do_accept(bio);
SSL_set_bio(ssl, bio, bio);
SSL_accept(ssl);

这样就不必折腾讨厌的sockaddr了。后来我想在和这个SSL对象关联的底层socket上执行setsockopt,想当然的使用了SSL_get_fd/BIO_get_fd这个非常自明的API。到此为止非常棒。接下来就不爽了,我发现setsockiot最终操作的那个描述符是listnen套接字,而不是accept返回的那个套接字。这似乎在API层面上十分合理,毕竟bio的参数就是一个BIO_s_accept,而和它关联的就是一个listen套接字。想要正确的得到accept返回的读写socket描述符,你得这么写:

BIO_get_fd(BIO_next(bio), &sd);

问题是,你必须知道这个BIO stack是如何排列的才能写出上面的代码,做到如此最好的办法就是看OpenSSL的源代码。
       BIO的API设计就一定要设计成get/set_fd吗?BIO就一定要和一个fd相关吗?memory类型的BIO如果get fd的话,会返回怎么的错误吗呢?既然BIO构成了一个叠加的IO stack,那么也许之有最下面的那个才会和一个UNIX fd相关联,那为何不直接返回最下面那个呢?

时间: 2024-10-20 17:27:57

OpenSSL的SSL/BIO_get_fd的相关文章

在libuv中使用openssl建立ssl连接

在libuv中使用openssl建立ssl连接 @(blogs) 使用openssl进行加密通信时,通常是先建立socket连接,然后使用SSL_XXX系列函数在普通socket之上建立安全连接,然后发送和接收数据.openssl的这些函数可以支持底层的socket是非阻塞模式的.但当将openssl和libuv进行结合时,会遇到一些问题: 1. openssl在进行数据读写之前,需要进行若干次"握手"."握手"中会有若干次的数据读写.这个在普通的socket连接中

使用openssl生成SSL完全参考手册

openssl是一个开放源代码的SSL实现.基于openssl指令的最简单和最主要应用就是使用req.CA和X509来签发一个证书. openssl提供了命令行选项和交互式两种方式来执行各种操作. 在命令行中直接输入openssl可进入交互shell,如下: [[email protected] local]# openssl OpenSSL> help openssl:Error: 'help' is an invalid command. Standard commands asn1pars

openssl生成ssl证书

x509证书一般会用到三类文,key,csr,crt. Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥. crt是CA认证后的证书文,(windows下面的,其实是crt),签署人用自己的key给你签署的凭证. 1.key的生成 openssl genrsa -des3 -out server.key 2048 这样是生成rsa私钥,des3算法,openssl格式,2048位强度

win Apache 使用 openssl 开启ssl步骤

openssl 版本 OpenSSL> version OpenSSL 1.0.1g 7 Apr 2014 无法启动 httpd C:\Users\Administrator>httpd -v Server version: Apache/2.4.9 (Win64) Apache Lounge VC11 Server built: Mar 16 2014 12:42:59 C:\Users\Administrator>httpd -X AH00526: Syntax error on l

用openssl生成SSL使用的私钥和证书,并自己做CA签名(转)

本 文记叙的是一次基于SSL的socket通讯程序开发中,有关证书,签名,身份验证相关的步骤. 我们的场景下,socket服务端是java语言编写的,客户端是c语言.使用了一个叫做matrixssl的c语言库.自己做CA签名,不等同于“自签 名”. 自签名的情况,RSA的公钥私钥只有一对,用私钥对公钥证书做签名.而我们的场景是,自己做CA,有一个CA的公钥私钥对. 而socket的服务端也有一个公钥私钥对. 用CA的私钥对socket服务端的公钥证书做签名. openssl genrsa -ou

OpenSSL 与 SSL 数字证书概念贴

SSL/TLS 介绍见文章 SSL/TLS原理详解. 如果你想快速自建CA然后签发数字证书,请移步 基于OpenSSL自建CA和颁发SSL证书. 首先简单区分一下HTTPS.SSL.OpenSSL三者的关系: SSL是在客户端和服务器之间建立一条SSL安全通道的安全协议,而OpenSSL是TLS/SSL协议的开源实现,提供开发库和命令行程序.常说的HTTPS是HTTP的加密版,底层使用的加密协议是SSL. 1.PKI.CA与证书 PKI 就是 Public KeyInfrastructure 的

使用openssl为ssl证书增加“使用者备用名称(DNS)”

上一片讲到了多CN的签署方式利用openssl签署多域名证书,在实际使用中遇到了一个问题,在android系统中,浏览器不识别多CN的域名,会报错"证书名称和服务器名称不符",开始以为是自签署CA的问题,换成单个CN之后就正常了,没办法,只能换其他方法了,google N久之后,找到到了方法: 主要修改在openssl.cnf # 确保req下存在以下2行(默认第一行是有的,第2行被注释了)[ req ]distinguished_name = req_distinguished_na

openssl校验SSL证书public是否配对

今天遇到一个很少遇到的关于SSL证书申请.安装问题,简要记录下来. 背景:SSL证书是private key + public key一起工作才能完成加密过程的. 大致来说就是client在handshake过程中先拿public key加密发送随机session encryption key set以及其它关键信息,通过public key密码的报文只能通过server端安装的SSL certificate key pair中的private key才能进行解密. 如果private key与

openssl生成SSL证书的流程

SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socketlayer(SSL),SSL安全协议主要用来提供对用户和服务器的认证:对传送的数据进行加密和隐藏:确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准.由于SSL技术已建立到所有主要的浏览器和WEB服务器程序中,因此,仅需安装服务器证书就可以激活该功能了).即通过它可以激活SSL协议,实现数据信息在客户端和服务器之间的加密传输,可以防止数据信息的泄露.保证了双方传递信息的安全性,而且