首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 网络安全 > 黑客技术 > 使用 OpenSSL API 进行安全编程(3)
【标  题】:使用 OpenSSL API 进行安全编程(3)
【关键字】:API,编程,安全,SSL,OpenSSL,OpenSSL,API
【来  源】:网络

使用 OpenSSL API 进行安全编程(3)

清单 7. 设置 SSL 指针

SSL_CTX * ctx = SSL_CTX_new(SSLv23_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 标记。

清单 10. 设置 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 的调用。该调用还将执行握手来建立安全连接。

清单 11. 打开安全连接

/* 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 的内部检查,则返回 X509_V_OK。如果有地方出了问题,则返回一个错误代码,该代码被记录在命令行工具的 verify 选项下。

应该注意的是,验证失败并不意味着连接不能使用。是否应该使用连接取决于验证结果和安全方面的考虑。例如,失败的信任验证可能只是意味着没有可信任的证书。连接仍然可用,只是需要从思想上提高安全意识。

清单 12. 检查证书是否有效

if(SSL_get_verify_result(ssl) != X509_V_OK)
{
/* Handle the failed verification */
}

这就是所需要的全部操作。通常,与服务器进行通信都要使用 BIO_read 和 BIO_write。并且只需调用 BIO_free_all 或 BIO_reset ,就可以关闭连接,具体调用哪一个方法取决于是否重用 BIO。

必须在结束应用程序之前的某个时刻释放 SSL 上下文结构。可以调用 SSL_CTX_free 来释放该结构。

清单 13. 清除 SSL 上下文

SSL_CTX_free(ctx);
使用 OpenSSL API 进行安全编程(4):【上一篇】
开发工具大比拼visual c++ vs delphi---(三):【下一篇】
【相关文章】
  • 使用 OpenSSL API 进行安全编程(4)
  • 使用 OpenSSL API 进行安全编程(5)
  • 高质量C++/C编程指南 -- 附录B :C++/C试题、答案与评分标准
  • 安全软件新发明 可检查C++等源码和漏洞
  • Cookie的传递流程编程实现及安全问题(1)
  • Cookie的传递流程编程实现及安全问题(2)
  • 大型项目的XP(极限编程)
  • 编程什么是算法?
  • 编程MySpy开发手记
  • 高质量C++/C编程指南 -- 内存管理 (2)
  • 【随机文章】
  • Solaris下Oracle的基本操作
  • More Effective C++之26
  • 模拟打印的演示控件
  • Sql server中时间查询的一个比较快的语句
  • C#设计模式(5)-Factory Method Pattern
  • 13问之5,6,7,8,9,10
  • Allair JRUN 非法读取 WEB-INF 漏洞
  • 发现一些有趣的HTML Tag
  • Teamwork初体验
  • JAVA学习流程
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.