2017-05-29 8 views
1

Ich versuche, einen Web-Service-Client in einem RHEL 4-System (openssl 0.9.8b) zu codieren (Upgrade ist keine Option). Ich habe die CA-Cert-Datei zu verwenden, mit zwei Zertifikaten, eines ist ein selbstsigniertes Stammzertifikat. Es funktioniert mit "openssl s_client", aber nicht mit Code. Dort bekomme ich den Fehler 7 (SSL-Zertifikat-Validierung fehlgeschlagen) von SSL_get_verify_result.SSL-Serverzertifikatverifizierung schlägt im Code fehl, aber nicht mit openssl

ich ein Testprogramm, sind die grundlegenden Teile hier gemacht:

SSL_library_init(); 
SSL_load_error_strings(); 
ctx = SSL_CTX_new(SSLv23_method()); 
SSL_CTX_load_verify_locations(ctx, "/etc/pki/mycert/cacert.pem", 0); 
ssl = SSL_new(ctx); 
sbio = BIO_new_socket(sock, BIO_NOCLOSE); /* The socket is already connected */ 
SSL_set_bio(ssl, sbio, sbio); 
SSL_connect(ssl); 
err = SSL_get_verify_result(ssl); 

Die Verbindung funktioniert und der Server sendet sein Zertifikat; Ich habe es mit PEM_write_X509 ausgegeben und verifiziert, dass es von "openssl verify" akzeptiert wird.

ich verwendet habe

SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, verify_callback); 

, um die Schritte der Verifikation in einer Callback-Funktion zu schreiben:

static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) 
{ 
    char buf[256]; 
    X509 *err_cert; 
    int  err, depth; 

    err_cert = X509_STORE_CTX_get_current_cert(ctx); 
    err = X509_STORE_CTX_get_error(ctx); 
    depth = X509_STORE_CTX_get_error_depth(ctx); 

    X509_NAME_oneline(X509_get_subject_name(err_cert), buf, 256); 

if (!preverify_ok) 
    printf("verify error:num=%d:%s:depth=%d:%s\n", err, 
      X509_verify_cert_error_string(err), depth, buf); 
else 
    printf("Preverify OK, depth=%d:%s, err=%d\n", depth, buf, err); 
... 

Der Ausgang dieses ist (einige Zertifikatsdaten ersetzt durch „...“):

Preverify OK, depth=2:/ST=GP/L=JHB/C ... QA Root CA 01, err=0 
Preverify OK, depth=1:/C=ZA/DC=za/DC ... QA Issue CA 01, err=0 
verify error:num=7:certificate signature failure:depth=0:/C=ZA ... 

Wenn "openssl s_client" mit dieser CA cert-Datei als "-CAfile" läuft, wird die Ausgabe beginnt mit:

depth=2 /ST=GP/L=JHB/C ... QA Root CA 01 
verify return:1 
depth=1 /C=ZA/DC=za/DC ... QA Issue CA 01 
verify return:1 
depth=0 /C=ZA/ST ... 
verify return:1 

Also, was ist der Unterschied zwischen dem, was „openssl s_client“ tut, und was der Code tut?

Antwort

0

Ich habe es durch Hinzufügen von "OpenSSL_add_all_algorithms()" zum Code arbeiten. Es stellte sich heraus, dass der vom Server-Cert verwendete Algorithmus nicht gefunden wurde. Der Unterschied zwischen dem Code und dem Befehl openssl s_client ist offensichtlich dieser Aufruf.

Der Code im Testprogramm wurde aus dem Axis2/C Quellcode entnommen, da mein Client auf Axis2/C basiert. Also dieser Anruf fehlt auch dort.

Verwandte Themen