您的位置:首页 > 运维架构

使用openssl 正确的加载公钥私钥,并建立ssl通信(客户端)

2010-01-04 20:42 381 查看
stdafx.h 文件

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <memory.h>
#include <winsock.h>
#include <windows.h>
#include <openssl/evp.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

#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); }


// ssl1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
int err ;
int sd;
struct  sockaddr_in sa;
SSL_CTX* ctx;
SSL*	ssl;
X509* server_cert;
char*	str;
char	buf[4096];
SSL_METHOD	*meth;
WSADATA		wsaData;

//初始化 windows socket 环境
printf("初始化 windows socket 环境/n");
if (WSAStartup(MAKEWORD(1,1),&wsaData))
{
return 0;
}
//初始化 openssl 环境
printf("初始化 openssl 环境/n");
SSL_load_error_strings();
SSLeay_add_ssl_algorithms();
SSL_library_init();
//ssl协议版本,v2,v3 自适应
printf("ssl协议版本,v2,v3 自适应/n");
meth=SSLv23_client_method();

ctx=SSL_CTX_new(meth);
if (!SSL_CTX_use_certificate_file(ctx,"/pik/ccgong.pem",SSL_FILETYPE_PEM)
|| !SSL_CTX_use_PrivateKey_file(ctx,"/pik/cchl02kw-ras.key",SSL_FILETYPE_PEM)
|| !SSL_CTX_check_private_key(ctx)) {
printf("Error setting up SSL_CTX/n");
return 0;
}

CHK_NULL(ctx);
//CHK_SSL(err);

//以常规的socket 编程的方式创建socket 并链接到服务器
printf("以常规的socket 编程的方式创建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("服务器ip");
sa.sin_port=htons(4000);
//链接服务器
printf("链接服务器/n");
err=connect(sd,(struct sockaddr*)&sa,sizeof(sa));
CHK_ERR(err,"connect");

//使用现有的tcp链接开启ssl 协议
printf("使用现有的tcp链接开启ssl 协议/n");
ssl=SSL_new(ctx);
CHK_NULL(ssl);
//启动SSL链接
printf("启动SSL链接/n");
SSL_set_fd (ssl, sd);
err = SSL_connect (ssl);
CHK_SSL(err);

//打印ssl 链接的算法
printf("打印ssl 链接的算法/n");
printf("SSL connection using %s/n",SSL_get_cipher(ssl));
//获得服务器证书
getchar();
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);
OPENSSL_free(str);
//获得服务器证书发者的名称;
str=X509_NAME_oneline(X509_get_issuer_name(server_cert),0,0);
CHK_NULL(str);
printf("/t issuer: %s/n",str);
OPENSSL_free(str);

X509_free(server_cert);
//发送消息 到服务器端

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);
getchar();
SSL_shutdown(ssl);

closesocket(sd);
SSL_free(ssl);
SSL_CTX_free(ctx);
return 0;
}


在连接中加入 wsock32.lib libeay32.lib ssleay32.lib 这些库文件

openssl 相关的参考资料

http://www.ibm.com/developerworks/cn/linux/l-openssl.html

http://www.openssl.org/docs/crypto/BIO_f_ssl.html

http://www.ctm.com.cn/Article/ShowArticle.asp?ArticleID=18

参考用书 精通pki 网络安全认证技术与编程实现 人民邮电出版社
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: