64,654
社区成员
发帖
与我相关
我的任务
分享
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;
}
}