使用openssl编写服务端和客户端程序

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/

时间: 2024-11-06 05:44:25

使用openssl编写服务端和客户端程序的相关文章

php编写TCP服务端和客户端程序

From: http://blog.csdn.net/anda0109/article/details/46655301 1.修改php.ini,打开extension=php_sockets.dll 2.服务端程序SocketServer.php [php] view plaincopyprint? <?php //确保在连接客户端时不会超时 set_time_limit(0); //设置IP和端口号 $address = "127.0.0.1"; $port = 3046;

JAVA笔记15__TCP服务端、客户端程序 / ECHO程序 /

/** * TCP:传输控制协议,采用三方握手的方式,保证准确的连接操作. * UDP:数据报协议,发送数据报,例如:手机短信或者是QQ消息. */ /** * TCP服务器端程序 */ public class Main { public static void main(String[] args) { try { ServerSocket s1 = new ServerSocket(57712); //创建一个服务器端socket System.out.println("服务器已启动,正在

使用Thrift RPC编写程序(服务端和客户端)

1. Thrift类介绍 Thrift代码包(位于thrift-0.6.1/lib/cpp/src)有以下几个目录: concurrency:并发和时钟管理方面的库processor:Processor相关类protocal:Protocal相关类transport:transport相关类server:server相关类 1.1 Transport类(how is transmitted?)负责数据传输,有以下几个可用类:TFileTransport:文件(日志)传输类,允许client将文件

C# 编写WCF简单的服务端与客户端

http://www.wxzzz.com/1860.html Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台.整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术.是Windows平台上开发分布式应用最佳的实践方式. 今天带如何一步一步实现WCF服务端与客户端的开发及基础讲解. 一.在Visual

[C语言]一个很实用的服务端和客户端进行TCP通信的实例

本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件client.c,内容如下: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <

用Java实现HTTP Multipart的服务端和客户端

今天简单介绍一下如何用Java支持HTTP Multipart的request和response. 整个项目的代码可以在https://github.com/mcai4gl2/multi下载. 在这个程序里,我们的业务场景很简单.在服务端有一个随机数生成器,可以生成随机的Integer和Guid,客户端通过服务,可以请求一个或多个随机数.同时,客户端可以向服务端发送一个或多个随机数,这些随机数会被加入到一个队列中,被其他的客户端通过请求获得.以下是我们的随机数Bean的定义: [java] vi

通过WebSocket实现实时通讯C#语言编写服务端

无意中发现js有webSocket对象于是百度了一下客户端代码与服务端代码没有现成的 有的就有一些简单了连接例子有的还不好使 于是就自己整理了一下 c#编写的服务端代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.Text.RegularExpression

SVN1.6服务端和客户端安装配置指导

本节向大家描述SVN1.6服务端和客户端安装配置步骤,随着SVN的快速发展,版本也进行了升级更新,本节就和大家一起学习一下SVN1.6服务端和客户端安装配置步骤,欢迎大家一起来学习.下面是具体介绍.1.软件下载下载SVN1.6服务器程序.http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91[注意]如果之前已经安装了TortoiseSVN客户端,必须选择与之配套的SVN服务端版本,否则会出现各种问题,可以从Tor

使用Apache CXF开发WebServices服务端、客户端

在前一篇的博客中,我使用Xfire1.x来开发了WebServies的服务端. 但是如果你访问Apache的官网,可以看到xfire已经被合并了. 最新的框架叫做CXF. Apache CXF = Celtix + XFire. CXF 继承了 Celtix 和 XFire 两大开源项目的精华, 提供了对 JAX-WS 全面的支持,并且提供了多种 Binding .DataBinding.Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code Fi