使用OPENSSL编写服务器和客户端代码实例

合集下载

OpenSSL命令---s_client

OpenSSL命令---s_client

OpenSSL命令---s_client/as3luyuan123/article/details/16812071⽤途:s_client为⼀个SSL/TLS客户端程序,与s_server对应,它不仅能与s_server进⾏通信,也能与任何使⽤ssl协议的其他服务程序进⾏通信。

⽤法:[cpp]1. openssl s_client [-host host] [-port port] [-connect host:port] [-verify depth] [-cert filename]2. [-certform DER|PEM] [-key filename] [-keyform DER|PEM] [-pass arg] [-CApath directory] [-CAfile filename]3. [-reconnect][-pause] [-showcerts] [-debug] [-msg] [-state] [-nbio_test] [-nbio][-crlf] [-ign_eof] [-no_ign_eof]4. [-quiet] [-ssl2] [-ssl3] [-tls1_1] [-tls1_2] [-tls1] [-dtls1] [-no_ssl2][-no_ssl3] [-no_tls1] [-no_tls1_1]5. [-no_tls1_2] [-bugs] [-cipher cipherlist] [-starttls protocol] [-engine id] [-tlsextdebug] [-no_ticket]6. [-sess_out filename] [-sess_in filename] [-rand file(s)]选项说明:-host host:设置服务地址。

-port port:设置服务端⼝,默认为4433。

-connect host:port:设置服务器地址和端⼝号。

openssl 操作手册

openssl 操作手册

OpenSSL 是一个强大的安全套接字层密码库,包含了各种加密算法的实现,提供了通用的密码安全服务。

下面是一个简要的OpenSSL 操作手册,包括一些常用的命令和选项:1. 生成密钥对:```openssl genpkey -algorithm RSA -out private_key.pemopenssl rsa -pubout -in private_key.pem -out public_key.pem```2. 生成自签名证书:```cssopenssl req -new -x509 -key private_key.pem -out cert.pem -days 365```3. 生成证书签名请求(CSR):```openssl req -new -key private_key.pem -out request.csr```4. 验证证书签名:```bashopenssl x509 -in cert.pem -text -noout```5. 导出证书为PEM 格式:```bashopenssl x509 -in cert.der -inform DER -outform PEM -out cert.pem```6. 加密数据:```cssopenssl enc -aes-256-cbc -salt -in plaintext.txt -out ciphertext.enc```7. 解密数据:```cssopenssl enc -aes-256-cbc -d -in ciphertext.enc -out plaintext.txt```8. 生成随机数:```openssl rand -out random.bin 1024```9. 验证数字签名:```cssopenssl dgst -sha256 -sign private_key.pem -in file.txt -out signature.bin openssl dgst -sha256 -verify public_key.pem -signature signature.bin file.txt```10. 生成Diffie-Hellman 密钥交换参数:```openssl dhparam -out dhparam.pem 2048```11. 生成CA 证书:```cssopenssl req -new -x509 -days 365 -extensions v3_ca -key private_ca_key.pem -out ca.pem```12. 生成服务器证书:```cssopenssl req -new -key private_server_key.pem -out server.reqopenssl x509 -req -days 365 -in server.req -CA ca.pem -CAkey private_ca_key.pem -CAcreateserial -out server.pem```13. 生成客户端证书:```cssopenssl req -new -key private_client_key.pem -out client.reqopenssl x509 -req -days 365 -in client.req -CA ca.pem -CAkey private_ca_key.pem -CAcreateserial -out client.pem```这只是一些常见的OpenSSL 命令示例,OpenSSL 还提供了许多其他功能和选项,具体可以参考官方文档或使用`man openssl` 命令来获取完整的操作手册。

用openssl进行SSL编程

用openssl进行SSL编程
ssl_verify_none表示不验证,ssl_verify_peer用于客户端时要求服务器必须提供证书,用于服务器时服务器会发出证书请求消息要求客户端提供证书,但是客户端也可以不提供
ssl_verigy_fail_if_no_peer_cert只适用于服务器且必须提供证书。他必须与ssl_verify_peer一起使用
ssl_ctx_check_private_key(ctx);
设置一个临时的rsa,在出口算法中,有规定需要这么做的。
rsa *rsa=rsa_generate_key(512,rsa_f4,null,null);
ssl_ctx_set_tmp_rsa(ctx,rsa);
用于设置验证方式。s_server_verify是以下值的逻辑或
为了从自己本身的程序中产生一个session_id,所以要给本程序设定一个session_id_context,否则程序从外部获取session_id_context来得到session_id,那很容易产生错误
长度不能大于ssl_max_ssl_session_id_length
const unsigned char s_server_session_id_context[100]="1111asdfd";
这里主要set cert_store
char *cafile=null,*capath=null;
ssl_ctx_load_verify_locations(ctx,cafile,capath);
当需要客户端验证的时候,服务器把cafile里面的可信任ca证书发往客户端。
if(cafile !=null )ssl_ctx_set_client_ca_list(ctx,ssl_load_client_ca_file(cafile));

openssl 编程入门(含完整示例)

openssl 编程入门(含完整示例)

openssl编程入门(含完整示例)易剑1.编写目的第一次跑起openssl示例并不太简单,本文的目的是为了让这个过程变得非常简单。

在开始之前,要非常感谢周立发同学,正是通过他共享的示例,较轻松的入了门。

本文档对他共享的示例中的一个小错误进行了修正,并提供了傻瓜式的“编译-生成-KEY运行”一条龙脚本(方法请参见压缩包中的readme文件),让跑第一个openssl程序变得轻轻松松。

2.示例包ssl_test.tar.gz openssl-0.9.8h-SuSE10.tar.gzssl_test.tar.gz为示例源代码包,openssl-0.9.8h-SuSE10.tar.gz为openssl二进制包,测试时是安装在/usr/local/ssl。

ssl_test.tar.gz中的示例在SuSE10中测试通过,使用的是openssl-0.9.8h,它包括如下文件:-rw-r--r--1root root1346Dec518:11cacert.pem-rwxr-xr-x1root root114Dec518:11make_key.sh-rwxr-xr-x1root root172Dec518:37mk_client.sh-rwxr-xr-x1root root172Dec518:37mk_server.sh-rw-r--r--1root root1679Dec518:11privkey.pem-rw-r--r--1root root167Dec518:39readme-rwxr-xr-x1root root38Dec518:38run_client.sh-rwxr-xr-x1root root64Dec518:38run_server.sh-rwxr-xr-x1root root1140142Dec518:38ssl_client-rw-r--r--1root root3928Dec517:31ssl_client.cpp-rwxr-xr-x1root root1139667Dec518:38ssl_server-rw-r--r--1root root4882Dec517:31ssl_server.cppreadme为包内容说明,run_server.sh用来运行服务端,run_client.sh用来运行客户端,mk_server.sh用来编译服务端,mk_client.sh用来编译客户端,make_key.sh用来生成钥匙KEY。

OpenSSL使用指南-0.5

OpenSSL使用指南-0.5

OpenSSL使用指南目录1.介绍2.编译3.运行OpenSSL.exe4.算法编程API4.1 对称算法4.1.1 DES4.1.2 AES4.1.3 RC44.1.4 EVP_4.2 公钥算法4.3 Hash算法4.4 随机数算法5.SSL协议编程API6.CA和证书7.8.参考网址9.A.示例程序B.1.介绍OpenSSL是使用非常广泛的SSL的开源实现。

由于其中实现了为SSL所用的各种加密算法,因此OpenSSL也是被广泛使用的加密函数库。

1.1 SSLSSL(Secure Socket Layer)安全协议是由Netscape公司首先提出,最初用在保护Navigator浏览器和Web服务器之间的HTTP通信(即HTTPS)。

后来SSL协议成为传输层安全通信事实上的标准,并被IETF吸收改进为TLS(Transport Layer Security)协议。

SSL/TLS协议位于TCP协议和应用层协议之间,为传输双方提供认证、加密和完整性保护等安全服务。

SSL作为一个协议框架,通信双方可以选用合适的对称算法、公钥算法、MAC 算法等密码算法实现安全服务。

1.2 OpenSSLOpenSSL是著名的SSL的开源实现,是用C语言实现的。

