使用openssl API编写client和server

使用openssl api编写的client程序和server程序,其中第一个client采用了BIO的方式,第二个client采用了ssl接口,第一个server程序基本没有使用BIO方式,第二个server程序绝大部分使用了BIO的方式。(server和client程序只是为了展示openssl api的使用,没有涉及到多进程及多线程,没有考虑程序的性能问题。对于openssl api的学习了解是一个任重而道远的过程,需要慢慢积累,积少成多,看完文档要多去实践。)

程序清单:

    makefile

    client.c

    server.c  (两个server不能同时编译)

 

makefile代码如下:

#gcc -o client client.c -I/openssl_gx/include -L/openssl_gx/lib -lssl -lcrypto -ldl
#gcc -o server serv.c -I/openssl_gx/include -L/openssl_gx/lib -lssl -lcrypto -ldl

CC = gcc
INCLUDE = -I/openssl_gx/include
LIBPATH = -L/openssl_gx/lib
LIB = -lssl -lcrypto -ldl

client:
	$(CC) -o client client.c $(INCLUDE) $(LIBPATH) $(LIB)
	
server:
	$(CC) -o server server.c $(INCLUDE) $(LIBPATH) $(LIB)

all: client server
	
clean:
	rm -f client
	rm -f server

 

client.c代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/ssl.h>
#include <openssl/bio.h>
#include <openssl/err.h>

int main() {
	int iResult = 0;
	BIO * bio = NULL;
	SSL * ssl = NULL;
	SSL_CTX * ctx = NULL;
	X509 * pX509 = NULL;
	const SSL_METHOD * sslMethod = NULL;

	char commonName[512] = { 0 };
	X509_NAME * pX509_NAME = NULL;
	char szClientMsg[] = "I am guoxu.\n";

	unsigned int uiRecBytes = 0;

	unsigned char baRecBuffer[1024];
	unsigned char * pbRecFinish = NULL;
	unsigned char * pbRecBak = NULL;
	unsigned int uiRecBakLen = 0;

	char * pMsgline = NULL;

	SSL_library_init();
	ERR_load_BIO_strings();
	SSL_load_error_strings();
	OpenSSL_add_all_algorithms();

	do {
		sslMethod = TLSv1_client_method(); /* Load ssl method. */
		if(NULL == sslMethod) {
			printf("TLSv1_client_method err: %s\n",ERR_error_string(ERR_get_error(),NULL));
			iResult = -1;
			break;
		}

		ctx = SSL_CTX_new(sslMethod); /* Create a new ssl context. */
		if( NULL == ctx) {
			printf("SSL_CTX_new err: %s\n",ERR_error_string(ERR_get_error(),NULL));
			iResult = -2;
			break;
		}

		if(0 == SSL_CTX_load_verify_locations(ctx,"/openssl_gx/cers/ca.crt",NULL)) { /* Load CA certification. */
			printf("SSL_CTX_load_verify_locations err:%s\n",
				ERR_error_string(ERR_get_error(),
				NULL));
			iResult = -3;
			break;
		}
	
		if(0 == SSL_CTX_use_certificate_file(ctx, "/openssl_gx/cers/client.crt", /* Load client certification file. */
						SSL_FILETYPE_PEM)) {
			printf("SSL_CTX_use_certificate_file err: %s\n",
				ERR_error_string(ERR_get_error(),NULL));
			iResult = -4;
			break;
		}

		if(0 == SSL_CTX_use_PrivateKey_file(ctx,"/openssl_gx/cers/client.key", /* Load client private key. */
						SSL_FILETYPE_PEM)) {
			iResult = -5;
			break;
		}

		if(0 == SSL_CTX_check_private_key(ctx)) { /* Check whether the private key match with the certification file. */
			printf("SSL_CTX_check_private_key err: %s\n",
				ERR_error_string(ERR_get_error(), NULL));
			iResult = -6;
			break;
		}
		
		bio = BIO_new_ssl_connect(ctx);
		if(NULL == bio) {
			printf("BIO_new_ssl_connect err: %s\n",
				ERR_error_string(ERR_get_error(), NULL));
			iResult = -7;
			break;
		}

		BIO_get_ssl(bio, &ssl);
		SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
		BIO_set_conn_hostname(bio, "127.0.0.1:443");
		
		if(0 >= BIO_do_connect(bio)){ /* Create a socket connection and then ssl handshake.*/
			printf("BIO_do_connect err: %s\n",
				ERR_error_string(ERR_get_error(), NULL));
			iResult = -8;
			break;
		}

		if(X509_V_OK != SSL_get_verify_result(ssl)) {  /* Check whether the ssl connection is created successfully. */
			printf("SSL_get_verify_result err: %s\n",
				ERR_error_string(ERR_get_error(), NULL));
			iResult = -9;
			break;
		}	

		pX509 = SSL_get_peer_certificate(ssl); /* Get the server certification. */
		if(NULL == pX509) {
			printf("SSL_get_peer_certificate err: %s\n",
				ERR_error_string(ERR_get_error(), NULL));
			iResult = -10;
			break;
		}

		pX509_NAME = X509_get_subject_name(pX509);
		if(NULL == pX509_NAME) {
			printf("X509_get_subject_name err: %s\n",
				ERR_error_string(ERR_get_error(), NULL));
			iResult = -10;
			break;
		}

		X509_NAME_get_text_by_NID(pX509_NAME, NID_commonName,commonName,512);
		if(0 != strcasecmp(commonName,"guoxu")) {
			printf("Certificate`s name guoxu != %s\n",commonName);
			iResult = -11;
			break;
		}

		if(0 >= BIO_write(bio,szClientMsg, strlen(szClientMsg))) { /* Send message to the server. */
			printf("Send a string to server failed.\n");
			iResult = -12;
			break;
		}

		
	} while(0);


	/* Close the ssl connection and clear the context. */	
	if(NULL != bio) {
		BIO_free_all(bio);
	}

	if(NULL != ctx) {
		SSL_CTX_free(ctx);
	}

	return iResult;
}

 

