1.SSL_accept函数简介
2.如何使用 OpenSSL:哈希值、握握手数字签名等 | Linux 中国
3.nginx调用openssl函数源码分析
4.OpenSSL 握手过程及重要操作
5.mbedtlsçssl x509åè®®API
6.如何使用API和初始化OpenSSL正常吗
SSL_accept函数简介
头文件<openssl/ssl.h>包含SSL_accept函数的手源定义。该函数在等待一个TLS/SSL客户端启动TLS/SSL握手时发挥关键作用,过程类似于socket中的握握手accept函数。
函数原型int SSL_accept(SSL *ssl);简洁地描述了其工作方式。手源其中,过程卡劵平台源码SSL *ssl;参数代表TLS/SSL会话实例。握握手当服务器接收到客户端发起的手源连接请求后,调用SSL_accept函数,过程服务器将与客户端完成TLS/SSL握手过程。握握手此过程确保了通信的手源安全性,防止未授权访问。过程
通过调用SSL_accept,握握手服务器能够验证客户端的手源身份,并在TLS/SSL连接上设置加密通道。过程这一步骤对建立安全通信至关重要,因为加密通道确保数据在传输过程中不会被中间人窃取或篡改。
成功调用SSL_accept后,服务器能够与客户端进行安全的通信。这不仅限于数据的加密,还包括身份验证、密钥交换等复杂操作。这些安全措施使得TLS/SSL成为互联网上保护数据安全的基石。
总的来说,SSL_accept函数在TLS/SSL协议中扮演着核心角色,源码库...确保了服务器与客户端之间的通信既高效又安全。通过调用此函数,服务器能够管理连接、验证客户端身份,并在两者间建立一个加密的通信通道,为互联网上的数据传输提供强大的安全保障。
如何使用 OpenSSL:哈希值、数字签名等 | Linux 中国
如何使用 OpenSSL:深入探讨哈希值、数字签名和数字证书 | Linux 中国
在密码学的世界里,OpenSSL 是一个不可或缺的工具,它支持哈希、加密、数字签名和证书管理。本文将详尽解析这些概念在实际操作中的应用。
首先,哈希函数,如SHA1和SHA,是计算过程中不可或缺的组成部分。它们用于验证文件完整性和在网络协议中保护消息的完整性。例如,比特币挖矿依赖于SHA的碰撞特性,而HTTPS则使用哈希值来保护用户密码的安全。
数字签名是另一个关键概念,它验证文件真实性,list源码原理确保消息未被篡改。使用OpenSSL,可以创建并验证RSA密钥对,生成基于哈希的签名,如在电子邮件或代码中保护其源头和完整性。
数字证书则整合了这些元素,如X证书,它们包含了指纹信息,用于验证证书身份。在生产环境中,创建证书签名请求(CSR)并通过CA进行签名是必不可少的步骤。
自签名证书在开发HTTPS时非常实用,尽管它们不受主流浏览器完全信任,但可以用于快速测试和验证。在TLS握手过程中,通过非对称加密和对称加密的结合,确保了数据的安全传输。
总的来说,OpenSSL提供了强大的密码学工具,从哈希值的计算到数字签名的生成,再到证书的管理,都是确保网络安全和数据完整性的关键步骤。深入理解并熟练使用这些工具,对于在Linux系统中实现安全通信至关重要。jekenis源码构建
nginx调用openssl函数源码分析
本文分为两部分,分别是nginx部分和openssl部分。在nginx部分,首先在ngx_ 的 端口,那么该字符串将是 www.ibm.com: 。调用 BIO_do_connect 检查连接是否成功。如果出错,则返回 0 或 -1。
与服务器进行通信
不管 BIO 对象是套接字还是文件,对其进行的读和写操作都是通过以下两个函数来完成的: BIO_read 和 BIO_write 。 很简单,对吧?精彩之处就在于它始终如此。
BIO_read 将尝试从服务器读取一定数目的字节。它返回读取的字节数、 0 或者 -1。在受阻塞的连接中,该函数返回 0,表示连接已经关闭,而 -1 则表示连接出现错误。在非阻塞连接的情况下,返回 0 表示没有可以获得的数据,返回 -1 表示连接出错。可以调用 BIO_should_retry 来确定是否可能重复出现该错误。
清单 4. 从连接读取
int x = BIO_read(bio,mybites源码分析 buf, len);if(x == 0){ /* Handle closed connection */}else if(x < 0){ if(! BIO_should_retry(bio)) { /* Handle failed read here */ } /* Do something to handle the retry */}
BIO_write 会试着将字节写入套接字。它将返回实际写入的 字节数、0 或者 -1。同 BIO_read ,0 或 -1 不一定表示错误。BIO_should_retry 是找出问题的途径。如果需要重试写操作,它必须 使用和前一次完全相同的参数。
清单 5. 写入到连接
if(BIO_write(bio, buf, len) <= 0){ if(! BIO_should_retry(bio)) { /* Handle failed write here */ } /* Do something to handle the retry */}
关闭连接
关闭连接也很简单。您可以使用以下两种方式之一来关闭连接: BIO_reset 或 BIO_free_all 。如果您还需要重新使用对象,那么请使用第一种方式。 如果您不再重新使用它,则可以使用第二种方式。
BIO_reset 关闭连接并重新设置 BIO 对象的内部状态,以便可以重新使用连接。如果要在整个应用程序中使用同一对象,比如使用一台安全的聊天 客户机,那么这样做是有益的。该函数没有返回值。
BIO_free_all 所做正如其所言:它释放内部结构体,并释放 所有相关联的内存,其中包括关闭相关联的套接字。如果将 BIO 嵌入于一个类中,那么应该在类的 析构函数中使用这个调用。
清单 6. 关闭连接
/* To reuse the connection, use this line */BIO_reset(bio);/* To free it from memory, use this line */BIO_free_all(bio);
建立安全连接
现在需要给出建立安全连接需要做哪些事情。惟一要改变的地方就是建立并进行连接。其他所有内容都是相同的。
安全连接要求在连接建立后进行握手。在握手过程中,服务器向客户机发送一个证书, 然后,客户机根据一组可信任证书来核实该证书。它还将检查证书,以确保它没有过期。要 检验证书是可信任的,需要在连接建立之前提前加载一个可信任证书库。
只有在服务器发出请求时,客户机才会向服务器发送一个证书。该过程叫做客户机认证。使用证书, 在客户机和服务器之间传递密码参数,以建立安全连接。尽管握手是在建立连接之后才进行的,但是客户机或服务器可以在任何时刻请求进行一次新的握手。
参考资料 部分中列出的 Netscasp 文章 和 RFC ,对握手以及建立安全连接的其他方面的知识进行了更详尽的论述。
为安全连接进行设置
为安全连接进行设置要多几行代码。同时需要有另一个类型为 SSL_CTX 的指针。该结构保存了一些 SSL 信息。您也可以利用它通过 BIO 库建立 SSL 连接。可以通过使用 SSL 方法函数调用 SSL_CTX_new 来创建这个结构,该方法函数通常是SSLv_client_method 。
还需要另一个 SSL 类型的指针来保持 SSL 连接结构(这是短时间就能完成的一些连接所必需的)。以后还可以用该 SSL 指针来检查连接信息或设置其他 SSL 参数。
清单 7. 设置 SSL 指针
SSL_CTX * ctx = SSL_CTX_new(SSLv_client_method());SSL * ssl;
加载可信任证书库
在创建上下文结构之后,必须加载一个可信任证书库。这是成功验证每个证书所必需的。如果 不能确认证书是可信任的,那么 OpenSSL 会将证书标记为无效(但连接仍可以继续)。
OpenSSL 附带了一组可信任证书。它们位于源文件树的 certs 目录中。 不过,每个证书都是一个独立的文件 —— 也就是说,需要单独加载每一个证书。在 certs 目录下,还有一个存放过期证书的子目录。试图加载这些证书将会出错。
如果您愿意,可以分别加载每一个文件,但为了简便起见,最新的 OpenSSL 发行版本的可信任证书 通常存放在源代码档案文件中,这些档案文件位于名为“TrustStore.pem”的单个文件中。如果已经有了一个可信任证书库, 并打算将它用于特定的项目中,那么只需使用您的文件替换清单 8 中的“TrustStore.pem”(或者使用 单独的函数调用将它们全部加载)即可。
可以调用 SSL_CTX_load_verify_locations 来加载可信任证书库文件。这里要用到 三个参数:上下文指针、可信任库文件的路径 和文件名,以及证书所在目录的路径。必须指定可信任库文件或证书的目录。 如果指定成功,则返回 1,如果遇到问题,则返回 0。
清单 8. 加载信任库
if(! SSL_CTX_load_verify_locations(ctx, "/path/to/TrustStore.pem", NULL)){ /* Handle failed load here */}
如果打算使用目录存储可信任库,那么必须要以特定的方式命名文件。OpenSSL 文档清楚 地说明了应该如何去做,不过,OpenSSL 附带了一个名为 c_rehash 的工具, 它可以将文件夹配置为可用于 SSL_CTX_load_verify_locations 的 路径参数。
清单 9. 配置证书文件夹并使用它
/* Use this at the command line */c_rehash /path/to/certfolder/* then call this from within the application */if(! SSL_CTX_load_verify_locations(ctx, NULL, "/path/to/certfolder")){ /* Handle error here */}
为了指定所有需要的验证证书,您可以根据需要命名任意数量的单独文件或文件夹。您还可以同时指定 文件和文件夹。
创建连接
将指向 SSL 上下文的指针作为惟一参数,使用 BIO_new_ssl_connect 创建 BIO 对象。还需要获得指向 SSL 结构的指针。在本文中,只将该指针用于 SSL_set_mode 函数。而这个函数是用来设置 SSL_MODE_AUTO_RETRY 标记的。使用这个选项进行设置,如果服务器突然希望进行 一次新的握手,那么 OpenSSL 可以在后台处理它。如果没有这个选项,当服务器希望进行一次新的握手时, 进行读或写操作都将返回一个错误,同时还会在该过程中设置 retry 标记。
清单 . 设置 BIO 对象
bio = BIO_new_ssl_connect(ctx);BIO_get_ssl(bio, & ssl);SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
设置 SSL 上下文结构之后,就可以创建连接了。主机名是使用 BIO_set_conn_hostname 函数 设置的。主机名和端口的指定格式与前面的相同。该函数还可以打开到主机的连接。为了确认已经成功打开连接,必须 执行对 BIO_do_connect 的调用。该调用还将执行握手来建立安全连接。
清单 . 打开安全连接
/* Attempt to connect */BIO_set_conn_hostname(bio, "hostname:port");/* Verify the connection opened and perform the handshake */if(BIO_do_connect(bio) <= 0){ /* Handle failed connection */}
连接建立后,必须检查证书,以确定它是否有效。实际上,OpenSSL 为我们完成了这项任务。如果证书有致命的 问题(例如,哈希值无效),那么将无法建立连接。但是,如果证书的问题并不是致命的(当它已经过期 或者尚不合法时),那么仍可以继续使用连接。
可以将 SSL 结构作为惟一参数,调用 SSL_get_verify_result 来查 明证书是否通过了 OpenSSL 的检验。如果证书通过了包括信任检查在内的 OpenSSL 的内部检查,则返回 X_V_OK。如果有地方出了问题,则返回一个错误代码,该代码被记录在命令行工具的 verify 选项下。
应该注意的是,验证失败并不意味着连接不能使用。是否应该使用连接取决于验证结果和安全方面的考虑。例如, 失败的信任验证可能只是意味着没有可信任的证书。连接仍然可用,只是需要从思想上提高安全意识。