OpenSSL的前身是SSLeay,一个由Eric Young开发的SSL的开源实现,支持SSLv2/v3和TLSv1。

伴随着SSL协议的普及应用,OpenSSL被广泛应用在基于TCP/Socket的网络程序中,尤其是OpenSSL和Apache相结合,是很多电子商务网站服务器的典型配置。

2.编译和安装OpenSSLOpenSSL开放源代码,这对学习、分析SSL和各种密码算法提供了机会,也便于在上面进一步开发。

2.1 获得OpenSSL到OpenSSL的网站即可下载当前版本的OpenSSL源代码压缩包。

当前版本openssl-0.9.8.tar.gz,只有3M多,比较精简。

openssl编程 示例

openssl编程 示例

openssl编程示例以OpenSSL编程示例为标题的文章是关于如何使用OpenSSL库进行编程的。

OpenSSL是一个开源的加密工具包,提供了许多密码学功能,如加密、解密、签名和验证等。

在本文中,我将介绍OpenSSL 库的基本使用方法,并提供一些编程示例来帮助读者更好地理解。

OpenSSL是一个功能强大且广泛使用的加密库,可以用于开发各种应用程序,包括网络安全、数据传输和身份验证等。

它支持许多密码学算法,如对称加密算法(如AES和DES)、非对称加密算法(如RSA和ECC)以及哈希函数(如MD5和SHA-256)等。

在开始使用OpenSSL之前,我们需要安装OpenSSL库并配置开发环境。

安装OpenSSL库的具体方法因操作系统而异,可以在OpenSSL 官方网站上找到相关的安装指南。

配置开发环境主要包括设置编译器参数和链接库文件等。

一旦环境配置完成,我们就可以开始使用OpenSSL库进行编程了。

下面是一些常用的OpenSSL编程示例:1. 生成密钥对使用OpenSSL库生成非对称加密算法所需的密钥对是一个常见的操作。

以下是一个生成RSA密钥对的示例代码:```c#include <openssl/rsa.h>int main() {RSA* rsa = RSA_generate_key(2048, RSA_F4, NULL, NULL);if (rsa == NULL) {printf("Failed to generate RSA key pair\n");return -1;}// 打印公钥和私钥printf("Public Key:\n%s\n", BN_bn2hex(rsa->n));printf("Private Key:\n%s\n", BN_bn2hex(rsa->d));RSA_free(rsa);return 0;}```2. 加密和解密数据使用OpenSSL库进行数据加密和解密是保护数据安全的常见操作。

OpenSSL 编程入门

OpenSSL 编程入门

OpenSSL 编程入门作者:Eric Rescorla on Sat, 2001-09-01 01:0如果你急切的想构建一个简单的Web客户端和服务器对,这时你就需要使用SSL了..SSL是一种保护基于TCP协议的网络应用最快而且最简单的的方法,如果你正在用C语言做开发,那么对于你来说,最好的选择可能就是使用OpenSSL了. OpenSSL是在Eric Young 的SSLeay包的基础上对TSL/SSL的一个免费的执行(类似于BSD方式的License).然而, 不幸运的事情是, 伴随OpenSSL一起发布的文档和示例代码并不是很完全, 使用它的人需要更多的东西.在OpenSSL被使用之处, man手册都相当优秀,可是这些手册失去了大的背景因为它们只是参考资料而不是教程.OpenSSL的API多而复杂, 因此我们在此并不会作出一个完整的讲述. 相反,我的目的只是教会你如何去高效的使用man手册.在本文中, 我们将会通过构建一个简单的Web客户端和服务器来演示OpenSSL的基本特点. 而在后续的第二篇中我们将会介绍OpenSSL的一些高级特性, 比如会话恢复和客户端认证等.在话题开始之前, 我会认为你已经熟悉SSL和HTTP了, 或者最起码在概念层上应该有一些了解. 如果你对此一无所知, 推荐一个比较好的方法,那就是参考RFC(参见附录).由于篇幅原因, 本文只包涵了源代码的一些摘录, 完整的代码可以从作者的站点/openssl-examples/上下载.程序我们的客户端是一个简单的HTTPS(见RFC 2818)客户端,它在初始化了一个到达服务器的SSL连接之后便通过这个连接将HTTP请求传送给HTTP服务器. 然后等待服务器端的响应,并将响应信息打印在屏幕上.这是对通常那些”获取并且打印信息”的程序功能更简化的一个例子.服务器端程序是一个简单的HTTPS 服务器, 它等待从客户端发出的TCP连接, 每当接收到一个连接时,它会磋商这个连接(的合法性). 一旦这个连接被确定下来, 它会读取客户端的HTTP请求, 并将HTTP请求的响应信息传输给客户端. 当响应传输完毕时它会关闭这个连接.我们的第一个任务就是建立一个上下文对象(一个SSL_CTX), 这个上下文对象会在每次需要建立新的SSL连接的时候被用来创建一个新的连接对象. 而这些连接对象则用于SSL的握手,读和写.(使用上下文对象)这种方法有两个优点: 首先, 上下文对象允许一次初始化多个结构体, 这样就提提高了性能. 在大多数应用中, 每一个SSL连接都使用相同的加密算法(keying material)和CA(certificate authority)列表等. 而采用上面这种方法, 我们就不需要在每次连接的时都去加载这些信息(加密算法和证书), 而只需要在程序启动时将它们加载进上下文对象中. 然后,当我们需要创建一个新的连接时, 只需要将新的连接简单的指向这个上下文对象就可以了. 使用一个简单的上下文对象的第二个好处就是它允许多个SSL连接之间共享数据, 比如用于SSL会话恢复的SSL缓冲(cache). 上下文初始化由主要的四个任务组成, 通过列表1所示的initialize_ctx()函数来完成.列表 1 initialize_ctx()在应用OpenSSL之前, 整个库需要进行初始化, 这个过程通过SSL_library_init()函数来完成,它主要加载OpenSSL将会用到的算法, 如果我们想要很好的报告差错信息, 同样需要通过SSL_load_error_strings()来加载错误字符串, 否则, 就不能够将OpenSSL的错误映射为字符串.我们同样需要创建一个对象来作为错误打印的上下文. OpenSSL为输入和输出抽象了一个叫做BIO对象的概念.这样可以使得程序员针对不同种类的IO通道(socket, 中断,内存缓冲等)使用相同的函数,而唯一的差别就是在函数中使用的是不同种类的BIO对象.在本例中,我们通过将一个BIO对象与标准错误stderr绑定来打印错误信息.如果你正在写一个能够执行客户端认证的服务器或者客户端程序, 你就需要加载自己的公钥或者私钥以及相关的证书.证书存储空隙中, 并且通过SSL_CTX_use_certificate_chain_file()函数与CA证书一起被加载形成证书链表. SSL_CTX_use_PrivateKey_file()函数用来加载私钥.出于安全原因, 私钥通常通过密码来加密, 如果使用密码加密的话, 密码回调函数(通过SSL_CTX_set_default_passwd_cb()来设置)将会在获取密码时被调用的.如果你需要认证已经连接到你的客户端, OpenSSL需要知道你信任哪些CA, SSL_CTX_load_verify_locations()调用用来加载CA.为了保证安全, OpenSSL需要一个好的强性随机数源, 通常,为随机数生成器(RNG)提供种子原料是应用本身的责任, 然而,如果/dev/urandom可用的话,OPenSSL会自动的使用/var/urandom来为RNG播种, 由于/dev/urandom在Linux是标准化的, 我们不需要为它做任何事情, 这个就很方便了, 因为收集随机数很诡异,而且很容易引起系统抖动上升. 注意,如果你在一台不是Linux的系统上,你可能会在某些时刻得到错误数据, 因为随机数产生器没有被播种, OpenSSL的rand(3) man手册为你提供了更多可以参考的信息.客户端当SSL完成了对SSL上下文对象的初始化后,它已经为连接到服务器做好准备。

OPENSSL多线程实例

