注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙漠里de烟雨

原创分享,禁止转载

 
 
 

日志

 
 

win32--OpenssL  

2013-05-01 11:33:10|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、安装openssl
setup 1:
install ActivePerl(安装版.exe或ActivePerl-5.14.3.1404-MSWin32-x64-296513.msi(这里是用WinServer2008R2 64位系统));

setup 2:
install win32Openssl(安装版Win32OpenSSL-0_9_8m.exe)

setup 3:
VC++ Directories/Include Directories, Add "C:\OpenSSL\include;"
VC++ Directories/Library Directories, Add "C:\OpenSSL\lib\VC;"

setup 4;
Copy C:\OpenSSL\bin  libeay32.dll,ssleay32.dll
and
copy C:\OpenSSL\lib  libeay32.lib,ssleay32.lib
To
the project-Directory.

 

二、自做CA自签发SSL证书

http://wenku.baidu.com/view/3135a4d73186bceb19e8bbf4.html

c:>cd  c:\openssl\bin
c:\openssl\bin >
以下命令均在此路径下进行:
1)生成server.private.key(server.key)
openssl genrsa -des3 -out server.key 1024
此时会提示密码:这里填 1234
然后一堆信息要输入:
CN
GuangDong
ShenZhen
Omnicare
Development
Tomsen
Tomsen
[ENTER]
[ENTER]

2)生成CSR(server.csr)
openssl req -new -key server.key -out server.csr -config openssl.cnf
注意,如果是早期版本,不是openssl.cnf,而是openssl.cfg。这里要替换,下同。
输入相关信息。

3)对客户端也以上1)与2)类似操作;
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr -config openssl.cnf

4)DIY属于自已的CA
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
输入密码:0000,及相关信息,可参照上面的信息;

5)用生成的CA的证书为server.csr与client.csr文件签名;
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
要输入ca.key的密码0000.

注意,如果有如下错误提示:
I am unable to access the ./demoCA/newcerts directory
./demoCA/newcerts: No such file or directory
解决方法是:
在当前目录(c:\openssl\bin)下新建子目录demoCA\newCerts,然后在\demoCA目录中新建一空文件index.txt
以及serial文件(没有后缀),以记事本方式打开serial文件,填入01这两个数保存即可。
完成后再执行上面的签名操作。


client使用的文件有:ca.crt,client.crt,client.key
server使用的文件有:ca.crt,server.crt,server.key

所需要的全部文件便生成了,要做的就是写代码了。

 

三、编写ssl通信的服务端与客户端

win32的console程序:

==================  服务端  SSL_Server ====================
文件:
1)ca.crt,server.crt,server.key三个文件放在工程SSL_Server目录下;
2)libeay32.lib,libeay32.dll以及ssleay32.lib,ssleay32.dll放在工程SSL_Server目录下;
============stdafx.h==>>

#pragma once

#include "targetver.h"
#include <stdio.h>
#include <tchar.h>

=============ssl.cpp==>>

#include "StdAfx.h"

/*****************************************************************
*SSL/TLS服务端程序WIN32版(以SSL_Server/ssl.cpp为基础)
*需要用到动态连接库libeay32.dll,ssleay.dll,(因为是安装版,故在\openssl目录下拷贝出libeay32.dll,ssleay.dll)
*同时在setting中加入ws2_32.lib libeay32.lib ssleay32.lib,(ws2_32.lib这个文件VS2010就自带)
*以上库文件在编译openssl后可在out32dll目录下找到,(因为是安装版,不是自己用openssl编译出来的,故在\lib中复制libeay32.lib ssleay32.lib)
*所需证书文件请参照文章自行生成.
*****************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>
#include <winsock2.h>
#include "openssl/rsa.h"
#include "openssl/crypto.h"
#include "openssl/x509.h"
#include "openssl/pem.h"
#include "openssl/bio.h"
#include "openssl/ssl.h"
#include "openssl/err.h"

#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")
#pragma comment(lib, "ws2_32.lib")

#define  ServerCertFile  "server.crt" //服务端的证书(需经CA签名)
#define  ServerKeyFile  "server.key" //服务端的私钥(建议加密存储)
#define  CACertFile  "ca.crt" //CA 的证书
#define  Port   8989  //准备绑定的端口


/*错误信息处理*/
#define  CHK_NULL(param)  if((param)==NULL) { ERR_print_errors_fp(stdout); exit (1); }
#define  CHK_ERR(err,msg) if((err)==-1) { perror(msg); exit(1); }
#define  CHK_SSL(err)  if((err)==-1) { ERR_print_errors_fp(stderr); exit(2); }


