PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] OpenSSL-Problem



PWR
07-09-2005, 16:04
Hallo,

Beschäftige mich nun schon seit einiger Zeit mit OpenSSL und hab mit folgendem Beispiel ein Problem. Das Programm sollte letztendlich nicht mehr tun, als auf Port 40000 auf einkommende SSL-Verbindungen warten. (Das ganze ist ein abgeänderter Auszug aus einem größeren Projekt, an dem ich arbeite)



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>

#define OpenSSL_add_ssl_algorithms() SSL_library_init()
#define SSLeay_add_ssl_algorithms() SSL_library_init()
#include <openssl/ssl.h>
#include <openssl/err.h>
SSL *ssl = NULL;
SSL_CTX *ctx = NULL;

int main(int argc, char *argv[]) {

struct sockaddr_in addr;
struct hostent *host;
int sockfd;
int addr_len;

puts("doing some ssl stuff");
SSL_load_error_strings();
SSL_library_init();

/* creating new SSL_CTX object */
if((ctx = SSL_CTX_new(SSLv23_method())) == NULL)
perror("SSL_CTX_new() failed: ");

if((ssl = SSL_new(ctx)) == NULL)
perror("SSL_new() failed: ");

puts("socket stuff");
if(!inet_aton(argv[1], &addr.sin_addr)) {
host = gethostbyname(argv[1]);
if(!host) {
perror("gethotbyname() failed: ");
return -1;
}
addr.sin_addr = *(struct in_addr*)host->h_addr;
}

addr.sin_family = AF_INET;
addr.sin_port=htons(40000);
addr.sin_addr.s_addr = INADDR_ANY;

puts("creating socket");
/* create socket */
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("sockfd() failed: ");
return -1;
}

puts("binding socket");
/* binding socket */
if((bind(sockfd, (struct sockaddr *)&addr,
sizeof(struct sockaddr))) == -1) {
perror("bind() failed: ");
return -1;
}

if(!SSL_set_fd(ssl, sockfd)) {
perror("SSL_set_fd() failed: ");
exit(-1);
}

if(SSL_accept(ssl) != 1) {
perror("SSL_accept() failed: ");
exit(-1);
}

return 0;
}


Kompilieren lässt sich alles problemlos. Beim Ausführen hingegen bekomme ich diesen Output:


[src] ./ssltest 192.168.1.117
doing some ssl stuff
socket stuff
creating socket
binding socket
SSL_accept() failed: : Transport endpoint is not connected
Bis zu SSL_accept(ssl) arbeitet alles. Kann aber mit der Fehlermeldung nix anfangen.
(Der Output ist unabhängig von der IP-Adresse, die ich dem Programm mitgebe.) Hab schon Google durchwühlt nach dem Fehler, bin aber auf nichts wirklich Brauchbares gestoßen.
(Daten: gcc 3.3.6, OpenSSL 0.9.7, Debian Sid)
Würd mich sehr über etwas Hilfe freuen.

Viele Grüße, Philipp

anda_skoa
07-09-2005, 16:27
Vielleicht mußt du zuerst ein normales accept() machen und dann erst den Socket mit dem SSL Socket verbinden.

Ciao,
_

PWR
08-09-2005, 16:33
Hat gestimmt, vielen Dank - in der offiziellen OpenSSL Dokumentation ging das leider etwas unter.