求OpenSSL編程指南,謝謝,請給個最簡的函數調用順序

WorldCreater 2011-11-29 11:16:47
求OpenSSL編程指南,謝謝,請給個最簡的函數調用順序

服務端初始化,及啟動的函數調用順序

客户端初始化,及啟動与連結的函數調用順序

官網一直没有入門教程,網上也没找着合適的簡單的教程。

望大俠援手。不勝感激。
...全文
102 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nand库路泽 2011-12-02
  • 打赏
  • 举报
回复
肿么是繁体字啊!!
WorldCreater 2011-12-02
  • 打赏
  • 举报
回复
現在服務端已經能顯示下 ssl accept 了(可能是嘗試握手了,但没成功),不過客户端還是連接失敗


server
void ServerSocket::execute() {
string keyFile = "/home/creatxr/Downloads/autorite.cer";

SSL_load_error_strings(); /* readable error messages */
SSL_library_init(); /* initialize library */
SSL_METHOD* method;
SSL_CTX* ctx;
SSL* ssl;
method = SSLv2_server_method();
ctx = SSL_CTX_new(method);

if(SSL_CTX_use_certificate_file(ctx,keyFile.c_str(),SSL_FILETYPE_PEM)!=1) {
cout << "cer file err" << endl;
}



/*
//if(SSL_CTX_use_certificate_chain_file(ctx,keyFile.c_str())!=1) {
if(SSL_CTX_use_certificate_file(ctx,keyFile.c_str(),SSL_FILETYPE_PEM)!=1) {
cout << "cer file err" << endl;
}

if(SSL_CTX_use_PrivateKey_file(ctx,keyFile.c_str(),SSL_FILETYPE_PEM)<=0 ) {
cout << "private key file err" << endl;
}
*/

struct sockaddr_in serverAddress, clientAddress;
socklen_t socketLength;
int clientHandle;

if((serverHandle=socket(AF_INET,SOCK_STREAM,0))==-1) {
throw SocketException(errno);
}

bzero(&serverAddress, sizeof(struct sockaddr_in));
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(port);
serverAddress.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(serverHandle,(struct sockaddr *)(&serverAddress),sizeof(struct sockaddr))==-1) {
throw SocketException(errno);
}

if(listen(serverHandle,5)==-1) {
throw SocketException(errno);
}

cout << "start listening......" << endl;
while(true) {
socketLength = sizeof(struct sockaddr_in);
if((clientHandle=accept(serverHandle,(struct sockaddr *)(&clientAddress),&socketLength))==-1) {
throw SocketException(errno);
} else {
int n = 0;
do {
string str;
char buf[256];
bzero(buf,255);
//cin >> str;
ssl = SSL_new(ctx);
SSL_set_fd(ssl, clientHandle);

SSL_set_accept_state(ssl);
/*
BIO* sbio=BIO_new_socket(clientHandle,BIO_NOCLOSE);
SSL_set_bio(ssl,sbio,sbio);
*/


while(true) {
if(SSL_accept(ssl)) {

X509* cert = SSL_get_peer_certificate(ssl);
cout << cert << endl;
//cout << X509_get_subject_name(cert);
//cout << X509_NAME_oneline(X509_get_subject_name(cert),0,0) << endl;
cout << "ssl accept..." << endl;
break;}
}


cout << "aaaaaaaaaaaaaaaaaa" << endl;

for(;;) {
n = SSL_read(ssl, buf, 255);
cout << n << endl;
cout << buf << endl;
}

} while(n>0);
}

clientSet.insert(clientHandle);
cout << "client accepted......" << endl;

// cin >> str;

// close(clientHandle);
}



// close(serverHandle);
SSL_CTX_free(ctx);
}