int _tmain(int argc, _TCHAR* argv[])
{
 int   errRes;   //错误结果;
 SSL*  sslSocket;  //SSL套接字;
 SOCKET  connectSocket; //服务端与客户端连接成功的socket:scSocket;
 SSL_CTX* sslCTX;   //SSL上下文,即SSL会话环境;

 WSADATA wsaData;
 if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
 {
  printf("WSAStartup() Failed:%d\n",GetLastError());
  return -1;
 }

/*
 初始化SSL环境;
*/
 SSL_library_init(); //SSL库初始化,进行一些必要的初始化工作,用openssl编写SSL/TLS程序时应该首先调用此函数; 也可写成OpenSSL_add_all_algorithms();即载入所有SSL算法,即 SSleay_add_ssl_algorithms(),其实调用的仍是SSL_library_init();
 SSL_load_error_strings(); //载入所有SSL错误信息(如果想打印出一些方便阅读的调试信息,便要一开始就调用此函数),调用它后,可以随时用ERR_print_errors_fp(FILE* fp)来打印错误信息;
 SSL_METHOD* method = TLSv1_server_method(); //服务器创建本次会话(通讯)所使用的协议:TLSv1协议方式;SSLv23_server_method()则是以SSL V2和V3标准兼容方式;
 sslCTX = SSL_CTX_new (method);//申请SSL会话的环境CTX(使用不同的协议进行会话,其环境也是不同的。);
 CHK_NULL(sslCTX);

/*制定证书验证方式:
 根据需要设置CTX环境的属性,一般是设置SSL握手阶段证书的验证方式:
 SSL_VERIFY_PEER表明要验证对方,SSL_VERIFY_NONE(缺省)则表明需要验证对方,
 一般客户端需要验证服务器,而服务器无需验证客户端,当然如果是相互认证,
 则双方都得验证,如下:
*/
 SSL_CTX_set_verify(sslCTX,SSL_VERIFY_PEER,NULL); //第三个参数是处理验证的回调函数,若无特殊需要,使用NULL即可;

/*加载CA证书:
 为SSL会话环境加载CA证书:若要验证,则需加载CA证书文件,第二参数为CA证书文件名,
 第三参数为CA证书的路径,如果第二个参数已经给出的带有相对路径(当前工程,或本应用程序(*.exe)的同一目录)或是绝对路径,第三参数可设为NULL;
*/
 SSL_CTX_load_verify_locations(sslCTX,CACertFile,NULL);


/*为SSL会话加载用户证书:
 加载本地证书,第二参数为本地证书(server.crt)文件名,第三参数为证书文件的结构类型:
 #define X509_FILETYPE_PEM  1
 #define X509_FILETYPE_ASN1  2
 #define X509_FILETYPE_DEFAULT 3
    失败返回-1;
*/
 if (SSL_CTX_use_certificate_file(sslCTX, ServerCertFile, SSL_FILETYPE_PEM) <= 0)
 {
  ERR_print_errors_fp(stderr);
  exit(3);
 }


/*为SSL会话加载用户私钥:
 加载自己(本地)私匙,用于签名;第二参数为自己的私匙(server.key)文件名,第三参数为私匙文件的结构类型:
 #define X509_FILETYPE_PEM 1
 #define X509_FILETYPE_ASN1 2
 #define X509_FILETYPE_DEFAULT 3
    失败返回-1;
*/
 if (SSL_CTX_use_PrivateKey_file(sslCTX, ServerKeyFile, SSL_FILETYPE_PEM) <= 0)
 {
  ERR_print_errors_fp(stderr);
  exit(4);
 }


/*
 加载了证书与私匙后,便可验证证书与私匙是否相符;
*/
 if (!SSL_CTX_check_private_key(sslCTX))
 {
  printf("Private key does not match the certificate public key\n");
  exit(5);
 }


/* 设置加密列表:
 根据SSL/TLS规范,在ClientHello中,客户端会提交一份自己能够支持的加密方法的列表,
 由服务端选择一种方法后在ServerHello中通知客户端, 从而完成加密算法的协商.
 如果不作任何指定,将选用DES-CBC3-SHA.用SSL_CTX_set_cipher_list可以指定自己希望用的
 算法(实际上只是 提高其优先级,是否能使用还要看对方是否支持).
 这里使用"RC4-MD5";即RC4做加密,MD5做消息摘要(先进行MD5运算,后进行RC4加密).
*/
 SSL_CTX_set_cipher_list(sslCTX,"RC4-MD5");
/*
 可用的算法列表有:
 EDH-RSA-DES-CBC3-SHA
 EDH-DSS-DES-CBC3-SHA
 DES-CBC3-SHA
 DHE-DSS-RC4-SHA
 IDEA-CBC-SHA
 RC4-SHA
 RC4-MD5
 EXP1024-DHE-DSS-RC4-SHA
 EXP1024-RC4-SHA
 EXP1024-DHE-DSS-DES-CBC-SHA
 EXP1024-DES-CBC-SHA
 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
 EXP-EDH-DSS-DES-CBC-SHA
 EXP-DES-CBC-SHA
 EXP-RC2-CBC-MD5
 EXP-RC4-MD5
 这些算法按一定优先级排列;
*/


 /*现在开始正常的TCP Socket过程*/
 printf("Server begin TCP socket...\n");


 int listenSocket = socket(AF_INET, SOCK_STREAM, 0);
 CHK_ERR(listenSocket, "Socket created Failed!");

 struct sockaddr_in serverAddr;
 memset(&serverAddr, 0, sizeof(serverAddr));
 serverAddr.sin_family = AF_INET;
 serverAddr.sin_addr.s_addr = INADDR_ANY;
 serverAddr.sin_port = htons(Port);

 errRes = bind(listenSocket, (struct sockaddr*)&serverAddr,sizeof(serverAddr));
 CHK_ERR(errRes, "Bind Failed!");

 errRes = listen(listenSocket, 5); //第二参数为最大等待连接数,1--5之间;
 CHK_ERR(errRes, "Listen Failed!");

 struct sockaddr_in clientAddr;
 int clientAddrLen = sizeof(clientAddr);
 connectSocket = accept(listenSocket, (sockaddr*)&clientAddr, &clientAddrLen);//此socket:connectSocket可用来在服务端和客户端之间的传递信息;
 CHK_ERR(connectSocket, "Accept Failed!");
 closesocket(listenSocket);//关闭服务端的socket,不再连接新的客户端;(在多线程服务端,不关闭此侦听socket)

 printf ("Connection from %lx, port %x\n",clientAddr.sin_addr.s_addr, clientAddr.sin_port);


 /*TCP连接已建立,开始进行服务端的SSL过程. */
 printf("Begin server side SSL negotiation...\n");
 
 //建立SSL套接字:SSL套接字是建立在普通的TCP套接字基础之上;
 sslSocket = SSL_new (sslCTX);//申请一个SSL套接字;
 CHK_NULL(sslSocket);

 SSL_set_fd (sslSocket, connectSocket);//绑定读写套接字; SSL_set_rfd()只读;SSL_set_wfd(SSL *ssl,int fd)只写;
 errRes = SSL_accept (sslSocket);//完成握手过程;客户端使用SSL_connect(SSL *ssl),服务端使用SSL_accept(SSL *ssl);
 printf("SSL_accept finished!\n");
 CHK_SSL(errRes);

 //打印所有加密算法的信息(可选);
 printf ("SSL connection using %s\n", SSL_get_cipher(sslSocket));

 /*握手过程完成之后,通常需要询问通信双方的证书信息,以便进行相应的验证*/
 X509* X509_ClientCert = SSL_get_peer_certificate(sslSocket);//SSL套接字中提取对方的证书信息整理成X509对象,这些信息已经被SSL验证过了;
 if (X509_ClientCert != NULL)
 {
  printf ("Client certificate:\n");

  //X509_NAME_oneline()将对象变成字符型,以便打印出来,下同;
  char* subjectName = X509_NAME_oneline (X509_get_subject_name (X509_ClientCert), 0, 0);//X509_get_subject_name (client_cert)得到证书所有者的名字;
  CHK_NULL(subjectName);
  printf ("\t subject: %s\n", subjectName);

  char* issuerName = X509_NAME_oneline (X509_get_issuer_name (X509_ClientCert), 0, 0);//X509_get_issuer_name (X509_ClientCert)得到证书签署者(往往是CA)的名字,参数可用通过SSL_get_peer_certificate()得到的X509对象;
  CHK_NULL(issuerName);
  printf ("\t issuer: %s\n", issuerName);

  //验证完成后,可以将证书释放,因为已经通过验证了,下面要做的事就是SSL通信了;
  X509_free (X509_ClientCert);//如不再需要,需将证书释放;
 }
 else
 {
  printf ("Client does not have certificate!\n");
 }


/*开始SSL通信:
 当SSL握手完成之后,就可以进行安全的数据传输了,在数据传输阶段,
 需要使用SSL_read()和SSL_write()来替代传统的read()和write()函数,来完成对套接字的读写操作:
*/
 printf("Begin SSL data exchange...\n");
 char buffer[4096] = {};
 int res = SSL_read (sslSocket, buffer, sizeof(buffer)/sizeof(char) - 1);
 CHK_SSL(res);
 buffer[res] = '\0';
 printf ("Recv %d characters: '%s'\n", res, buffer);

 res = SSL_write (sslSocket, "Server Say: I hear you,client!", strlen("Server Say: I hear you,client!"));
 CHK_SSL(res);
 

/* 结束SSL通信,释放资源:
 结束SSL通信,当客户端和服务器之间的数据通信完成之后,
 调用下面的函数来释放已经申请的SSL资源:
*/
 res = SSL_shutdown(sslSocket);//通知关闭SSL套接字,一般第一次res==0,当单向关闭时只须关闭这一次即可;
 if(!res) //再次调用关闭(双向关闭时须再次调用);
 {
  shutdown(connectSocket,1);
  res = SSL_shutdown(sslSocket);
 }
 switch(res)
 {
  case 1:
   break;
  case 0:
  case -1:
  default:
   perror("Shutdown failed!");
   exit(-1);
 }

 SSL_free (sslSocket);//释放SSL套接字;
 SSL_CTX_free(sslCTX);//释放SSL会话环境;
 WSACleanup();//结束 Windows Sockets DLL 的使用。

 getchar();
 return 0;
}

 


