使用OPENSSL编写服务器和客户端代码实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用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) \
8. do { \
9. fprintf(stderr, "Check '%s' is true\n", #x); \
10. ERR_print_errors_fp(stderr); \
11. exit(2); \
12. }while(0)
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.// 初始化
28. cutil_init();
29. cutil_log_set_level(LOG_ALL);
30. cutil_log_set_stderr(1);
31. SSLeay_add_ssl_algorithms();
32. OpenSSL_add_all_algorithms();
33. SSL_load_error_strings();
34. ERR_load_BIO_strings();
35.
36.// 我们使用SSL V3,V2
37. EXIT_IF_TRUE((ctx = SSL_CTX_new (SSLv23_method())) == NULL);
38.
39.// 要求校验对方证书
40. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
41.
42.// 加载CA的证书
43. EXIT_IF_TRUE (!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL));
44.
45.// 加载自己的证书
46. EXIT_IF_TRUE (SSL_CTX_use_certificate_file(ctx, "server.cer", SSL_FILETYPE_PEM
) <= 0) ;
47.
48.// 加载自己的私钥
49. EXIT_IF_TRUE (SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM)
<= 0) ;
50.
51.// 判定私钥是否正确
52. EXIT_IF_TRUE (!SSL_CTX_check_private_key(ctx));
53.
54.// 创建并等待连接
55. nListenFd = cutil_socket_new(SOCK_STREAM);
56. cutil_socket_bind(nListenFd, NULL, 8812, 1);
57.
58. memset(&addr, 0, sizeof(addr));
59. len = sizeof(addr);
60. nAcceptFd = accept(nListenFd, (struct sockaddr *)&addr, (size_t *)&len);
61. cutil_log_debug("Accept a connect from [%s:%d]\n",
62. inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
63.
64.// 将连接付给SSL
65. EXIT_IF_TRUE( (ssl = SSL_new (ctx)) == NULL);
66. SSL_set_fd (ssl, nAcceptFd);
67. EXIT_IF_TRUE( SSL_accept (ssl) != 1);
68.
69.// 进行操作
70. memset(szBuffer, 0, sizeof(szBuffer));
71. nLen = SSL_read(ssl,szBuffer, sizeof(szBuffer));
72. fprintf(stderr, "Get Len %d %s ok\n", nLen, szBuffer);
73. strcat(szBuffer, " this is from server");
74. SSL_write(ssl, szBuffer, strlen(szBuffer));
75.
76.// 释放资源
77. SSL_free (ssl);
78. SSL_CTX_free (ctx);
79. close(nAcceptFd);
80.}
客户端代码
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) \
8. do { \
9. fprintf(stderr, "Check '%s' is true\n", #x); \
10. ERR_print_errors_fp(stderr); \
11. exit(2); \
12. }while(0)
13.
14.int main(int argc, char **argv)
15.{
16. SSL_METHOD *meth;
17. SSL_CTX *ctx;
18. SSL *ssl;
19.
20. int nFd;
21. int nLen;
22. char szBuffer[1024];
23.
24.// 初始化
25. cutil_init();
26. cutil_log_set_level(LOG_ALL);
27. cutil_log_set_stderr(1);
28. SSLeay_add_ssl_algorithms();