使用ssl接口的client程序:

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

#include <openssl/rsa.h>
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

#define MAXDATASIZE 1024
#define SERVERIP "127.0.0.1"
#define SERVERPORT 443

/* Make these what you want for cert & key files */
#define CERTF "/openssl_gx/cers/client.crt"
#define KEYF "/openssl_gx/cers/client.key"

#define CHK_NULL(x) if ((x)==NULL) exit (1)
#define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(1); }
#define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(2); }

int main(void) {

	char buf[MAXDATASIZE];
	int sockfd, numbytes;
	struct sockaddr_in server_addr;
	const SSL_METHOD *meth;
	int err;
	SSL_CTX* ctx;
	SSL*     ssl;

	if((sockfd = socket(AF_INET, SOCK_STREAM,0)) == -1) {
		perror("Socket error.\n");
		return 1;
	}	
	memset(&server_addr, 0, sizeof(struct sockaddr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(SERVERPORT);
	server_addr.sin_addr.s_addr = inet_addr(SERVERIP);
	
	if(connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr)) == -1) {
		perror("connect error.\n");
		return 1;
	}
	printf("Connected %d\n", sockfd);

	SSL_library_init();
	SSL_load_error_strings();
	SSLeay_add_ssl_algorithms();
  	meth = TLSv1_client_method(); /* Add ssl method. */
        if(NULL == meth) {
             printf("TLSv1_client_method err: %s\n",ERR_error_string(ERR_get_error(),NULL));
             exit(-1);
        }

	ctx = SSL_CTX_new (meth);  /* Create a new ssl context. */
  	if (!ctx) {
    		ERR_print_errors_fp(stderr);
    		exit(2);
  	}

	printf("111\n");
  	if(0 == SSL_CTX_load_verify_locations(ctx,"/openssl_gx/cers/ca.crt",NULL))  { /* Load CA certification file. */
        	ERR_print_errors_fp(stderr);
        	exit(15);
  	}
	printf("222\n");
  	if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0) { /* Load server certification file. */
    		ERR_print_errors_fp(stderr);
    		exit(3);
  	}
	printf("333\n");
  	if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0) { /* Load server private key file. */
    		ERR_print_errors_fp(stderr);
    		exit(4);
  	}
	printf("444\n");
  	if (!SSL_CTX_check_private_key(ctx)) { /* Check whether the private key match with the certification file. */
    		fprintf(stderr,"Private key does not match the certificate public key\n");
    		exit(5);
  	}
	printf("555\n");
	 /* TCP connection is ready. Do server side SSL. */
	ssl = SSL_new (ctx);
  	CHK_NULL(ssl);
  	SSL_set_fd (ssl, sockfd);
	
	err = SSL_connect (ssl);
	CHK_SSL(err);
	printf("SSL connect OK.\n");

	err = SSL_write(ssl,"I am guoxu.\n",strlen("I am guoxu.\n"));
	CHK_SSL(err);
	SSL_free(ssl);
	close(sockfd);
	SSL_CTX_free(ctx);
	
	return 0;
}


 