=======================  客户端 SSL_Client =====================

文件:
1)ca.crt,client.crt,client.key三个文件放在工程SSL_Server目录下;
2)libeay32.lib,libeay32.dll以及ssleay32.lib,ssleay32.dll放在工程SSL_Server目录下;

============stdafx.h==>>

#pragma once

#include "targetver.h"
#include <stdio.h>
#include <tchar.h>

=============ssl.cpp==>>

#include "stdafx.h"

//*****************************************************************//
//*SSL/TLS客户端程序WIN32版(以SSL_Client/ssl.cpp为基础)
//*需要用到动态连接库libeay32.dll,ssleay.dll,(因为是安装版,故在\openssl目录下拷贝出libeay32.dll,ssleay.dll)
//*同时在setting中加入ws2_32.lib libeay32.lib ssleay32.lib,(ws2_32.lib这个文件VS2010就自带)
//*以上库文件在编译openssl后可在out32dll目录下找到,(因为是安装版,不是自己用openssl编译出来的,故在\lib中复制libeay32.lib ssleay32.lib,下面会介绍手动编译版)
//*所需证书文件请参照文章自行生成*/
//*****************************************************************//

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>
#include <winsock2.h>
#include <openssl/rsa.h>
#include "openssl/crypto.h"
#include "openssl/x509.h"
#include "openssl/pem.h"
#include "openssl/bio.h"
#include "openssl/ssl.h"
#include "openssl/err.h"

