资源描述:
《使用openssl编写服务器和客户端代码实例》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、使用OPENSSL编写服务器和客户端代码实例使用相同的ca生成两个证书,一个是server.cer,一个是client.cer,注意生成server.cer的时候必须指明证书可以用于服务端的。服务器代码: 1.#include "openssl/bio.h" 2.#include "openssl/ssl.h" 3.#include "openssl/err.h" 4. 5.#include 6. 7.#define EXIT_IF_TRUE(x) if (x)
2、8. do { 9. fprintf(stderr, "Check '%s' is true", #x); 10. ERR_print_errors_fp(stderr); 11. exit(2); 12. }while(0)
3、13. 14.int main(int argc, char **argv) 15.{ 16. SSL_CTX *ctx; 17. SSL *ssl; 18. X509 *client_cert; 19. 20. char szBuffer[1024]; 21. int nLen; 22. 23. struct sockaddr_in addr; 24. int len; 25. int nListenFd, nAcceptFd; 26. 27. //
4、初始化 28. cutil_init(); 29. cutil_log_set_level(LOG_ALL); 30. cutil_log_set_stderr(1); 1. SSLeay_add_ssl_algorithms(); 2. OpenSSL_add_all_algorithms(); 3. SSL_load_error_strings(); 4. ERR_load_BIO_strings(); 5. 6. // 我们使用SSL V3,V2 7. EXIT_IF_TRUE((ct
5、x = SSL_CTX_new (SSLv23_method())) == NULL); 8. 9. // 要求校验对方证书 10. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); 11. 12. // 加载CA的证书 13. EXIT_IF_TRUE (!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL)); 14. 15. // 加载自己的证书 16. EXIT_IF_TRUE (SSL_CTX_us
6、e_certificate_file(ctx, "server.cer", SSL_FILETYPE_PEM) <= 0) ; 17. 18. // 加载自己的私钥 19. EXIT_IF_TRUE (SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM) <= 0) ; 20. 21. // 判定私钥是否正确 22. EXIT_IF_TRUE (!SSL_CTX_check_private_key(ctx)); 23. 24. // 创建并
7、等待连接 25. nListenFd = cutil_socket_new(SOCK_STREAM); 26. cutil_socket_bind(nListenFd, NULL, 8812, 1); 27. 28. memset(&addr, 0, sizeof(addr)); 29. len = sizeof(addr); 30. nAcceptFd = accept(nListenFd, (struct sockaddr *)&addr, (size_t *)&len); 31. cutil_log_d
8、ebug("Accept a connect from [%s:%d]", 32. inet_ntoa(addr.sin_addr