OPENSSL多线程实例
CHK_NULL(str);
printf ("\t issuer: %s\n", str);
OPENSSL_free (str);
X509_free (client_cert);
#endif
#include "pthread.h"
#include
#include
#include
#include
#include
#include
#define CERTF "certs/sslservercert.pem"
#define KEYF "certs/sslserverkey.pem"
int i;
SOCKET s,AcceptSocket;
WORD wVersionRequested;
WSADATA wsaData;
struct sockaddr_in service;
int line)
{
if (mode & CRYPTO_LOCK)
{
pthread_mutex_lock(&(lock_cs[type]));
lock_count[type]++;
{
ERR_print_errors_fp(stderr);
exit(3);
}
if (SSL_CTX_use_PrivateKey_file_pass(ctx, KEYF, "123456")
{
ERR_print_errors_fp(stderr);
pthread_tpid;
size_t client_len;

OpenSSL编写SSL,TLS程序

OpenSSL编写SSL,TLS程序
Certificate*
ServerKeyExchange*
CertificateRequest*
由服务端选择一种方法后在ServerHello中通知服务端, 从而完成加密算法的协商.
可用的算法为:
EDH-RSA-DES-CBC3-SHA
EDH-DSS-DES-CBC3-SHA
DES-CBC3-SHA
DHE-DSS-RC4-SHA
即RFC2246.SSL/TLS提供的安全机制可以保证应用层数据在互联网络传输不被监听,伪造和窜改.
பைடு நூலகம்
openssl()是sslv2,sslv3,tlsv1的一份完整实现,内部包含了大量加密算法程序.
其命令行提供了丰富的加密,验证,证书生成等功能,甚至可以用其建立一个完整的CA.
SSL_connect(ssl);
/*接下来用SSL_write(), SSL_read()代替原有的write(),read()即可*/
SSL_read (ssl, buf, sizeof(buf));
根据RFC2246(TLS1.0)整个TLS(SSL)的流程如下:
EXP1024-RC2-CBC-MD5
EXP1024-RC4-MD5
EDH-RSA-DES-CBC-SHA
EDH-DSS-DES-CBC-SHA
DES-CBC-SHA
EXP-EDH-RSA-DES-CBC-SHA
二、证书文件生成
除将程序编译成功外,还需生成必要的证书和私钥文件使双方能够成功验证对方,步骤如下:
1.首先要生成服务器端的私钥(key文件):
openssl genrsa -des3 -out server.key 1024

openssl使用方式

openssl使用方式

openssl使用方式
摘要:
1.OpenSSL 简介
2.OpenSSL 的使用方式
3.示例:使用OpenSSL 进行加密和解密
4.小结
正文:
OpenSSL 是一个安全套接字层(SSL)和传输层安全(TLS)协议的开源加密库,广泛应用于互联网的安全通信。

它支持多种加密算法、数字签名、证书管理等功能,为网络应用程序提供了安全的通信功能。

OpenSSL 的使用方式主要分为以下几个步骤:
1.安装OpenSSL 库:首先,你需要在你的计算机或服务器上安装OpenSSL 库。

在Linux 系统中,可以使用“sudo apt-get install openssl”命令进行安装。

在Windows 系统中,可以通过访问OpenSSL 官网下载相应版本的安装包进行安装。

2.配置OpenSSL:安装完成后,你需要对OpenSSL 进行配置,以便它能够正确地为你的应用程序提供服务。

配置过程包括设置加密算法、生成密钥和证书等。

具体的配置方法可以参考OpenSSL 的官方文档。

3.初始化OpenSSL:在应用程序中,你需要使用OpenSSL 的API 对SSL/TLS 连接进行初始化。

这一步通常包括创建一个SSL/TLS 上下文、初始化一个SSL/TLS 连接等。

4.加密和解密数据:在数据传输过程中,你需要使用OpenSSL 的API 对数据进行加密和解密。

加密过程中,你需要使用SSL/TLS 上下文和密钥对数据进行加密;解密过程中,你需要使用SSL/TLS 上下文和相应的私钥对数据进行解密。

OpenSSL编程实例

OpenSSL编程实例

客户端程序// OpenSSLClient.cpp#include <winsock2.h>#include <iostream>using namespace std;#pragma comment (lib, "Ws2_32.lib")#include "openssl/ssl.h"#pragma comment(lib, "ssleay32.lib")#pragma comment(lib, "libeay32.lib")#define SERVICE_PORT 10000const int nBufSize = 512;// 初始化2.2版本Winsockint InitWinsock(){WSADATA wsaData = {0};WORD wVer = MAKEWORD(2,2);int nRet = WSAStartup(wVer, &wsaData);if(nRet != 0){cout<<"Winsock初始化失败,错误代码是"<<nRet<<endl;}return nRet;}// 创建一个套接字SOCKET CreateSocket(){SOCKET hSocket = INVALID_SOCKET;hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(hSocket == INVALID_SOCKET){int last_err = WSAGetLastError();cout<<"创建套接字失败,错误代码是"<<last_err<<endl;}return hSocket;}// 连接到服务器int ConnectServer(SOCKET hSocket){// 填充远程套接字地址SOCKADDR_IN saServer = {0};saServer.sin_family = AF_INET;saServer.sin_port = htons(SERVICE_PORT);saServer.sin_addr.s_addr = inet_addr("127.0.0.1");// 使用远程套接字地址连接到服务器int nRet = connect(hSocket, (SOCKADDR *)&saServer, sizeof(saServer));if(nRet == SOCKET_ERROR){int last_err = WSAGetLastError();cout<<"连接失败,错误代码是"<<last_err<<endl;}return nRet;}bool InitOpenSSL(){if(!SSL_library_init())return false;SSL_load_error_strings();return true;}int PasswordCB(char *buf, int size, int flag, void *userdata){// 作者所创建的客户端程序私匙密码是12345678const char* pass = "12345678";if(size < strlen(pass) + 1)return(0);strcpy(buf, pass);return(strlen(pass));}int VerifyCB(int ok, X509_STORE_CTX *store){if(!ok){int err = X509_STORE_CTX_get_error(store);cout<<err<<":"<<X509_verify_cert_error_string(err)<<endl;}return ok;}SSL_CTX* InitSSLContext(){const SSL_METHOD *meth = NULL;SSL_CTX* ctx = NULL;meth = SSLv23_method();ctx = SSL_CTX_new(meth);// 加载客户端程序证书链if(!SSL_CTX_use_certificate_chain_file(ctx, "ClientAppChain.pem")){ cout<<"加载客户端程序证书链失败"<<endl;return NULL;}SSL_CTX_set_default_passwd_cb(ctx, PasswordCB);// 加载客户端程序私匙文件if(!SSL_CTX_use_PrivateKey_file(ctx, "ClientApp_PrivateKey.pem",SSL_FILETYPE_PEM)){ cout<<"加载客户端程序私匙文件失败"<<endl;return NULL;}// 加载客户端程序所信任的CAif(!SSL_CTX_load_verify_locations(ctx, "MyTestCA_Certificate.pem",NULL)){cout<<"加载客户端程序所信任的CA失败"<<endl;return NULL;}// 加载OpenSSL缺省信任的CAif(!SSL_CTX_set_default_verify_paths(ctx)){cout<<" 加载OpenSSL缺省信任的CA失败"<<endl;return NULL;}// 我们知道,服务器的证书链是serverApp-->ServerCA-->MyTestCA,// 所以可以明确验证深度是2,即最多检查ServerCA和MyTestCA两个CA SSL_CTX_set_verify_depth(ctx, 2);// SSL_VERIFY_PEER要求服务器提供证书,VerifyCB用于输出OpenSSL // 握手过程中验证服务器证书链失败时的错误信息SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, VerifyCB);SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);return ctx;}// 简单的校验,仅检查common namebool CheckCertificate(SSL* ssl){X509* cert = SSL_get_peer_certificate(ssl);if(cert == NULL)return false;X509_NAME* subjectName = X509_get_subject_name(cert);if(subjectName == NULL)return false;char buf[256];if(X509_NAME_get_text_by_NID(subjectName, NID_commonName, buf, 256) >0 ){if(strcmp(buf, "serverApp") == 0)return true;}return false;}void DoWork(SSL* ssl){char buf[256];while(true){if(!fgets(buf, sizeof(buf)/sizeof(buf[0]), stdin)){SSL_shutdown(ssl);break;}int len = strlen(buf);int nSent = 0;while(nSent < len){int nRet = SSL_write(ssl, buf+nSent, len-nSent);if(nRet <= 0){cout<<"SSL_write发生错误"<<endl;SSL_clear(ssl);break;}nSent += nRet;}}}int main(int argc, char* argv[]){if(InitWinsock() != 0)return -1;SOCKET hSocket = INVALID_SOCKET;SSL_CTX* ctx = NULL;SSL* ssl = NULL;BIO* sbio = NULL;int nRet = 0;try{if(!InitOpenSSL())throw -1;ctx = InitSSLContext();if(ctx == NULL)throw -1;ssl = SSL_new(ctx);hSocket = CreateSocket();if(hSocket == INVALID_SOCKET)throw -1;if(ConnectServer(hSocket) == SOCKET_ERROR) throw -1;sbio = BIO_new_socket(hSocket, BIO_NOCLOSE); SSL_set_bio(ssl, sbio, sbio);if(SSL_connect(ssl) <= 0){cout<<"SSL握手发生错误"<<endl;throw -1;}if(!CheckCertificate(ssl))throw -1;DoWork(ssl);}catch(int excpt_err){nRet = excpt_err;}//if(sbio) BIO_free(sbio);if(ssl) SSL_free(ssl);if(ctx) SSL_CTX_free(ctx);if(hSocket != INVALID_SOCKET) closesocket(hSocket);WSACleanup();return 0;}---------------------------------------------------- 服务器程序// OpenSSLServer.cpp#include <winsock2.h>#include <iostream>using namespace std;#pragma comment (lib, "Ws2_32.lib")#include "openssl/ssl.h"#pragma comment(lib, "ssleay32.lib")#pragma comment(lib, "libeay32.lib")#define SERVICE_PORT 10000const int nBufSize = 512;// 初始化2.2版本Winsockint InitWinsock(){WSADATA wsaData = {0};WORD wVer = MAKEWORD(2,2);int nRet = WSAStartup(wVer, &wsaData);if(nRet != 0){cout<<"Winsock初始化失败,错误代码是"<<nRet<<endl;}return nRet;}// 创建一个套接字SOCKET CreateSocket(){SOCKET hSocket = INVALID_SOCKET;hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(hSocket == INVALID_SOCKET){int last_err = WSAGetLastError();cout<<"创建套接字失败,错误代码是"<<last_err<<endl;}return hSocket;}// 绑定和监听int BindListen(SOCKET hSocket){// 填充本地套接字地址sockaddr_in saListen = {0};saListen.sin_family = AF_INET;saListen.sin_port = htons(SERVICE_PORT);saListen.sin_addr.s_addr = htonl(INADDR_ANY);// 把本地套接字地址绑定到监听套接字int nRet = bind(hSocket, (sockaddr*)&saListen, sizeof(sockaddr));if(nRet == SOCKET_ERROR){int last_err = WSAGetLastError();cout<<"绑定套接字失败,错误代码是"<<last_err<<endl;}else{// 开始监听nRet = listen(hSocket, 5);if(nRet == SOCKET_ERROR){int last_err = WSAGetLastError();cout<<"监听失败,错误代码是"<<last_err<<endl;}}return nRet;}// 接收连接请求SOCKET AcceptRequest(SOCKET hSocket){sockaddr_in saClient = {0};int nSALen = sizeof(sockaddr);SOCKET hClientSocket = accept(hSocket, (sockaddr*)&saClient, &nSALen);if(hClientSocket == INVALID_SOCKET){int last_err = WSAGetLastError();cout<<"接受连接请求失败,错误代码是"<<last_err<<endl;}return hClientSocket;}bool InitOpenSSL(){if(!SSL_library_init())return false;SSL_load_error_strings();return true;}int PasswordCB(char *buf, int size, int flag, void *userdata){// 作者所创建的服务器程序私匙密码是abcdefghconst char* pass = "abcdefgh";if(size < strlen(pass) + 1)return(0);strcpy(buf, pass);return(strlen(pass));}int VerifyCB(int ok, X509_STORE_CTX *store){if(!ok){int err = X509_STORE_CTX_get_error(store);cout<<err<<":"<<X509_verify_cert_error_string(err)<<endl;return ok;}SSL_CTX* InitSSLContext(){const SSL_METHOD *meth = NULL;SSL_CTX* ctx = NULL;meth = SSLv23_method();ctx = SSL_CTX_new(meth);// 加载服务器程序证书链if(!SSL_CTX_use_certificate_chain_file(ctx, "serverAppChain.pem")){ cout<<"加载服务器程序证书链失败"<<endl;return NULL;}SSL_CTX_set_default_passwd_cb(ctx, PasswordCB);// 加载服务器程序私匙文件if(!SSL_CTX_use_PrivateKey_file(ctx, "ServerApp_PrivateKey.pem",SSL_FILETYPE_PEM)){ cout<<"加载服务器程序私匙文件失败"<<endl;return NULL;// 加载服务器程序所信任的CAif(!SSL_CTX_load_verify_locations(ctx, "MyTestCA_Certificate.pem",NULL)){cout<<"加载服务器程序所信任的CA失败"<<endl;return NULL;}// 加载OpenSSL缺省信任的CAif(!SSL_CTX_set_default_verify_paths(ctx)){cout<<" 加载OpenSSL缺省信任的CA失败"<<endl;return NULL;}// 我们知道,客户端的证书链是ClientApp-->MyTestCA,// 所以可以明确验证深度是1,即只检查MyTestCASSL_CTX_set_verify_depth(ctx, 1);// SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT要求客户端提供证书,// 如果不提供的话,则校验失败。

OpenSSL程序编写步骤

OpenSSL程序编写步骤

OpenSSL程序编写步骤OpenSSL是一个开放源代码的SSL协议的产品实现,它采用C语言作为开发语言,具备了跨系统的性能。

调用OpenSSL 的函数就可以实现一个SSL加密的安全数据传输通道,从而保护客户端和服务器之间数据的安全。

头文件:#include <openssl/ssl.h>#include <openssl/err.h>基于OpenSSL的程序都要遵循以下几个步骤:(1 ) OpenSSL初始化在使用OpenSSL之前,必须进行相应的协议初始化工作,这可以通过下面的函数实现:int SSL_library_int(void);(2 ) 选择会话协议在利用OpenSSL开始SSL会话之前,需要为客户端和服务器制定本次会话采用的协议,目前能够使用的协议包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3。

需要注意的是,客户端和服务器必须使用相互兼容的协议,否则SSL会话将无法正常进行。

(3 ) 创建会话环境在OpenSSL中创建的SSL会话环境称为CTX,使用不同的协议会话,其环境也不一样的。

申请SSL会话环境的OpenSSL函数是:SSL_CTX *SSL_CTX_new(SSL_METHOD * method);当SSL会话环境申请成功后,还要根据实际的需要设置CTX的属性,通常的设置是指定SSL 握手阶段证书的验证方式和加载自己的证书。

制定证书验证方式的函数是:int SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int(*verify_callback),int(X509_STORE_CTX *));为SSL会话环境加载CA证书的函数是:SSL_CTX_load_verify_location(SSL_CTX *ctx,const char *Cafile,const char *Capath);为SSL会话加载用户证书的函数是:SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file,int type);为SSL会话加载用户私钥的函数是:SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx,const char* file,int type);在将证书和私钥加载到SSL会话环境之后,就可以调用下面的函数来验证私钥和证书是否相符:int SSL_CTX_check_private_key(SSL_CTX *ctx);(4) 建立SSL套接字SSL套接字是建立在普通的TCP套接字基础之上,在建立SSL套接字时可以使用下面的一些函数:SSL *SSl_new(SSL_CTX *ctx);//申请一个SSL套接字int SSL_set_fd(SSL *ssl,int fd);)//绑定读写套接字int SSL_set_rfd(SSL *ssl,int fd);//绑定只读套接字int SSL_set_wfd(SSL *ssl,int fd);//绑定只写套接字(5) 完成SSL握手在成功创建SSL套接字后,客户端应使用函数SSL_connect( )替代传统的函数connect( )来完成握手过程:int SSL_connect(SSL *ssl);而对服务器来讲,则应使用函数SSL_ accept ( )替代传统的函数accept ( )来完成握手过程:int SSL_accept(SSL *ssl);握手过程完成之后,通常需要询问通信双方的证书信息,以便进行相应的验证,这可以借助于下面的函数来实现:X509 *SSL_get_peer_certificate(SSL *ssl);该函数可以从SSL套接字中提取对方的证书信息,这些信息已经被SSL验证过了。

Linux中的Openssl命令及实例代码

Linux中的Openssl命令及实例代码

Linux中的Openssl命令及实例代码openssl命令的格式是"openssl command command-options args",command部分有很多种命令,这些命令需要依赖于openssl命令才能执⾏,所以称为伪命令(pseudo-command),每个伪命令都有各⾃的功能,⼤部分command都可以直接man command查看命令的⽤法和功能。

OpenSSL是⼀个强⼤的安全套接字层密码库,囊括主要的密码算法、常⽤的密钥和证书封装管理功能及SSL协议,并提供丰富的应⽤程序供测试或其它⽬的使⽤。

在OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的⽹站使⽤名为OpenSSL的开源软件包。

由于这是互联⽹应⽤最⼴泛的安全传输⽅法,被⽹银、在线⽀付、电商⽹站、门户⽹站、电⼦邮件等重要⽹站⼴泛使⽤,所以该漏洞影响范围⼴⼤。

OpenSSL有两种运⾏模式:交互模式和批处理模式。

直接输⼊openssl回车进⼊交互模式,输⼊带命令选项的openssl进⼊批处理模式。

OpenSSL整个软件包⼤概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应⽤程序。

OpenSSL的⽬录结构⾃然也是围绕这三个功能部分进⾏规划的。

对称加密算法OpenSSL⼀共提供了8种对称加密算法,其中7种是分组加密算法,仅有的⼀种流加密算法是RC4。

这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都⽀持电⼦密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常⽤的分组密码加密模式。

其中,AES使⽤的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使⽤的则是64位。

事实上,DES算法⾥⾯不仅仅是常⽤的DES算法,还⽀持三个密钥和两个密钥3DES算法。

⾮对称加密算法OpenSSL⼀共实现了4种⾮对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。

java+tomcat+openssl,https单向认证、双向认证(亲测)

java+tomcat+openssl,https单向认证、双向认证(亲测)

java+tomcat+openssl,https单向认证、双向认证(亲测)展开全文1.生成根证书、服务端证书、客户端证书1.1 生成CA根证书1.生成跟证书私钥root_private.key2.openssl genrsa -out root_private.key 10243.(私钥中包含附加信息,可推到出公钥。

使用私钥生成的证书包含对应公钥)4.生成根证书签发请求文件root.csr5.openssl req -new -key root_private.key -out root.csr -subj "/C=CN/ST=GuangDong/L=ShenZhen/O=Testcompany/OU=Test company/CN=Test company"6.生成X.509格式的CA根证书root.crt7.openssl x509 -req -days 365 -in root.csr -out root.crt -signkey root_private.key8.根据root.crt证书生成truststore JKS文件root.truststore,输入秘钥库密码123456。

9.这一步只针对双向认证,单向不需要。

10.keytool -keystore root.truststore -import -trustcacerts -file root.crt11.输入yes,信任此证书。

1.2 使用根证书签发服务端证书(正常是先签发二级证书,由二级证书对服务端签发)1.生成服务端私钥文件server_private.key2.openssl genrsa -out server_private.key 10243.签名请求文件server.csr4.openssl req -new -key server_private.key -out server.csr -subj "/C=CN/ST=GuangDong/L=ShenZhen/O=test-server/OU=test-server/CN=test-server"5.使用根证书签发服务端证书server.crt6.openssl x509 -req -days 365 -sha1 -CA root.crt -CAkey root_private.key -CAserial ca.srl -CAcreateserial -in server.csr -out server.crt7.查看证书信息8.openssl x509 -in server.crt -text -noout9.将服务端证书转换为pkcs12格式,密码12345610.openssl pkcs12 -export -in server.crt -inkey server_private.key -out server.p1211.生成服务端秘钥库server.keystore,秘钥库密码也为12345612.keytool -importkeystore -srckeystore server.p12 -destkeystore server.keystore -srcstoretype pkcs1213.查看keystore14.keytool -list -v -keystore server.keystore1.3 使用根证书签发客户端证书•生成客户端私钥文件client_private.key•openssl genrsa -out client_private.key 1024•签名请求文件client.csr•openssl req -new -key client_private.key -out client.csr -subj "/C=CN/ST=GuangDong/L=ShenZhen/O=test-client/OU=test-client/CN=test-client"•使用根证书签发客户端证书client.crt•openssl x509 -req -days 365 -sha1 -CA root.crt -CAkey root_private.key -CAserial ca.srl -CAcreateserial -in client.csr -out client.crt•证书转换为pkcs12格式,密码123456•以上生成的公私钥和证书都是PEM格式的,服务端、浏览器一般使用PKCS12格式。

openssl使用+Demo

openssl使用+Demo

openssl使⽤+Demo1. websiteSSL(secure Socket Layer)TLS(transport Layer Security) - SSL3.0基础之上提出的安全通信标准,⽬前版本是1.0openssl 主页 ->openssl 中⽂⽂档 ->2. 如何编译OpenSSL in Windows?a) 下载openssl -> openssl-0.9.8ib) 下载perl ->c) 安装perl -> ActivePerl-5.8.8.822-MSWin32-x86-280952/Installer.bat (之前先运⾏vcvars32.bat,需要运⾏perf Configure VC-WIN32来设置环境变量)d) 使windows⽀持nmake -> C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bate) 进⼊openssl路径 -> cd C:\devdiv\openssl-0.9.8i (⼯作路径)f) 创建Makefile⽂件: ms\do_ms (出现%osversion% is not defined的错误忽略即可)g) 编译动态库: nmake -f ms\ntdll.mak编译静态库: nmake -f ms\nt.mak测试动态库: nmake -f ms\ntdll.mak test测试静态库: nmake -f ms\nt.mak test安装动态库: nmake -f ms\ntdll.mak install安装静态库: nmake -f ms\nt.mak install清除上次动态库的编译,以便重新编译: nmake -f ms\ntdll.mak clean清除上次静态库的编译,以便重新编译: nmake -f ms\nt.mak clean3. 如何使⽤openssl?a) library path -> C:\devdiv\openssl-0.9.8i\out32b) include path -> C:\devdiv\openssl-0.9.8i\includec) 库⽂件 -> libeay32.lib, ssleay32.lib4. 配置⽂件在哪⾥?C:\devdiv\openssl-0.9.8i\apps\f5. 关于key:key⼀般分为public key和private key,在openssl中,private key中包含了public key的信息,所以public key不需要单独创建. 如何创建⼀个RSA key?openssl.exe genrsa -des3 -out privatekey.pem 2048 (需要添加密码保护)openssl.exe genrsa -out privatekey.pem 20486. 关于certificates(证书⽂件), 如何创建⼀个证书呢?⼀般流程是:a. 创建⼀个private keyb. 创建⼀个certificate signing request(证书请求), 这个需要a#中创建的private key.因为证书中需要包含public key,创建的priavate key中有这些信息.(openssl.exe req -new -key privatekey.pem-out cacert.csr)c. 把创建好的证书请求拿到CA(certificate authority)证书认证机构审批.7. 如何做⼀个⾃签名的证书呢?openssl.exe req -new -x509 -key privatekey.pem -out cacert.pem -days 1095(Note: privatekey.pem需要⾃⼰创建)8. Demo: 来⾃openssl⾃带的demo,略做修改.Server:1#include <openssl/rsa.h> /* SSLeay stuff */2#include <openssl/crypto.h>3#include <openssl/x509.h>4#include <openssl/pem.h>5#include <openssl/ssl.h>6#include <openssl/err.h>789#include <iostream>10#include <winsock2.h>1112#define SERVER_PORT 50031314// certificate & key 的存放路径15// Note: 必须是全路径, 否则SSL_CTX_use_certificate_file等函数16// ⽆法找到⽂件在windows平台上.17// How to:18// #privatekey.pem19// openssl.exe genrsa -out privatekey.pem 204820// #cacert.pem21// openssl.exe req -new -x509 -key privatekey.pem -out cacert.pem -days 1095 -config f 22//23#define SERVER_CERTIFICATE "c:\\config\\cacert.pem"24#define SERVER_KEY "c:\\config\\privatekey.pem"2526#pragma comment( lib, "ws2_32.lib" )27#pragma comment( lib, "libeay32.lib" )28#pragma comment( lib, "ssleay32.lib" )2930int main( int argc, char* argv[] ) {31 int ret;3233 ////////////34 // 初始化 //35 ////////////36 SSL_CTX* ctx;37 SSL_METHOD *meth;3839 SSL_load_error_strings();40 SSLeay_add_ssl_algorithms();41 meth = SSLv23_server_method();4243 ctx = SSL_CTX_new (meth);44 if (!ctx) {45 ERR_print_errors_fp(stderr);46 std::cout<<"SSL_CTX_new error."<<std::endl;47 return -1;48 }4950 if (SSL_CTX_use_certificate_file(ctx, SERVER_CERTIFICATE, SSL_FILETYPE_PEM) <= 0) {51 ERR_print_errors_fp(stderr);52 std::cout<<"SSL_CTX_use_certificate_file error."<<std::endl;53 return -1;54 }55 if (SSL_CTX_use_PrivateKey_file(ctx, SERVER_KEY, SSL_FILETYPE_PEM) <= 0) {56 ERR_print_errors_fp(stderr);57 std::cout<<"SSL_CTX_use_PrivateKey_file error."<<std::endl;58 return -1;59 }6061 if (!SSL_CTX_check_private_key(ctx)) {62 ERR_print_errors_fp(stderr);63 std::cout<<"SSL_CTX_check_private_key error."<<std::endl;64 return -1;65 }6667 ///////////////////////68 // 建⽴原始的TCP连接 //69 ///////////////////////70 WSADATA wsaData;71 SOCKET listen_socket;72 SOCKET accept_socket;73 struct sockaddr_in addr_server;74 struct sockaddr_in addr_client;75 int addr_client_len;7677 ret = WSAStartup( MAKEWORD(2, 2), &wsaData );78 if ( ret != 0 ) {79 std::cout<<"WSAStartup error."<<std::endl;80 return -1;81 }8283 listen_socket = socket (AF_INET, SOCK_STREAM, 0);84 if( listen_socket == INVALID_SOCKET ) {85 std::cout<<"socket error."<<std::endl;86 return -1;87 }8889 memset (&addr_server, 0, sizeof(addr_server));90 addr_server.sin_family = AF_INET;91 addr_server.sin_addr.S_un.S_addr = INADDR_ANY;92 addr_server.sin_port = htons (SERVER_PORT);9394 ret = bind(listen_socket, (struct sockaddr*)&addr_server, sizeof(addr_server) );95 if( ret == SOCKET_ERROR ) {96 std::cout<<"bind error."<<std::endl;97 return -1;98 }99100 ret = listen (listen_socket, 5);101 if( ret == SOCKET_ERROR ) {102 std::cout<<"listen error."<<std::endl;103 return -1;104 }105106 addr_client_len = sizeof(addr_client);107 accept_socket = accept (listen_socket, (struct sockaddr*) &addr_client, &addr_client_len);108 if( accept_socket == INVALID_SOCKET ) {109 std::cout<<"accept error."<<std::endl;110 return -1;111 }112 closesocket(listen_socket);113 std::cout<<" Connection from "<<addr_client.sin_addr.S_un.S_addr<<":"<<addr_client.sin_port<<std::endl; 114115 /////////////////////////////////////116 // TCP连接已经建⽴,执⾏Server SSL //117 /////////////////////////////////////118 SSL* ssl;119 X509* client_certificate;120 char* str;121122 ssl = SSL_new (ctx);123 if( ssl == NULL ) {124 std::cout<<"SSL_new error."<<std::endl;125 return -1;126 }127 SSL_set_fd (ssl, accept_socket);128 ret = SSL_accept (ssl);129 if( ret == -1 ) {130 std::cout<<"SSL_accept error."<<std::endl;131 return -1;132 }133134 // 获取cipher135 std::cout<<"SSL connection using: "<<SSL_get_cipher(ssl)<<std::endl;136137 // 获取客户端的证书138 client_certificate = SSL_get_peer_certificate (ssl);139 if (client_certificate != NULL) {140 std::cout<<"Client certificate:"<<std::endl;141142 str = X509_NAME_oneline (X509_get_subject_name (client_certificate), 0, 0);143 if( str == NULL ) {144 std::cout<<"X509_NAME_oneline error."<<std::endl;145 } else {146 std::cout<<"subject: "<<str<<std::endl;147 OPENSSL_free (str);148 }149150 str = X509_NAME_oneline (X509_get_issuer_name (client_certificate), 0, 0); 151 if( str == NULL ) {152 std::cout<<"X509_NAME_oneline error."<<std::endl;153 } else {154 std::cout<<"issuer: "<<str<<std::endl;155 OPENSSL_free (str);156 }157158 X509_free (client_certificate);159 } else {160 std::cout<<"Client does not have certificate. "<<std::endl;161 }162163 ////////////////164 // 数据交换 //165 ////////////////166 char buf [4096];167168 ret = SSL_read (ssl, buf, sizeof(buf) - 1);169 if( ret == -1 ) {170 std::cout<<"SSL_read error."<<std::endl;171 return -1;172 }173 buf[ret] = '\0';174 std::cout<<buf<<std::endl;175176 ret = SSL_write (ssl, "I hear you.", strlen("I hear you."));177 if( ret == -1 ) {178 std::cout<<"SSL_write error."<<std::endl;179 return -1;180 }181182 /////////////183 // Cleanup //184 /////////////185 closesocket(accept_socket);186 SSL_free (ssl);187 SSL_CTX_free (ctx);188 WSACleanup();189 return 0;190}Client:1#include <openssl/rsa.h> /* SSLeay stuff */2#include <openssl/crypto.h>3#include <openssl/x509.h>4#include <openssl/pem.h>5#include <openssl/ssl.h>6#include <openssl/err.h>789#include <iostream>10#include <winsock2.h>1112#define SERVER_IP "127.0.0.1"13#define SERVER_PORT 50031415#pragma comment( lib, "ws2_32.lib" )16#pragma comment( lib, "libeay32.lib" )17#pragma comment( lib, "ssleay32.lib" )181920int main( int argc, char* argv[] ) {21 int ret;22 ////////////23 // 初始化 //24 ////////////25 SSL_CTX* ctx;26 SSL_METHOD *meth;2728 SSL_load_error_strings();29 SSLeay_add_ssl_algorithms();30 meth = SSLv23_client_method();3132 ctx = SSL_CTX_new (meth);33 if (!ctx) {34 ERR_print_errors_fp(stderr);35 std::cout<<"SSL_CTX_new error."<<std::endl;36 return -1;37 }3839 ///////////////////////40 // 建⽴原始的TCP连接 //41 ///////////////////////42 WSADATA wsaData;43 SOCKET client_socket;44 struct sockaddr_in addr_server;4546 ret = WSAStartup( MAKEWORD(2, 2), &wsaData );47 if ( ret != 0 ) {48 std::cout<<"WSAStartup error."<<std::endl;49 return -1;50 }51 client_socket = socket (AF_INET, SOCK_STREAM, 0);52 if( client_socket == INVALID_SOCKET ) {53 std::cout<<"socket error."<<std::endl;54 return -1;55 }5657 memset (&addr_server, 0, sizeof(addr_server));58 addr_server.sin_family = AF_INET;59 addr_server.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);60 addr_server.sin_port = htons (SERVER_PORT);6162 ret = connect(client_socket, (struct sockaddr*) &addr_server, sizeof(addr_server));63 if( client_socket == SOCKET_ERROR ) {64 std::cout<<"connect error."<<std::endl;65 return -1;66 }6768 /////////////////////////////////////69 // TCP连接已经建⽴,执⾏Client SSL //70 /////////////////////////////////////71 SSL* ssl;72 X509* server_certificate;73 char* str;7475 ssl = SSL_new (ctx);76 if( ssl == NULL ) {77 std::cout<<"SSL_new error."<<std::endl;78 return -1;79 }80 SSL_set_fd (ssl, client_socket);81 ret = SSL_connect (ssl);82 if( ret == -1 ) {83 std::cout<<"SSL_accept error."<<std::endl;84 return -1;85 }8687 // 接下来的获取密码和获取服务器端证书的两部是可选的,不会影响数据交换8889 // 获取cipher90 std::cout<<"SSL connection using: "<<SSL_get_cipher(ssl)<<std::endl;9192 // 获取服务器端的证书93 server_certificate = SSL_get_peer_certificate (ssl);94 if( server_certificate != NULL ) {95 std::cout<<"Server certificate:"<<std::endl;9697 str = X509_NAME_oneline (X509_get_subject_name (server_certificate),0,0);98 if( str == NULL ) {99 std::cout<<"X509_NAME_oneline error."<<std::endl;100 } else {101 std::cout<<"subject: "<<str<<std::endl;102 OPENSSL_free (str);103 }104105 str = X509_NAME_oneline (X509_get_issuer_name (server_certificate),0,0);106 if( str == NULL ) {107 std::cout<<"X509_NAME_oneline error."<<std::endl;108 } else {109 std::cout<<"issuer: "<<str<<std::endl;110 OPENSSL_free (str);111 }112113 X509_free (server_certificate);114 } else {115 std::cout<<"Server does not have certificate. we sould Esc!"<<std::endl;116 return -1;117 }118119 ////////////////120 // 数据交换 //121 ////////////////122 char buf [4096];123124 ret = SSL_write (ssl, "Hello World!", strlen("Hello World!"));125 if( ret == -1 ) {126 std::cout<<"SSL_write error."<<std::endl;127 return -1;128 }129 ret = SSL_read (ssl, buf, sizeof(buf) - 1);130 if( ret == -1 ) {131 std::cout<<"SSL_read error."<<std::endl;132 return -1;133 }134 buf[ret] = '\0';135 std::cout<<buf<<std::endl;136 SSL_shutdown(ssl); /* send SSL/TLS close_notify */137138 /////////////139 // Cleanup //140 /////////////141 closesocket(client_socket);142 SSL_free (ssl);143 SSL_CTX_free (ctx);144 WSACleanup();145 return 0;146}最后的输出结果:Server-Console:Connection from 16777343:20314SSL connection using: AES256-SHAClient does not have certificate.Hello World!Client-Console:SSL connection using: AES256-SHAServer certificate:subject: /C=cn/ST=shanghai/L=shanghai/O=shanghai/OU=shanghai/CN=shanghai/emailAdissuer: /C=cn/ST=shanghai/L=shanghai/O=shanghai/OU=shanghai/CN=shanghai/emailAdd I hear you.。