#include "openssl/rand.h"
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")
#pragma comment(lib, "ws2_32.lib")


#define  ClientCertFile  "client.crt" //客户端的证书(需经CA签名);
#define  ClientKeyFile  "client.key" //客户端的私钥(建议加密存储);
#define  CACertFile   "ca.crt"  //CA的证书;
#define  Port    8989   //服务端的端口;
#define  ServerAddress  "127.0.0.1"  //服务端的IP地址;

#define  CHK_NULL(param)  if ((param)==NULL) { ERR_print_errors_fp(stdout); exit(-1); }
#define  CHK_ERR(err,msg) if ((err)==-1) { perror(msg); exit(-2); }
#define  CHK_SSL(err)  if ((err)==-1) { ERR_print_errors_fp(stderr); exit(-3); }

int _tmain(int argc, _TCHAR* argv[])
{
 int   errRes;   //错误结果;
 SSL*  sslSocket;  //SSL套接字;
 SOCKET  connectSocket; //socket;
 SSL_CTX* sslCTX;   //SSL上下文,即SSL会话环境;
 
 WSADATA wsaData;
 if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
 {
  printf("WSAStartup() Failed:%d\n",GetLastError());
  return -1;
 }

 //初始化SSL会话环境;
 SSL_library_init();
 SSL_load_error_strings();
 SSL_METHOD* method = TLSv1_client_method();
 sslCTX = SSL_CTX_new (method);
 CHK_NULL(sslCTX);

 //制定证书验证方式;
 SSL_CTX_set_verify(sslCTX,SSL_VERIFY_PEER,NULL);
 //加载CA证书;
 SSL_CTX_load_verify_locations(sslCTX,CACertFile,NULL);

 //为SSL会话加载用户(client.crt)证书;
 if (SSL_CTX_use_certificate_file(sslCTX, ClientCertFile, SSL_FILETYPE_PEM) <= 0)
 {
  ERR_print_errors_fp(stderr);
  exit(-2);
 }

 //为SSL会话加载用户私钥(client.key);
 if (SSL_CTX_use_PrivateKey_file(sslCTX, ClientKeyFile, SSL_FILETYPE_PEM) <= 0)
 {
  ERR_print_errors_fp(stderr);
  exit(-3);
 }

 //验证证书与私匙是否相符;
 if (!SSL_CTX_check_private_key(sslCTX))
 {
  printf("Private key does not match the certificate public key!\n");
  exit(-4);
 }


/*构建随机数生成机制,WIN32平台必需:
 在win32 的环境中客户端程序运行时出错(SSL_connect返回-1)的一个主要原因便是与UNIX平台下的随机数生成机制不同(握手的时候用得到).
 具体描述可见mod_ssl的FAQ.解决办法就是调用此函数,其中buf应该为一随机的字符串,作为"seed"(种子),
 还可以采用以下两个函数:
 void RAND_screen(void);//RAND_screen()以屏幕内容作为"seed"产生随机数;
 int RAND_event(UINT, WPARAM, LPARAM);//RAND_event可以捕获windows中的事件(event),以此为基础产生随机数,如果一直有用户干预的话,用这种办法产生的随机数能够"更加随机",但如果机器一直没人理会(如总停在登录画面),则每次都将产生同样的数字.
*/
 srand( (unsigned)time( NULL ) );
 int seed_int[100]; //存放随机序列
 for( int i = 0; i < 100;i++ )
 {
  seed_int[i] = rand();
 }
 RAND_seed(seed_int, sizeof(seed_int)/sizeof(int));


 /*现在开始正常的TCP Socket过程*/
 printf("Client begin tcp socket...\n");

 connectSocket = socket(AF_INET, SOCK_STREAM, 0);
 CHK_ERR(connectSocket, "Socket created Failed!");

 struct sockaddr_in serverAddr;
 memset(&serverAddr, 0, sizeof(serverAddr));
 serverAddr.sin_family = AF_INET;
 serverAddr.sin_addr.s_addr = inet_addr(ServerAddress); //Server IP;
 serverAddr.sin_port = htons(Port); //Server Port;

 errRes = connect(connectSocket, (sockaddr*)&serverAddr,sizeof(serverAddr));
 CHK_ERR(errRes,"Connect Failed!");

 /*TCP连接已建立,开始进行服务端的SSL过程. */
 printf("Begin client SSL negotiation... \n");

 sslSocket = SSL_new (sslCTX); //申请一个SSL套接字;
 CHK_NULL(sslSocket);

 SSL_set_fd (sslSocket, connectSocket);//绑定读写套接字;
 errRes = SSL_connect(sslSocket);//完成握手过程;
 CHK_SSL(errRes);

 //打印所有加密算法的信息(可选);
 printf ("SSL connection using %s\n", SSL_get_cipher (sslSocket));

 /*询问通信双方的证书信息,以便进行相应的验证*/
 X509*  X509_ServerCert = SSL_get_peer_certificate(sslSocket); //提取对方(服务器)的证书信息整理成X509对象;
 CHK_NULL(X509_ServerCert);

 printf ("Server certificate:\n");
 char* subjectName = X509_NAME_oneline (X509_get_subject_name (X509_ServerCert),0,0);//X509_get_subject_name (client_cert)得到证书所有者的名字;
 CHK_NULL(subjectName);
 printf ("\t subject: %s\n", subjectName);

 char* issuerName = X509_NAME_oneline (X509_get_issuer_name (X509_ServerCert),0,0);//X509_get_issuer_name (X509_ClientCert)得到证书签署者(往往是CA)的名字;
 CHK_NULL(issuerName);
 printf ("\t issuer: %s\n", issuerName);

 X509_free (X509_ServerCert); //如不再需要,释放证书;

/*开始SSL通信:
 数据交换开始,用SSL_write(),SSL_read()代替write(),read();
*/
 printf("Begin SSL data exchange...\n");
 int res = SSL_write(sslSocket, "Client Say: Hello Server!", strlen("Client Say: Hello Server!"));
 CHK_SSL(res);
 char buffer[4096] = {};
 res = SSL_read (sslSocket, buffer, sizeof(buffer)/sizeof(char) - 1);
 CHK_SSL(res);

 buffer[res] = '\0';
 printf ("Recv %d characters:'%s'\n", res, buffer);

/*结束SSL通信,释放资源:
 结束SSL通信,当客户端和服务器之间的数据通信完成之后,
 调用下面的函数来释放已经申请的SSL资源:
*/
 res = SSL_shutdown (sslSocket); //通知关闭SSLsocket套接字;
 if(!res) //再次调用关闭(双向关闭时须再次调用);
 {
  shutdown(connectSocket,1);
  res = SSL_shutdown(sslSocket);
 }
 switch(res)
 {
  case 1:
   break;
  case 0:
  case -1:
  default:
   perror("Shutdown failed!");
   exit(-1);
 }

 SSL_free (sslSocket);  //释放SSL套接字;
 SSL_CTX_free (sslCTX);  //释放SSL会话环境;
 WSACleanup();

 getchar();
 return 0;
}


