05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

382 7 Client-/Server-Programmierung <strong>mit</strong> Open<strong>SSL</strong><br />

Um an eine Zertifikatserweiterung zu gelangen, untersucht man das Zertifikat<br />

<strong>mit</strong> der X509_get_ext_d2i()-Funktion. Die X.509-Funktionen von Open<strong>SSL</strong><br />

adressieren die einzelnen Zertifikatskomponenten über eine ganzzahlige Identifikationsnummer,<br />

die sogenannte NID. An die Erweiterung Subject Alternative<br />

Name gelangen wir <strong>mit</strong> der ID NID_subject_alt_name. Für die beiden Parameter<br />

crit <strong>und</strong> idx genügen bei der Bestimmung dieser Zertifikatserweiterung<br />

zwei Nullzeiger.<br />

Als Ergebnis einer NID_subject_alt_name-Anfrage liefert die Hilfsfunktion<br />

X509_get_ext_d2i() einen Stapel von General Names, die es im Anschluß<br />

der Reihe nach zu untersuchen gilt. Im Fehlerfall gibt die Funktion<br />

einen Nullzeiger zurück. Der Stapel von General Names muß später <strong>mit</strong>tels<br />

sk_GENERAL_NAME_free() wieder explizit freigegeben werden (siehe unten).<br />

Die ASN1_STRING_data()-Funktion bringt den Textinhalt eines dNSName-<br />

Elements schließlich in ein darstellbares Format, so daß ein Vergleich zwischen<br />

dem FQDN des Kommunikationspartners <strong>und</strong> den in der Zertifikatserweiterung<br />

enthaltenen DNS-Namen möglich wird. Der zurückgelieferte Zeiger verweist<br />

lediglich auf interne Daten der übergebenen ASN1_STRING-Struktur <strong>und</strong><br />

muß bzw. darf deshalb nicht explizit freigegeben werden. Die Anwendung der<br />

beiden Funktionen ist in Beispiel 7.6 zu sehen.<br />

#include<br />

<br />

unsigned char *ASN1_STRING_data( ASN1_STRING *as );<br />

Sollte kein Subject Alternative Name in das untersuchte Zertifikat eingebettet<br />

sein, so muß der Identitätsabgleich über das Feld Common Name (CN)<br />

aus der Subject-Komponente des Zertifikats vorgenommen werden. Nachdem<br />

das Programm den Zertifikatsnehmer <strong>mit</strong>tels X509_get_subject_name() bestimmt<br />

hat (vgl. dazu auch Beispiel 7.5), wird aus dem X509_NAME <strong>mit</strong> der<br />

X509_NAME_get_text_by_NID()-Funktion der Common Name extrahiert.<br />

#include<br />

<br />

int X509_NAME_get_text_by_NID( X509_NAME *name, int nid,<br />

char *buf, int len );<br />

Die Funktion erwartet neben dem X509_NAME in nid die ID der zu extrahierenden<br />

Textkomponente. Für den Common Name (CN) ist NID_commonName<br />

die passende NID. Der extrahierte Text wird im Puffer buf abgelegt, wobei<br />

der Parameter len die Länge dieses Textpuffers spezifiziert <strong>und</strong> da<strong>mit</strong> die<br />

Maximalzahl der in den Puffer zu übertragenden Zeichen festlegt. Falls die<br />

gesuchte Komponente nicht in name enthalten ist, liefert die Funktion den<br />

Rückgabewert -1. Bei Erfolg wird die Anzahl der in den Puffer kopierten

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!