openssl编程轻松入门(含完整示例)

openssl编程轻松入门(含完整示例)

openssl编程轻松入门(含完整示例). 编写目的第一次跑起openssl示例并不太简单,本文的目的是为了让这个过程变得非常简单。

在开始之前,要非常感谢周立发同学,正是通过他共享的示例,较轻松的入了门。

本文档对他共享的示例中的一个小错误进行了修正,并提供了傻瓜式的“编译-生成-KEY运行”一条龙脚本(方法请参见压缩包中的readme文件),让跑第一个openssl程序变得轻轻松松。

2. 示例包8. 相关头文件8.1. socket头文件#include &lt;sys/types.h&gt;#include &lt;arpa/inet.h&gt;#include &lt;netinet/in.h&gt;#include &lt;sys/socket.h&gt;8.2. SSL头文件#include &lt;openssl/ssl.h&gt;#include &lt;openssl/err.h&gt;9. 结尾上面步骤应当画得比较清楚了,结合图再对照ssl_test.tar.gz和《加密通讯协议SSL编程.pdf》就可以非常快地上手了。

ssl_test.tar.gz为示例源代码包,openssl-0.9.8h-SuSE10.tar.gz 为openssl二进制包(因超过2M,不能作为附件下载,请上官网下载),测试时是安装在/usr/local/ssl。