以上客户端与服务端的验证通过并能正常进行SSL通信;
如果要能在其它没有安装VS2010环境下的普通系统如winxp下运行,
1)须将工程设为release版;
2)项目-->属性-->VC++目录
Include directories项中增加C:\openssl\include;
Librar Directories项中增加C:\openssl\lib\vc;
3)项目-->属性-->C/C++-->Code Generation(代码产生)
Runtime Library(运行时库)设为:Multi-threaded(/MT)
4)编译;
5)将ca.crt,server.crt,server.key三个文件与 libeay32.dll , ssleay32.dll 以及\Release中的SSL_Server.exe 一起拷贝出来放同一目录下即可(客户端类同),此时便能正常运行SSL_Server.exe程序了;

 

 

四、手动openssl编译,搭建openssl环境(这里以xp 32位系统为例,其它类似)
------Openssl在windows xp的安装(VS2010环境下)


首先,在http://www.openssl.org/ 下载Openssl

      在http://www.activestate.com/ActivePerl 下载Perl(免费版,x386,32位),这里下载的是最新版[lastest]openssl-1.0.0e的tar.gz压缩文件,解压即可;

接下来是安装过程

Step 1、安装Perl。默认就行了,就是不断下一步下一步。默认的安装目录为C:\Perl

Step 2、将下载下来的Openssl解压到C:\openssl-1.0.0e