没有全部使用BIO的server.c代码如下:

 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#include <openssl/rsa.h>       /* SSLeay stuff */
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

/* Make these what you want for cert & key files */
#define CERTF "/openssl_gx/cers/server.crt"
#define KEYF "/openssl_gx/cers/server.key"


#define CHK_NULL(x) if ((x)==NULL) exit (1)
#define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(1); }
#define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(2); }

static int s_server_verify = SSL_VERIFY_NONE;

int verify_callback_server(int ok, X509_STORE_CTX * ctx) {
        printf("verify_callback_server.\n");
        return ok;
}

void main ()
{
  int err;
  int listen_sd;
  int sd;
  struct sockaddr_in sa_serv;
  struct sockaddr_in sa_cli;
  size_t client_len;
  SSL_CTX* ctx;
  SSL*     ssl;
  X509*    client_cert;
  char*    str;
  char     buf [4096];
  const SSL_METHOD *meth;

  SSL_load_error_strings();
  SSLeay_add_ssl_algorithms();
  meth = TLSv1_server_method(); /* Add ssl method. */
  ctx = SSL_CTX_new (meth);  /* Create a new ssl context. */
  if (!ctx) {
    ERR_print_errors_fp(stderr);
    exit(2);
  }
 
  if(0 == SSL_CTX_load_verify_locations(ctx,"/openssl_gx/cers/ca.crt",NULL))  { /* Load CA certification file. */
	ERR_print_errors_fp(stderr);
	exit(15);	
  }
  if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0) { /* Load server certification file. */
    ERR_print_errors_fp(stderr);
    exit(3);
  }
  if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0) { /* Load server private key file. */
    ERR_print_errors_fp(stderr);
    exit(4);
  }

  if (!SSL_CTX_check_private_key(ctx)) { /* Check whether the private key match with the certification file. */
    fprintf(stderr,"Private key does not match the certificate public key\n");
    exit(5);
  }

  /* Indicate that the server need verify the client certification file. */
  s_server_verify = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT | SSL_VERIFY_CLIENT_ONCE; 
  SSL_CTX_set_verify(ctx,s_server_verify,verify_callback_server);
  
  /* Prepare TCP socket for receiving connections */
  listen_sd = socket (AF_INET, SOCK_STREAM, 0);
  CHK_ERR(listen_sd, "socket");
  
  memset (&sa_serv, '\0', sizeof(sa_serv));
  sa_serv.sin_family      = AF_INET;
  sa_serv.sin_addr.s_addr = INADDR_ANY;
  sa_serv.sin_port        = htons (443);          /* Server Port number */
  												  /* Server listening port should set to 443, if not the wireshark can not show the
												     ssl communication. */
  
  err = bind(listen_sd, (struct sockaddr*) &sa_serv, sizeof (sa_serv));
  CHK_ERR(err, "bind");
	     
  /* Receive a TCP connection. */
  err = listen (listen_sd, 5); 
  CHK_ERR(err, "listen");
  
  client_len = sizeof(sa_cli);
  sd = accept (listen_sd, (struct sockaddr*) &sa_cli, &client_len);
  CHK_ERR(sd, "accept");
  close (listen_sd);

  printf ("Connection from %lx, port %x\n",
	  sa_cli.sin_addr.s_addr, sa_cli.sin_port);
  
  /* TCP connection is ready. Do server side SSL. */
  ssl = SSL_new (ctx);
  CHK_NULL(ssl);
  SSL_set_fd (ssl, sd);
  err = SSL_accept (ssl);
  CHK_SSL(err);
  
  /* Get the cipher - opt */
  printf ("SSL connection using %s\n", SSL_get_cipher (ssl));
  
  /* Get client's certificate (note: beware of dynamic allocation) - opt */
  client_cert = SSL_get_peer_certificate (ssl);
  if (client_cert != NULL) {
    printf ("Client certificate:\n");
    
    str = X509_NAME_oneline (X509_get_subject_name (client_cert), 0, 0);
    CHK_NULL(str);
    printf ("\t subject: %s\n", str);
    OPENSSL_free (str);
    
    str = X509_NAME_oneline (X509_get_issuer_name  (client_cert), 0, 0);
    CHK_NULL(str);
    printf ("\t issuer: %s\n", str);
    OPENSSL_free (str);
    
    /* We could do all sorts of certificate verification stuff here before
       deallocating the certificate. */
    
    X509_free (client_cert);
  } else {
    printf ("Client does not have certificate.\n");
  }
  
  /* DATA EXCHANGE - Receive message and send reply. */

  err = SSL_read (ssl, buf, sizeof(buf) - 1);                   CHK_SSL(err);
  buf[err] = '\0';
  printf ("Got %d chars:'%s'\n", err, buf);
  
  //err = SSL_write (ssl, "I hear you.", strlen("I hear you."));  CHK_SSL(err);

  /* Clean up. */
  close (sd);
  SSL_free (ssl);
  SSL_CTX_free (ctx);
}