ssl_test.tar.gz中的示例在SuSE10中测试通过,使用的是openssl-0.9.8h,它包括如下文件:-rw-r--r-- 1 root root 1346 Dec 5 18:11 cacert.pem-rwxr-xr-x 1 root root 114 Dec 5 18:11 make_key.sh-rwxr-xr-x 1 root root 172 Dec 5 18:37 mk_client.sh-rwxr-xr-x 1 root root 172 Dec 5 18:37 mk_server.sh-rw-r--r-- 1 root root 1679 Dec 5 18:11 privkey.pem-rw-r--r-- 1 root root 167 Dec 5 18:39 readme-rwxr-xr-x 1 root root 38 Dec 5 18:38 run_client.sh-rwxr-xr-x 1 root root 64 Dec 5 18:38 run_server.sh-rwxr-xr-x 1 root root 1140142 Dec 5 18:38 ssl_client-rw-r--r-- 1 root root 3928 Dec 5 17:31 ssl_client.cpp-rwxr-xr-x 1 root root 1139667 Dec 5 18:38 ssl_server-rw-r--r-- 1 root root 4882 Dec 5 17:31 ssl_server.cppreadme为包内容说明,run_server.sh用来运行服务端,run_client.sh用来运行客户端,mk_server.sh用来编译服务端,mk_client.sh用来编译客户端,make_key.sh用来生成钥匙KEY。