Step 3、打开命令行窗口,转到C:\Program Files\Microsoft Visual Studio 10.0\VC\bin,接着输入 vcvars32,回车

Step 4、然后转到C:\openssl-1.0.0e下,输入perl Configure VC-WIN32,回车

Step 5、然后输入ms\do_ms.bat,回车

Step 6、最后输入nmake -f ms\ntdll.mak,回车,生成动态库.(如果想生成静态库,nmake -f ms\nt.mak)

需等待几分钟...

以上执行完后,可以在openssl目录下发现新增的三个文件夹:inc32,out32dll,tmp32dll,其中inc32存放的是对应的头文件,out32dll中存放的是一些库文件和应用程序。

 

如果要直接在命令行上使用"openssl"命令,则需要添加环境变量。将C:\openssl-1.0.0e\out32dll;C:\openssl-1.0.0e\inc32\openssl;添加到Path变量中,然后新建一个命名为OPENSSL_CONF的环境变量,其值为C:\openssl-1.0.0e\apps\openssl.cnf。

 

编程初步:
1、 打开VC-Tools-Options-Directores,在Include files中增加【Openssl1.0.0d】\inc32目录;在Libray files中增加【Openssl1.0.0d】\out32dll,VS2010则是在其项目的属性页中VC++目录...

2、 在源程序中包含以下三个头文件并加入LIB:

#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")


(可选方法)以上是最简单的安装方式,但是不能使用静态库,生成的程序必须带着DLL文件才行,下面有另外一种安装方式:

  
    将源码释放在c:\Openssl1.0.0d目录中。
   
    进入openssl源码目录。
    cd c:\Openssl1.0.0d
   
    以下为参照该目录下的文件INSTALL.W32的执行过程:

    运行configure:
    perl Configure VC-WIN32 --prefix=c:/openssl

    创建Makefile文件:
    ms\do_ms

    清除上次静态库的编译,以便重新编译:
    nmake -f ms\nt.mak clean
    编译静态库:

    nmake -f ms\nt.mak(上面是ntdll.mak,同样修改debug为release)

使用静态库,只需在Libray files中修改【c:\Openssl1.0.0d】\out32dll 为【c:\Openssl1.0.0d】\out32

 

 

  评论这张
 
阅读(7200)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018