尽力使用BIO的server.c代码如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <memory.h>
#include <errno.h>

#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/crypto.h>

#define ERR_OK	0
#define ERR_HAPPENED 1

#define TRACE_ENABLED 1
#define TRACE0(x) printf(x)

SSL_CTX *ctx;
BIO * sbio, * bbio, * acpt, * out;
SSL * ssl;

int main ()
{

	char tmpbuf[1024];
	ERR_load_crypto_strings();  //registers the error strings for all libcrypto functions. 
	ERR_load_SSL_strings(); 	//registers the error strings for libssl functions. 
	OpenSSL_add_ssl_algorithms(); //same as SSLeay_add_ssl_algorithms();
	
	ctx = SSL_CTX_new(TLSv1_server_method()); //Create a ssl context.
	if(ctx == NULL) {  //Must check NULL here.
		ERR_print_errors_fp(stderr);
		return ERR_HAPPENED;
	}
	
	if(!SSL_CTX_use_certificate_file(ctx,"/openssl_gx/cers/server.crt",SSL_FILETYPE_PEM)) {
		//ERR_print_errors_fp(stderr);
		return ERR_HAPPENED;
	} else {
		TRACE0("====> Step 1 : Load server certificate file done.\n");
	}
	
	if(!SSL_CTX_use_PrivateKey_file(ctx,"/openssl_gx/cers/server.key",SSL_FILETYPE_PEM)) {
		ERR_print_errors_fp(stderr);
		return ERR_HAPPENED;
	} else {
		TRACE0("====> Step 2: Load server private key done.\n");
	}
	
	if(!SSL_CTX_check_private_key(ctx)) {
		ERR_print_errors_fp(stderr);
		return ERR_HAPPENED;
	} else {
		TRACE0("====> Step 3: Check server private key done.\n");
	}
	
	sbio = BIO_new_ssl(ctx,0); //0: Run as server; non-0: Run as client.
	BIO_get_ssl(sbio, &ssl); //Retrieves the SSL pointer of BIO sbio, it can then be manipulated using the standard SSL library functions.
	if(!ssl) {
		printf("SSL pointer is NULL.\n");
		return ERR_HAPPENED;
	}

	SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); //SSL_MODE_AUTO_RETRY will cause read/write operations to only return after the handshake and successful completion.
	bbio = BIO_new(BIO_f_buffer()); //BIO_f_buffer() returns the buffering BIO method.
									//The BIO_new() function returns a new BIO using method type.
	// Add to the chain.
	sbio = BIO_push(bbio,sbio); //Data writing to bbio will be dealed with sbio.
	acpt = BIO_new_accept("443"); //Create a new accept bio.
	
	/*BIO_set_accept_bios() can be used to set a chain of BIOs which will be duplicated and 
	  prepended to the chain when an incoming connection is received. 
	  This is useful if, for example, a buffering or SSL BIO is required for each connection. 
	  The chain of BIOs must not be freed after this call, 
	  they will be automatically freed when the accept BIO is freed.*/
	
	BIO_set_accept_bios(acpt,sbio); //append sbio to acpt.
	out = BIO_new_fp(stdout,BIO_NOCLOSE);

	/*BIO_do_accept() serves two functions. 
	  When it is first called, after the accept BIO has been setup, 
	  it will attempt to create the accept socket and bind an address to it. 
	  Second and subsequent calls to BIO_do_accept() will await an incoming connection, 
	  or request a retry in non blocking mode. */
	  
	/* The first BIO_do_accept() setup the accept BIO. */
	if(BIO_do_accept(acpt) <= 0) {
		ERR_print_errors_fp(stderr);
		return ERR_HAPPENED;
	}
	TRACE0("====>Step 4: Waiting for the incoming connection...\n");
	
	/* The second BIO_do_accept() wait for the incoming connection. */
	if(BIO_do_accept(acpt) <= 0) {
		ERR_print_errors_fp(stderr);
		return ERR_HAPPENED;
	}
	
	TRACE0("====>Step 5: An connection comes.\n");

	sbio = BIO_pop(acpt);
	BIO_free_all(acpt);

	if(BIO_do_handshake(sbio) <= 0) {
		ERR_print_errors_fp(stderr);
		return ERR_HAPPENED;
	}
	TRACE0("====>Step 6: Handshake done.\n");
	memset(tmpbuf,0,1024 * sizeof(char));
	
	BIO_read(sbio,tmpbuf,1024);
	printf("\t\tRead message from client is:%s\n",tmpbuf);
	BIO_free_all(sbio);
	return 0;
}


 