使用OPENSSL编写服务器和客户端代码实例

使用OPENSSL编写服务器和客户端代码实例

使用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 <cutil.h>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,V237. 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.// 将连接付给SSL65. 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 <cutil.h>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();29. OpenSSL_add_all_algorithms();30. SSL_load_error_strings();31. ERR_load_BIO_strings();32.33.// 我们使用SSL V3,V234. EXIT_IF_TRUE((ctx = SSL_CTX_new (SSLv23_method())) == NULL);35.36.// 要求校验对方证书37. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);38.39.// 加载CA的证书40. EXIT_IF_TRUE (!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL));41.42.// 加载自己的证书43. EXIT_IF_TRUE (SSL_CTX_use_certificate_file(ctx, "client.cer", SSL_FILETYPE_PEM) <= 0) ;44.45.// 加载自己的私钥46. EXIT_IF_TRUE (SSL_CTX_use_PrivateKey_file(ctx, "client.key", SSL_FILETYPE_PEM)<= 0) ;47.48.// 判定私钥是否正确49. EXIT_IF_TRUE (!SSL_CTX_check_private_key(ctx));50.51.// 创建连接52. nFd = cutil_socket_new(SOCK_STREAM);53. if(cutil_socket_connect(nFd, "127.0.0.1", 8812, 30) < 0)54. {55. cutil_log_error("连接服务器失败\n");56. return -1;57. }58.59.// 将连接付给SSL60. EXIT_IF_TRUE( (ssl = SSL_new (ctx)) == NULL);61. SSL_set_fd (ssl, nFd);62. EXIT_IF_TRUE( SSL_connect (ssl) != 1);63.64.// 进行操作65. sprintf(szBuffer, "this is from client %d", getpid());66. SSL_write(ssl, szBuffer, strlen(szBuffer));67.68.// 释放资源69. memset(szBuffer, 0, sizeof(szBuffer));70. nLen = SSL_read(ssl,szBuffer, sizeof(szBuffer));71. fprintf(stderr, "Get Len %d %s ok\n", nLen, szBuffer);72.73. SSL_free (ssl);74. SSL_CTX_free (ctx);75. close(nFd);76.}。