void ClientSocket::execute() throw(SocketException) {

string keyFile = "/home/creatxr/Downloads/00.pem";

SSL_load_error_strings(); /* readable error messages */
SSL_library_init(); /* initialize library */
SSL_METHOD* method;
SSL_CTX* ctx;
SSL* ssl;
method = SSLv2_client_method();
ctx = SSL_CTX_new(method);

/*
if(SSL_CTX_use_certificate_file(ctx,keyFile.c_str(),SSL_FILETYPE_PEM)!=1) {
cout << "cer file err" << endl;
}
*/



struct sockaddr_in serverAddress;
struct hostent *host;

if((clientHandle=socket(AF_INET,SOCK_STREAM,0))==-1) {
throw SocketException(errno);
}

if (address=="") {
host = gethostbyname(hostname.c_str());
} else {
// host = gethostbyaddr(address.c_str);
}
bzero(&serverAddress, sizeof(struct sockaddr_in));
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(port);
serverAddress.sin_addr=*((struct in_addr *)host->h_addr);




if(connect(clientHandle,(struct sockaddr *)(&serverAddress),sizeof(struct sockaddr))==-1) {
throw SocketException(errno);
}

cout << "connected to server" << endl;

ssl = SSL_new(ctx);
SSL_set_connect_state(ssl);
SSL_set_fd(ssl, clientHandle);

/*
BIO* sbio=BIO_new_socket(clientHandle,BIO_NOCLOSE);
SSL_set_bio(ssl,sbio,sbio);
*/


if(SSL_connect(ssl)<=0) {
int retCode = 0;
cout << SSL_get_error(ssl, retCode) << endl;
cout << "ssl fail..." << endl;
cout << retCode << endl;
}

/*
X509* cert = SSL_get_peer_certificate(ssl);
cout << "aaaaa" << endl;
cout << cert << endl;
cout << X509_NAME_oneline(X509_get_subject_name(cert), 0, 0) << endl;
cout << "bbbb" << endl;
*/

while(true) {
string str;
cin >> str;
// cout << str.length() << endl;
///// int n = send(clientHandle, str.c_str(), str.length(),0);
//BIO_write(sbio, "adsfadf", 5);

str = "a;lsdfadsfadsfa";
int n = SSL_write(ssl, str.c_str(), str.length());

if(n<0) cout << "write socket error" << endl;
}
}
herocxgood 2011-12-01
  • 打赏
  • 举报
回复
可惜不会啊
WorldCreater 2011-12-01
  • 打赏
  • 举报
回复
我想在已經成功的tcp連接上添加最簡單的openssl應用


服務端

SSL_load_error_strings();
SSL_library_init();
SSL_METHOD* method;
SSL_CTX* ctx;
SSL* ssl;

method = TLSv1_server_method();
ctx = SSL_CTX_new(method);
if(SSL_CTX_use_certificate_file(ctx,keyFile.c_str(),SSL_FILETYPE_PEM)<=0) {
cout << "11111111111" << endl;
}
當連入客户時{
ssl = SSL_new(ctx);
SSL_set_fd(ssl, clientHandle);
while(true) {
if(SSL_accept(ssl)) {
cout << "ssl accept..." << endl;
break;}
}
// n=recv(clientHandle, buf, 255,0);
n = SSL_read(ssl, buf, 255);
cout << buf << endl;
} while(n>0);
}


客户端=============
SSL_load_error_strings(); /* readable error messages */
SSL_library_init(); /* initialize library */
SSL_METHOD* method;
SSL_CTX* ctx;
SSL* ssl;
method = TLSv1_client_method();
ctx = SSL_CTX_new(method);
........
if(connect(clientHandle,(struct sockaddr *)(&serverAddress),sizeof(struct sockaddr))==-1) {
throw SocketException(errno);
}

cout << "connected to server" << endl;

ssl = SSL_new(ctx);
SSL_set_fd(ssl, clientHandle);
//SSL_set_bio(ssl, )

if(SSL_connect(ssl)<=0) { ////////不成功
int retCode = 0;
cout << SSL_get_error(ssl, retCode) << endl;
cout << "ssl fail..." << endl;
cout << retCode << endl;
}

///// int n = send(clientHandle, str.c_str(), str.length(),0);
int n = SSL_write(ssl, str.c_str(), str.length());

if(n<0) cout << "write socket error" << endl;
}



64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