====完。
第一章 基础知识.....................................................................................................................10 1.1 对称算法.....................................................................................................................10 1.2 摘要算法.....................................................................................................................10 1.3 公钥算法.....................................................................................................................11 1.4 回调函数.....................................................................................................................13 第二章 openssl 简介................................................................................................................15 2.1 openssl 简介................................................................................................................15 2.2 openssl 安装................................................................................................................15 2.2.1 linux 下的安装................................................................................................15 2.2.2 windows 编译与安装.....................................................................................15 2.3 openssl 源代码............................................................................................................16 2.4 openssl 学习方法........................................................................................................18 第三章 堆栈.............................................................................................................................19 3.1 openssl 堆栈................................................................................................................19 3.2 数据结构.....................................................................................................................19 3.3 源码.............................................................................................................................19 3.4 定义用户自己的堆栈函数.........................................................................................20 3.5 编程示例.....................................................................................................................21 第四章 哈希表.........................................................................................................................23 4.1 哈希表.........................................................................................................................23 4.2 哈希表数据结构.........................................................................................................23 4.3 函数说明.....................................................................................................................24 4.4 编程示例.....................................................................................................................26 第五章 内存分配.....................................................................................................................29 5.1 openssl 内存分配........................................................................................................29 5.2 内存数据结构.............................................................................................................29 5.3 主要函数.....................................................................................................................30 5.4 编程示例.....................................................................................................................30 第六章 动态模块加载.............................................................................................................32 6.1 动态库加载.................................................................................................................32 6.2 DSO 概述....................................................................................................................32 6.3 数据结构.....................................................................................................................32 6.4 编程示例.....................................................................................................................33 第七章 抽象IO .......................................................................................................................36 7.1 openssl 抽象IO ..........................................................................................................36 7.2 数据结构.....................................................................................................................36 7.3 BIO 函数....................................................................................................................37 7.4 编程示例.....................................................................................................................38 7.4.1 mem bio...........................................................................................................38 7.4.2 file bio .............................................................................................................38 7.4.3 socket bio ........................................................................................................39 7.4.4 md BIO............................................................................................................41 7.4.5 cipher BIO.......................................................................................................41 7.4.6 ssl BIO.............................................................................................................42 5 7.4.7 其他示例.........................................................................................................44 第八章 配置文件.....................................................................................................................45 8.1 概述.............................................................................................................................45 8.2 openssl 配置文件读取................................................................................................45 8.3 主要函数.....................................................................................................................45 8.4 编程示例.....................................................................................................................46 第九章 随机数.........................................................................................................................48 9.1 随机数.........................................................................................................................48 9.2 openssl 随机数数据结构与源码................................................................................48 9.3 主要函数.....................................................................................................................49 9.4 编程示例.....................................................................................................................50 第十章 文本数据库.................................................................................................................52 10.1 概述.........................................................................................................................52 10.2 数据结构.................................................................................................................52 10.3 函数说明.................................................................................................................53 10.4 编程示例.................................................................................................................53 第十一章 大数.........................................................................................................................56 11.1 介绍.............................................................................................................................56 11.2 openssl 大数表示........................................................................................................56 11.3 大数函数.....................................................................................................................56 11.4 使用示例.....................................................................................................................59 第十二章 BASE64 编解码.....................................................................................................66 12.1 BASE64 编码介绍.....................................................................................................66 12.2 BASE64 编解码原理..................................................................................................66 12.3 主要函数.................................................................................................................67 12.4 编程示例.................................................................................................................67 第十三章 ASN1 库..................................................................................................................70 13.1 ASN1 简介..................................................................................................................70 13.2 DER 编码....................................................................................................................71 13.3 ASN1 基本类型示例..................................................................................................71 13.4 openssl 的ASN.1 库..................................................................................................74 13.5 用openssl 的ASN.1 库DER 编解码....................................................................75 13.6 Openssl 的ASN.1 宏..................................................................................................76 13.7 ASN1 常用函数..........................................................................................................77 13.8 属性证书编码...........................................................................................................90 第十四章 错误处理.................................................................................................................95 14.1 概述.........................................................................................................................95 14.2 数据结构.................................................................................................................95 14.3 主要函数.................................................................................................................97 14.4 编程示例.................................................................................................................99 第十五章 摘要与HMAC......................................................................................................102 15.1 概述.......................................................................................................................102 15.2 openssl 摘要实现......................................................................................................102 15.3 函数说明...............................................................................................................102 6 15.4 编程示例...............................................................................................................103 15.5 HMAC.......................................................................................................................104 第十六章 数据压缩...............................................................................................................106 16.1 简介.......................................................................................................................106 16.2 数据结构...............................................................................................................106 16.3 函数说明...............................................................................................................107 16.4 openssl 中压缩算法协商..........................................................................................107 16.5 编程示例...............................................................................................................108 第十七章 RSA.......................................................................................................................109 17.1 RSA 介绍...................................................................................................................109 17.2 openssl 的RSA 实现................................................................................................109 17.3 RSA 签名与验证过程..............................................................................................110 17.4 数据结构...............................................................................................................110 17.4.1 RSA_METHOD.................................................................................................110 17.4.2 RSA............................................................................................................... 111 17.5 主要函数...............................................................................................................112 17.6 编程示例.......................................................................................................................113 17.6.1 密钥生成............................................................................................................113 17.6.2 RSA 加解密运算..........................................................................................115 17.6.3 签名与验证........................................................................................................118 第十八章 DSA.......................................................................................................................121 18.1 DSA 简介..............................................................................................................121 18.2 openssl 的DSA 实现................................................................................................121 18.3 DSA 数据结构..........................................................................................................122 18.4 主要函数...............................................................................................................123 18.5 编程示例...............................................................................................................124 18.5.1 密钥生成............................................................................................................124 18.5.2 签名与验证........................................................................................................125 第十九章DH...............................................................................................................................128 19.1 DH 算法介绍............................................................................................................128 19.2 openssl 的DH 实现..................................................................................................128 19.3 数据结构.......................................................................................................................129 19.4 主要函数...............................................................................................................130 19.5 编程示例...............................................................................................................131 第二十章 椭圆曲线...............................................................................................................134 20.1 ECC 介绍..................................................................................................................134 20.2 openssl 的ECC 实现................................................................................................134 20.3 主要函数...............................................................................................................135 20.4 编程示例...............................................................................................................135 第二十一章 EVP...................................................................................................................139 21.1 EVP 简介......................................................................................................................139 21.2 数据结构......................................................................................................................139 21.2.1 EVP_PKEY...................................................................................................139 21.2.2 EVP_MD.......................................................................................................140 7 21.2.3 EVP_CIPHER...............................................................................................141 21.2.4 EVP_CIPHER_CTX.....................................................................................142 21.3 源码结构......................................................................................................................142 21.4 摘要函数......................................................................................................................143 21.5 对称加解密函数..........................................................................................................143 21.6 非对称函数..................................................................................................................144 21.7 BASE64 编解码函数................................................................................................145 21.8 其他函数.......................................................................................................................145 21.9 对称加密过程............................................................................................................147 21.10 编程示例...............................................................................................................148 第二十二章 PEM 格式.........................................................................................................155 22.1 PEM 概述.................................................................................................................155 22.2 openssl 的PEM 实现................................................................................................155 22.3 PEM 函数.................................................................................................................156 22.4 编程示例...............................................................................................................157 第二十三章 Engine ...............................................................................................................161 23.1 Engine 概述..............................................................................................................161 23.2 Engine 支持的原理..................................................................................................161 23.3 Engine 数据结构......................................................................................................161 23.4 openssl 的Engine 源码...........................................................................................162 23.5 Engine 函数..............................................................................................................163 23.6 实现Engine 示例.................................................................................................164 第二十四章 通用数据结构...................................................................................................178 24.1 通用数据结构...............................................................................................................178 24.2 X509_ALGOR..........................................................................................................178 24.3 X509_VAL................................................................................................................179 24.4 X509_SIG .................................................................................................................181 24.5 X509_NAME_ENTRY.............................................................................................182 24.6 X509_NAME............................................................................................................182 24.7 X509_EXTENSION .................................................................................................188 24.8 X509_ATTRIBUTE..................................................................................................194 24.9 GENERAL_NAME ..................................................................................................195 第二十五章 证书申请...........................................................................................................199 25.1 证书申请介绍.......................................................................................................199 25.2 数据结构...............................................................................................................199 25.3 主要函数...............................................................................................................200 25.4 编程示例...............................................................................................................202 25.4.1 生成证书请求文件............................................................................................202 25.4.2 解码证书请求文件.......................................................................................204 第二十六章 X509 数字证书.................................................................................................206 26.1 X509 数字证书.........................................................................................................206 26.2 opessl 实现................................................................................................................206 26.3 X509 数据结构.........................................................................................................206 26.4 X509_TRUST 与X509_CERT_AUX......................................................................209 8 26.5 X509_PURPOSE ......................................................................................................211 26.6 主要函数...............................................................................................................214 26.7 证书验证...............................................................................................................217 26.7.1 证书验证项........................................................................................................217 26.7.2 Openssl 中的证书验证.................................................................................217 第二十七章 OCSP.................................................................................................................218 27.1 概述.......................................................................................................................218 27.2 openssl 实现..............................................................................................................218 27.3 主要函数...............................................................................................................218 27.4 编程示例.......................................................................................................................223 第二十八章 CRL...................................................................................................................224 28.1 CRL 介绍..................................................................................................................224 28.2 数据结构...............................................................................................................224 28.3 CRL 函数..................................................................................................................225 28.4 编程示例...............................................................................................................226 第二十九章 PKCS7...............................................................................................................229 29.1 概述...............................................................................................................................229 29.2 数据结构...............................................................................................................229 29.3 函数.......................................................................................................................230 29.4 消息编解码.............................................................................................................230 29.4.1 data ..............................................................................................................231 29.4.2 signed data...................................................................................................231 29.4.3 enveloped ....................................................................................................232 29.4.4 signed_and_enveloped ................................................................................233 29.4.5 digest ...........................................................................................................234 29.4.6 encrypted.....................................................................................................234 29.4.7 读取PEM .....................................................................................................235 29.4.8 解码pkcs7 ....................................................................................................236 第三十章 PKCS12...............................................................................................................237 30.1 概述.......................................................................................................................237 30.2 openss 实现...............................................................................................................237 30.3 数据结构.......................................................................................................................237 30.4 函数...............................................................................................................................238 30.5 编程示例...............................................................................................................240 第三十一章 SSL 实现...........................................................................................................250 31.1 概述...............................................................................................................................250 31.2 openssl 实现..............................................................................................................250 31.3 建立SSL 测试环境..............................................................................................250 31.4 数据结构...............................................................................................................251 31.5 加密套件...............................................................................................................252 31.6 密钥信息...............................................................................................................253 31.7 SESSION ..................................................................................................................253 31.8 多线程支持...........................................................................................................254 31.9 编程示例...............................................................................................................254 9 31.10 函数.......................................................................................................................265 第三十二章 Openssl 命令.....................................................................................................268 32.1 概述...............................................................................................................................268 32.2 asn1parse...................................................................................................................268 32.3 dgst...........................................................................................................................270 32.4 gendh.........................................................................................................................271 32.5 passwd.......................................................................................................................271 32.6 rand ...........................................................................................................................272 32.7 genrsa ........................................................................................................................273 32.8 req .............................................................................................................................273 32.9 x509...........................................................................................................................276 32.10 version...................................................................................................................279 32.11 speed......................................................................................................................279 32.12 sess_id .................................................................................................................280 32.13 s_server ...............................................................................................................280 32.14 s_client ................................................................................................................282 32.15 rsa........................................................................................................................284 32.16 pkcs7 ...................................................................................................................285 32.17 dsaparam .............................................................................................................285 32.18 gendsa..................................................................................................................286 32.19 enc .......................................................................................................................287 32.20 ciphers .................................................................................................................288 32.21 CA.......................................................................................................................288 32.22 verify ...................................................................................................................292 32.23 rsatul....................................................................................................................293 32.24 crl ..........................................................................................................................294 32.25 crl2pkcs7 ...........................................................................................................295 32.26 errstr ..................................................................................................................296 32.27 ocsp .............................................................................................................................296 32.28 pkcs12 .................................................................................................................299 32.29 pkcs8 ...................................................................................................................301 32.30 s_time ..................................................................................................................302 32.31 dhparam 和dh.............................................................................................................303 32.32 ecparam.................................................................................................................305 32.33 ec .........................................................................................................................306 32.34 dsa .......................................................................................................................307 32.35 nseq .....................................................................................................................308 32.36 prime ...................................................................................................................308 32.37 smime ..................................................................................................................309
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值