extern "C"
{
#include <openssl/applink.c>
}
#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/ssl.h"
#include "openssl/err.h"
#include "openssl/rand.h"
/*所有需要的参数信息都在此处以#define的形式提供*/
#define CERTF "client.crt" /*客户端的证书(需经CA签名)*/
#define KEYF "client.key" /*客户端的私钥(建议加密存储)*/
#define CACERT "root.crt" /*CA 的证书*/
#define PORT 6000 /*服务端的端口*/
#define SERVER_ADDR "127.0.0.1" /*服务段的IP地址*/
#define CHK_NULL(x) if ((x)==NULL) exit (-1)
#define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(-2); }
#define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(-3); }
int main ()
{
int err;
int sd;
struct sockaddr_in sa;
SSL_CTX* ctx;
SSL* ssl;
X509* server_cert;
char* str=(char*)malloc(sizeof(char)*1024);
char buf [4096];
SSL_METHOD *meth;
int seed_int[100]; /*存放随机序列*/
WSADATA wsaData;
if(WSAStartup(MAKEWORD(1,1),&wsaData) != 0){
printf("WSAStartup()fail:%d\n",GetLastError());
return -1;
}
OpenSSL_add_ssl_algorithms(); /*初始化*/
SSL_load_error_strings(); /*为打印调试信息作准备*/
meth = (struct ssl_method_st *)TLSv1_client_method(); /*采用什么协议(SSLv2/SSLv3/TLSv1)在此指定*/
ctx = SSL_CTX_new (meth);
CHK_NULL(ctx);
SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL); /*验证与否*/
SSL_CTX_load_verify_locations(ctx,CACERT,NULL); /*若验证,则放置CA证书*/
if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0) {
/*ERR_print_errors_fp(stderr);*/printf("certificate_file0001111\n");
exit(-2);
}
if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0) {
/*ERR_print_errors_fp(stderr);*/printf("privateKey_file2222222222222\n");
exit(-3);
}
if (!SSL_CTX_check_private_key(ctx)) {
printf("Private key does not match the certificate public key\n");
exit(-4);
}
/*构建随机数生成机制,WIN32平台必需*/
srand( (unsigned)time( NULL ) );
for( int i = 0; i < 100;i++ )
seed_int[i] = rand();
RAND_seed(seed_int, sizeof(seed_int));
/*以下是正常的TCP socket建立过程 .............................. */
printf("Client:Begin tcp socket...\n");
sd = socket (AF_INET, SOCK_STREAM, 0); CHK_ERR(sd, "socket");
memset (&sa, '\0', sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr (SERVER_ADDR); /* Server IP */
sa.sin_port = htons (PORT); /* Server Port number */
err = connect(sd, (struct sockaddr*) &sa,sizeof(sa));
CHK_ERR(err, "connect");
/* TCP 链接已建立.开始 SSL 握手过程.......................... */
printf("Client:Begin SSL negotiation \n");
ssl = SSL_new (ctx);
CHK_NULL(ssl);
SSL_set_fd (ssl, sd);
err = SSL_connect (ssl);
/*CHK_SSL(err);*/
if (err<=0)
{
printf("SSL_connect error!\n");
ERR_print_errors_fp(stderr);
}
/*打印所有加密算法的信息(可选)*/
printf ("SSL connection using %s\n", SSL_get_cipher (ssl));
/*得到服务端的证书并打印些信息(可选) */
server_cert = SSL_get_peer_certificate (ssl);
CHK_NULL(server_cert);
printf ("Server certificate:\n");
str = X509_NAME_oneline (X509_get_subject_name (server_cert),0,0);
CHK_NULL(str);
printf ("\t subject: %s\n", str);
//free (str);
memset(&str,'\0',sizeof(str));
str = X509_NAME_oneline (X509_get_issuer_name (server_cert),0,0);
CHK_NULL(str);
printf ("\t issuer: %s\n", str);
/*free (str);*/
memset(&str,'\0',sizeof(str));
X509_free (server_cert); /*如不再需要,需将证书释放 */
/* 数据交换开始,用SSL_write,SSL_read代替write,read */
printf("Begin SSL data exchange\n");
err = SSL_write (ssl, "Hello World!", strlen("Hello World!"));
CHK_SSL(err);
err = SSL_read (ssl, buf, sizeof(buf) - 1);
CHK_SSL(err);
buf[err] = '\0';
printf ("Got %d chars:'%s'\n", err, buf);
SSL_shutdown (ssl); /* send SSL/TLS close_notify */
/* 收尾工作 */
free(str);
shutdown (sd,2);
SSL_free (ssl);
SSL_CTX_free (ctx);
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Win32_SSL_Test.rar (74个子文件)
Win32_SSL_Test
sslServer
Server.cpp 4KB
server.csr 1KB
sslServer.plg 1KB
root.srl 17B
sslServer.dsp 4KB
root.key 561B
sslServer.dsw 543B
client.csr 1017B
sslServer.opt 54KB
client.key 2KB
root.csr 465B
server.crt 956B
root.crt 656B
Debug
sslServer.bsc 2.68MB
Server.sbr 0B
sslServer.ilk 242KB
sslServer.pdb 481KB
sslServer.exp 584B
sslServer.pch 183KB
vc60.idb 209KB
sslServer.lib 2KB
Server.obj 29KB
vc60.pdb 108KB
sslServer.exe 164KB
client.crt 948B
server.key 2KB
sslServer.ncb 41KB
sslClient
Client.dsp 3KB
server.csr 1KB
Client.ncb 41KB
root.srl 17B
Client
Client.dsp 3KB
Client.ncb 41KB
Client.cpp 4KB
Client.dsw 537B
client.csr 741B
Client.plg 1KB
client.key 963B
ca.crt 1KB
client.p12 2KB
Client.opt 54KB
ca.key 963B
Debug
Client.obj 29KB
Client.pdb 521KB
Client.ilk 239KB
Client.pch 183KB
Client.exp 573B
vc60.idb 209KB
Client.lib 2KB
vc60.pdb 108KB
Client.exe 176KB
client.crt 3KB
root.key 561B
Client.cpp 4KB
Client.dsw 537B
client.csr 1017B
Client.plg 1KB
client.key 2KB
client.p12 2KB
Client.opt 54KB
root.csr 465B
server.crt 956B
root.crt 656B
Debug
Client.obj 29KB
Client.pdb 521KB
Client.ilk 255KB
Client.pch 183KB
Client.exp 573B
vc60.idb 209KB
Client.lib 2KB
vc60.pdb 108KB
Client.exe 176KB
client.crt 948B
server.key 2KB
共 74 条
- 1
DayThinking
- 粉丝: 350
- 资源: 27
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页