OpenSSLsocket客户端

OpenSSLsocket客户端

OpenSSLsocket客户端这是我从⽹上找来的,改好了的。

需要添加⼀下include 和 lib 路径1 #define WIN32_LEAN_AND_MEAN23 #include <stdio.h>4 #include <stdlib.h>5 #include <errno.h>6 #include <string.h>7 #include <sys/types.h>8 #include <Windows.h>9 #include <WinSock2.h>10 #include <MSWSock.h>11 #include <WS2tcpip.h>12 #include <openssl/ssl.h>13 #include <openssl/err.h>14 #pragma comment(lib, "ws2_32.lib")15 #pragma comment(lib, "libssl.lib")16 #pragma comment(lib, "libcrypto.lib")17 #pragma comment(lib, "Crypt32.lib")18 #define bzero ZeroMemory19 #define close closesocket2021 #define MAXBUF 10242223void ShowCerts(SSL * ssl)24 {25 X509 *cert;26char *line;27 cert = SSL_get_peer_certificate(ssl);28if (cert != NULL)29 {30 printf("数字证书信息:\n");31 line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);32 printf("证书: %s\n", line); free(line);33 line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);34 printf("颁发者: %s\n", line);35 free(line); X509_free(cert);36 } else37 printf("⽆证书信息!\n");38 }3940/************关于本⽂档********************************************41 *************filename: ssl-client.c42 **************purpose: 演⽰利⽤OpenSSL 库进⾏基于IP层的SSL 加密通讯的⽅法,这是客户端例⼦43 ***********************************************************************************/4445int main(int argc, char **argv){46 SOCKET sockfd, len;47struct sockaddr_in dest;48char buffer[MAXBUF + 1];49 SSL_CTX *ctx; SSL *ssl;50if (argc != 3)51 {52 printf("参数格式错误!正确⽤法如下:\n\t\t%s IP地址端⼝\n\t⽐如:\t%s 127.0.0.1 80\n此程序⽤来从某个IP 地址的服务器某个端⼝接收最多MAXBUF 个字节的消息", argv[0], argv[0]);53 exit(0);54 }5556/* SSL 库初始化,参看ssl-server.c 代码*/57 SSL_library_init();58 OpenSSL_add_all_algorithms();59 SSL_load_error_strings();60// SSL_CTX_new(SSLv23_server_method());61 ctx = SSL_CTX_new(SSLv23_client_method());62if (ctx == NULL) {63 ERR_print_errors_fp(stdout);64 exit(1);65 }6667 WSADATA wsaData;68int iResult = 0;69 iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);70if (iResult != NO_ERROR) {71 wprintf(L"Error at WSAStartup()\n");72return 1;73 }7475/* 创建⼀个socket ⽤于tcp 通信*/76if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)77 {78 perror("Socket");79 exit(errno);80 }8182 printf("socket created\n");838485/* 初始化服务器端(对⽅)的地址和端⼝信息*/86 bzero(&dest, sizeof(dest));87 dest.sin_family = AF_INET;88 dest.sin_port = htons(atoi(argv[2]));8990if (inet_pton(AF_INET, argv[1], &dest.sin_addr.s_addr) == 0) {91 perror(argv[1]);92 exit(errno);93 }94 printf("address created\n");95/* 连接服务器*/96if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {97 printf("Connect error:%d", WSAGetLastError());98 exit(errno);99 }100 printf("server connected\n");101/* 基于ctx 产⽣⼀个新的SSL */102 ssl = SSL_new(ctx);103 SSL_set_fd(ssl, sockfd);104/* 建⽴SSL 连接*/105if (SSL_connect(ssl) == -1)106 ERR_print_errors_fp(stderr);107else {108 printf("Connected with %s encryption\n",109 SSL_get_cipher(ssl));110 ShowCerts(ssl);111 }112113114 bzero(buffer, MAXBUF + 1);115 strcpy_s(buffer,MAXBUF, "from client->server");116117/* 发消息给服务器*/118 len = SSL_write(ssl, buffer, strlen(buffer));119if (len < 0)120 {121char err[256] = { 0 };122 strerror_s(err, errno);123 printf("消息'%s'发送失败!错误代码是%d,错误信息是'%s'\n", 124 buffer, errno, err);125 }126else127 printf("消息'%s'发送成功,共发送了%d个字节!\n",128 buffer, len);129130131132/* 接收对⽅发过来的消息,最多接收MAXBUF 个字节*/133 bzero(buffer, MAXBUF + 1);134135/* 接收服务器来的消息*/136 len = SSL_read(ssl, buffer, MAXBUF);137if (len > 0)138 printf("接收消息成功:'%s',共%d个字节的数据\n",139 buffer, len);140else {141char err[256] = { 0 };142 strerror_s(err, errno);143 printf("消息接收失败!错误代码是%d,错误信息是'%s'\n", 144 errno, err);145goto finish;146 }147148 finish:149/* 关闭连接*/150 SSL_shutdown(ssl);151 SSL_free(ssl);152 close(sockfd);153 SSL_CTX_free(ctx);154155return 0;156157 }。

