博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用openssl编写服务端和客户端程序
阅读量:5255 次
发布时间:2019-06-14

本文共 3587 字,大约阅读时间需要 11 分钟。

1.使用相同的ca生成两个证书,一个是server.cer,一个是client.cer,注意生成server.cer的时候必须指明证书可以用于服务端的。

服务器代码:

 

  1. #include "openssl/bio.h"
  2. #include "openssl/ssl.h"
  3. #include "openssl/err.h"
  4. #include <cutil.h>
  5. #define EXIT_IF_TRUE(x) if (x) \
  6. do { \
  7. fprintf(stderr, "Check '%s' is true\n", #x); \
  8. ERR_print_errors_fp(stderr); \
  9. exit(2); \
  10. }while(0)
  11. int main(int argc, char **argv)
  12. {
  13. SSL_CTX *ctx;
  14. SSL *ssl;
  15. X509 *client_cert;
  16. char szBuffer[1024];
  17. int nLen;
  18. struct sockaddr_in addr;
  19. int len;
  20. int nListenFd, nAcceptFd;
  21. // 初始化
  22. cutil_init();
  23. cutil_log_set_level(LOG_ALL);
  24. cutil_log_set_stderr(1);
  25. SSLeay_add_ssl_algorithms();
  26. OpenSSL_add_all_algorithms();
  27. SSL_load_error_strings();
  28. ERR_load_BIO_strings();
  29. // 我们使用SSL V3,V2
  30. EXIT_IF_TRUE((ctx = SSL_CTX_new (SSLv23_method())) == NULL);
  31. // 要求校验对方证书
  32. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
  33. // 加载CA的证书
  34. EXIT_IF_TRUE (!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL));
  35. // 加载自己的证书
  36. EXIT_IF_TRUE (SSL_CTX_use_certificate_file(ctx, "server.cer", SSL_FILETYPE_PEM) <= 0) ;
  37. // 加载自己的私钥
  38. EXIT_IF_TRUE (SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM) <= 0) ;
  39. // 判定私钥是否正确
  40. EXIT_IF_TRUE (!SSL_CTX_check_private_key(ctx));
  41. // 创建并等待连接
  42. nListenFd = cutil_socket_new(SOCK_STREAM);
  43. cutil_socket_bind(nListenFd, NULL, 8812, 1);
  44. memset(&addr, 0, sizeof(addr));
  45. len = sizeof(addr);
  46. nAcceptFd = accept(nListenFd, (struct sockaddr *)&addr, (size_t *)&len);
  47. cutil_log_debug("Accept a connect from [%s:%d]\n",
  48. inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
  49. // 将连接付给SSL
  50. EXIT_IF_TRUE( (ssl = SSL_new (ctx)) == NULL);
  51. SSL_set_fd (ssl, nAcceptFd);
  52. EXIT_IF_TRUE( SSL_accept (ssl) != 1);
  53. // 进行操作
  54. memset(szBuffer, 0, sizeof(szBuffer));
  55. nLen = SSL_read(ssl,szBuffer, sizeof(szBuffer));
  56. fprintf(stderr, "Get Len %d %s ok\n", nLen, szBuffer);
  57. strcat(szBuffer, " this is from server");
  58. SSL_write(ssl, szBuffer, strlen(szBuffer));
  59. // 释放资源
  60. SSL_free (ssl);
  61. SSL_CTX_free (ctx);
  62. close(nAcceptFd);
  63. }
客户端代码
  1. #include "openssl/bio.h"
  2. #include "openssl/ssl.h"
  3. #include "openssl/err.h"
  4. #include <cutil.h>
  5. #define EXIT_IF_TRUE(x) if (x) \
  6. do { \
  7. fprintf(stderr, "Check '%s' is true\n", #x); \
  8. ERR_print_errors_fp(stderr); \
  9. exit(2); \
  10. }while(0)
  11. int main(int argc, char **argv)
  12. {
  13. SSL_METHOD *meth;
  14. SSL_CTX *ctx;
  15. SSL *ssl;
  16. int nFd;
  17. int nLen;
  18. char szBuffer[1024];
  19. // 初始化
  20. cutil_init();
  21. cutil_log_set_level(LOG_ALL);
  22. cutil_log_set_stderr(1);
  23. SSLeay_add_ssl_algorithms();
  24. OpenSSL_add_all_algorithms();
  25. SSL_load_error_strings();
  26. ERR_load_BIO_strings();
  27. // 我们使用SSL V3,V2
  28. EXIT_IF_TRUE((ctx = SSL_CTX_new (SSLv23_method())) == NULL);
  29. // 要求校验对方证书
  30. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
  31. // 加载CA的证书
  32. EXIT_IF_TRUE (!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL));
  33. // 加载自己的证书
  34. EXIT_IF_TRUE (SSL_CTX_use_certificate_file(ctx, "client.cer", SSL_FILETYPE_PEM) <= 0) ;
  35. // 加载自己的私钥
  36. EXIT_IF_TRUE (SSL_CTX_use_PrivateKey_file(ctx, "client.key", SSL_FILETYPE_PEM) <= 0) ;
  37. // 判定私钥是否正确
  38. EXIT_IF_TRUE (!SSL_CTX_check_private_key(ctx));
  39. // 创建连接
  40. nFd = cutil_socket_new(SOCK_STREAM);
  41. if(cutil_socket_connect(nFd, "127.0.0.1", 8812, 30) < 0)
  42. {
  43. cutil_log_error("连接服务器失败\n");
  44. return -1;
  45. }
  46. // 将连接付给SSL
  47. EXIT_IF_TRUE( (ssl = SSL_new (ctx)) == NULL);
  48. SSL_set_fd (ssl, nFd);
  49. EXIT_IF_TRUE( SSL_connect (ssl) != 1);
  50. // 进行操作
  51. sprintf(szBuffer, "this is from client %d", getpid());
  52. SSL_write(ssl, szBuffer, strlen(szBuffer));
  53. // 释放资源
  54. memset(szBuffer, 0, sizeof(szBuffer));
  55. nLen = SSL_read(ssl,szBuffer, sizeof(szBuffer));
  56. fprintf(stderr, "Get Len %d %s ok\n", nLen, szBuffer);
  57. SSL_free (ssl);
  58. SSL_CTX_free (ctx);
  59. close(nFd);
  60. }

转自:http://hoytluo.blog.51cto.com/1154435/564822/

转载于:https://www.cnblogs.com/duxp/p/4486698.html

你可能感兴趣的文章
docker rancher 体验 (未完待续.....)
查看>>
10反射
查看>>
Android操作Sqlite数据库
查看>>
opencv 鼠标交互
查看>>
iOS之地图开发
查看>>
[Swift]LeetCode1015. 可被 K 整除的最小整数 | Smallest Integer Divisible by K
查看>>
[Swift]LeetCode1124. 表现良好的最长时间段 | Longest Well-Performing Interval
查看>>
[Swift]LeetCode942. 增减字符串匹配 | DI String Match
查看>>
Pascal代码自动格式化
查看>>
蔡康永的说话之道2-透过说话,懂得把别放在心上
查看>>
计算机网络设备之交换机和路由器
查看>>
软件工程(2019)结对编程第一次作业
查看>>
[SCSS] Loop Over Data with the SCSS @each Control Directive
查看>>
[Node.js] Use "prestart" in scripts
查看>>
[AngularJS] ngCloak
查看>>
spring boot 和 mybatis集成
查看>>
ids资源文件解释
查看>>
php __tostring 与 tostring
查看>>
如何用好cpan
查看>>
react面试题(一)
查看>>