Hello !
Here is again the complete code as of now.
The restricitions are removed so far.
Output from Server:
SSL PrivateKey opened successfully
LOG; Now accepting connections on fd...connection accepted.
LOG; Now accepting (ssl)...SSL Handshake (SSL_accept) failed - error
code -1
SSH Handshake error 1= SSL_ERROR_SSLErr during Handshake from SSL error
queue: error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared
cipher
Output from Client:
bin/Linux_2.6.4# ./testConsumer
SSL certificate opened successfully
LOG; Trying to connect (fd)...connected.
LOG; Trying to connect (ssl)...connecting SSL socket failed
Many thanks !
Florian
--
server.c
----------------------------------------------------
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include </usr/include/openssl/ssl.h>
#include </usr/include/openssl/err.h>
#include </usr/include/openssl/crypto.h>
#include </usr/include/openssl/x509.h>
#include </usr/include/openssl/pem.h>
#include <unistd.h>
#define certificate_file "/root/security/server.crt"
#define key_file "/root/security/server.key"
#define CA_FILE "/certs/1024scert.pem"
int main()
{
int m_fd;
SSL* m_ssl;
SSL_CTX* m_ctx;
SSL_library_init();
SSL_load_error_strings();
m_ctx=SSL_CTX_new(SSLv3_server_method());
if(!m_ctx)
{
cout << "failed to create SSL context" << endl;
}
m_ssl=SSL_new(m_ctx);
OpenSSL_add_all_algorithms();
if(!m_ssl)
{
cout << "failed to create SSL structure" << endl;
}
if((SSL_use_PrivateKey_file(m_ssl,key_file,1))!=1)
{
cout << "SSL PrivateKey file error - did not open" << endl;
}
else
{
cout << "SSL PrivateKey opened successfully" << endl;
}
// Create socket.
if ((m_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
{
cout << "Failed to create socket." << endl;
}
// Assign a port adress to the socket.
struct sockaddr_in local_addr;
memset((char *) &local_addr, 0, sizeof(sockaddr_in)); // zero out
local
address
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = inet_addr("10.1.18.65");
local_addr.sin_port = 2000;
if (bind(m_fd, (struct sockaddr *) &local_addr, sizeof(local_addr)) ==
-1)
{
cout << "Failed to assign adress to socket." << endl;
}
// Start listening.
if (listen(m_fd, 128) == -1)
{
cout << "Failed to listen to port." << endl;
}
struct sockaddr_in rem_add;
socklen_t size(sizeof(sockaddr_in));
memset((char *)&rem_add, 0, size);
// Accept connections.
cout << "LOG; Now accepting connections on fd...";
if ((m_fd = accept(m_fd, (struct sockaddr *)&rem_add, &size)) == -1)
{
cout << "failed" << endl;
}
else
{
cout << "connection accepted."<< endl;
if(SSL_set_fd(m_ssl, m_fd)!=1) //Mask initial FD as SSL socket -
from
here only use the ssl FD
{
cout << "Opening SSL connection FD failed" << endl;
}
cout << "LOG; Now accepting (ssl)...";
// !!!
int a(SSL_accept(m_ssl));
if(a==1) // Wait for SSL Handshake from the other side
{
cout << "SSL Handshake successful" << endl;
}
else
{
cout << "SSL Handshake (SSL_accept) failed - error code " << a <<
endl;
int length(0);
int errorCode = SSL_get_error(m_ssl, length);
cout << "SSH Handshake error " << errorCode << "= ";
switch (errorCode)
{
case SSL_ERROR_NONE: cout << "SSL_ERROR_NONE";
break;
case SSL_ERROR_ZERO_RETURN: cout << "SSL_ERROR_ZERO_RETURN";
break;
case SSL_ERROR_WANT_READ: cout << "SSL_ERROR_WANT_READ";
break;
case SSL_ERROR_WANT_WRITE: cout << "SSL_ERROR_WANT_WRITE";
break;
case SSL_ERROR_WANT_CONNECT: cout << "SSL_ERROR_WANT_CONNECT";
break;
case SSL_ERROR_WANT_ACCEPT: cout << "SSL_ERROR_WANT_ACCEPT";
break;
case SSL_ERROR_WANT_X509_LOOKUP: cout <<
"SSL_ERROR_WANT_X509_LOOKUP";
break;
case SSL_ERROR_SYSCALL: cout << "SSL_ERROR_SYSCALL";
break;
case SSL_ERROR_SSL: cout << "SSL_ERROR_SSL";
break;
}
unsigned long err(ERR_get_error());
cout << "Err during Handshake from SSL error queue: " <<
ERR_error_string(err, NULL) << endl;
}
}
}
----------------------------------------------------
client.c
----------------------------------------------------
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include </usr/include/openssl/ssl.h>
#include </usr/include/openssl/err.h>
#include </usr/include/openssl/crypto.h>
#include </usr/include/openssl/x509.h>
#include </usr/include/openssl/pem.h>
#include <unistd.h>
#define certificate_file "/root/security/server.crt"
#define key_file "/root/security/server.key"
#define CA_FILE "/certs/1024scert.pem"
enum messageType_e
{
MESSAGE_TYPE_REQUEST,
MESSAGE_TYPE_RETURN,
MESSAGE_TYPE_RESPONSE,
MESSAGE_TYPE_DATAGRAM
};
int main()
{
int m_fd;
SSL* m_ssl;
SSL_CTX* m_ctx;
SSL_library_init(); //FG: Initialize the SSL Libs
SSL_load_error_strings(); //FG: Load the error messages
// Create socket.
if ((m_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
{
cout << "Failed to create non-secure socket." << endl;
}
struct sockaddr_in remote_addr;
// SSL_CTX *ssl_ctx_server = SSL_CTX_new(SSLv23_server_method());
m_ctx=SSL_CTX_new(SSLv3_client_method()); //FG: create a secure
context
if(!m_ctx)
{
cout << "failed to create SSL context" << endl;
}
m_ssl=SSL_new(m_ctx);
if(!m_ssl)
{
cout << "failed to create SSL structure" << endl;
}
OpenSSL_add_all_algorithms();
if((SSL_use_certificate_file(m_ssl,certificate_file,1))!=1) //FG:
Define SSL certificate to use
{
cout << "SSL certificate file error - did not open" << endl;
}
else
{
cout << "SSL certificate opened successfully" << endl;
}
memset((char *) &remote_addr, 0, sizeof(sockaddr_in)); // zero out
local address
remote_addr.sin_family = AF_INET;
//remote_addr.sin_addr.s_addr =
m_context->getConfiguration().m_ipAddress;
//remote_addr.sin_port =
htons(m_context->getConfiguration().m_port);
remote_addr.sin_addr.s_addr = inet_addr("10.1.18.65");
remote_addr.sin_port = 2000;
cout << "LOG; Trying to connect (fd)...";
if (connect(m_fd, (struct sockaddr *)&remote_addr, sizeof
remote_addr)
== -1)
{
cout << "Failed to connect secure channel. Channel not open." << endl;
}
else
{
cout << "connected." << endl;
}
if(SSL_set_fd(m_ssl, m_fd)!=1) //Mask initial FD as SSL socket -
from here only use the ssl FD
{
cout << "Opening SSL connection FD failed" << endl;
}
sleep(10);
cout << "LOG; Trying to connect (ssl)...";
if(SSL_connect(m_ssl)!=1) //Connect SSL socket
{
cout << "connecting SSL socket failed" << endl;
}
else
{
cout << "connected." << endl;
}
// FORK.
int length(0);
while (true)
{
// Extract message type.
messageType_e messageType;
if ((length = SSL_read(m_ssl, &messageType, sizeof(messageType_e))) <
0)
{
int errorCode = SSL_get_error(m_ssl, length);
cout << "Channel State error " << errorCode << "=" << endl;
switch (errorCode)
{
case SSL_ERROR_NONE: cout << "SSL_ERROR_NONE";
break;
case SSL_ERROR_ZERO_RETURN: cout << "SSL_ERROR_ZERO_RETURN";
break;
case SSL_ERROR_WANT_READ: cout << "SSL_ERROR_WANT_READ";
break;
case SSL_ERROR_WANT_WRITE: cout << "SSL_ERROR_WANT_WRITE";
break;
case SSL_ERROR_WANT_CONNECT: cout << "SSL_ERROR_WANT_CONNECT";
break;
case SSL_ERROR_WANT_ACCEPT: cout << "SSL_ERROR_WANT_ACCEPT";
break;
case SSL_ERROR_WANT_X509_LOOKUP: cout <<
"SSL_ERROR_WANT_X509_LOOKUP";
break;
case SSL_ERROR_SYSCALL: cout << "SSL_ERROR_SYSCALL";
break;
case SSL_ERROR_SSL: cout << "SSL_ERROR_SSL";
break;
}
unsigned long err(ERR_get_error());
cout << "Err from SSL error queue: " << ERR_error_string(err, NULL)
<< endl;
}
}
}
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [email protected]
Automated List Manager [EMAIL PROTECTED]