pythonsslsocket的使用(服务器+客户端)

pythonsslsocket的使用(服务器+客户端)

pythonsslsocket的使用(服务器+客户端)首先,使用如下命令生成证书和key:openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem接下来实现服务器:import socket, ssl,timecontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1)context.load_cert_chain(certfile="cert.pem",keyfile="key.pem")bindsocket = socket.socket()bindsocket.bind(('191.8.1.235', 10023))bindsocket.listen(5)def do_something(connstream, data):#print("data length:",len(data))return Truedef deal_with_client(connstream):t_recv=0t_send=0n = 0t1=time.clock()data = connstream.recv(1024)t2=time.clock()print("receive time:",t2-t1)# empty data means the client is finished with uswhile data:if not do_something(connstream, data):# we'll assume do_something returns False# when we're finished with clientbreakn = n + 1t1=time.clock()connstream.send(b'b'*1024)t2=time.clock()t_send += t2-t1print("send time:",t2-t1)t1=time.clock()data = connstream.recv(1024)t2=time.clock()t_recv +=t2-t1print("receive time:",t2-t1)print("avg send time:",t_send/n,"avg receive time:",t_recv/n) # finished with clientwhile True:newsocket, fromaddr = bindsocket.accept()connstream = context.wrap_socket(newsocket, server_side=True)try:deal_with_client(connstream)finally:connstream.shutdown(socket.SHUT_RDWR)connstream.close()客户端:import socket, ssl, pprint,times = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# require a certificate from the serverssl_sock = ssl.wrap_socket(s,ca_certs="cert.pem",cert_reqs=ssl.CERT_REQUIRED)ssl_sock.connect(('191.8.1.235', 10023))pprint.pprint(ssl_sock.getpeercert())# note that closing the SSLSocket will also close the underlying socketn=0t_send=0t_recv=0while n <1000:n = n+1t1=time.clock()ssl_sock.send(b'a'*100)t2=time.clock()t_send += t2-t1print("send time:",t2-t1)t1=time.clock()data=ssl_sock.recv(1024)t2=time.clock()t_recv += t2-t1print("receive time:",t2-t1)#print(len(data))print("avg send time:",t_send/n,"avg receive time:",t_recv/n) #ssl_sock.send(b'')ssl_sock.close()。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 <cutil.h>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,V237. 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.// 将连接付给SSL65. 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 <cutil.h>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();29. OpenSSL_add_all_algorithms();30. SSL_load_error_strings();31. ERR_load_BIO_strings();32.33.// 我们使用SSL V3,V234. EXIT_IF_TRUE((ctx = SSL_CTX_new (SSLv23_method())) == NULL);35.36.// 要求校验对方证书37. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);38.39.// 加载CA的证书40. EXIT_IF_TRUE (!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL));41.42.// 加载自己的证书43. EXIT_IF_TRUE (SSL_CTX_use_certificate_file(ctx, "client.cer", SSL_FILETYPE_PEM) <= 0) ;44.45.// 加载自己的私钥46. EXIT_IF_TRUE (SSL_CTX_use_PrivateKey_file(ctx, "client.key", SSL_FILETYPE_PEM)<= 0) ;47.48.// 判定私钥是否正确49. EXIT_IF_TRUE (!SSL_CTX_check_private_key(ctx));50.51.// 创建连接52. nFd = cutil_socket_new(SOCK_STREAM);53. if(cutil_socket_connect(nFd, "127.0.0.1", 8812, 30) < 0)54. {55. cutil_log_error("连接服务器失败\n");56. return -1;57. }58.59.// 将连接付给SSL60. EXIT_IF_TRUE( (ssl = SSL_new (ctx)) == NULL);61. SSL_set_fd (ssl, nFd);62. EXIT_IF_TRUE( SSL_connect (ssl) != 1);63.64.// 进行操作65. sprintf(szBuffer, "this is from client %d", getpid());66. SSL_write(ssl, szBuffer, strlen(szBuffer));67.68.// 释放资源69. memset(szBuffer, 0, sizeof(szBuffer));70. nLen = SSL_read(ssl,szBuffer, sizeof(szBuffer));71. fprintf(stderr, "Get Len %d %s ok\n", nLen, szBuffer);72.73. SSL_free (ssl);74. SSL_CTX_free (ctx);75. close(nFd);76.}。

相关文档
最新文档