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.

7.3 Sicherer Umgang <strong>mit</strong> X.509-Zertifikaten 385<br />

144–154<br />

157–158<br />

161–175<br />

Für jeden General Name gn des Stapels wird der Datentyp ausgewertet (vgl.<br />

dazu Abbildung 7.3). Handelt es sich dabei um einen DNS-Namen, gilt also<br />

gn->type == GEN_DNS, so wird der im General Name enthaltene DNS-Name<br />

bestimmt. Die ASN1_STRING_data()-Funktion wandelt dazu den im General<br />

Name gespeicherten Datensatz von einem ASN1_STRING in eine C-typische<br />

Zeichenkette. Konnte der DNS-Name er<strong>mit</strong>telt werden, so wird dieser nun<br />

<strong>mit</strong> dem bekannten FQDN des Kommunikationspartners verglichen. 8 Stimmen<br />

die beiden Zeichenketten unabhängig von ihrer Groß-/Kleinschreibung<br />

überein, dann erhält ok den Wert 1, andernfalls den Wert 0. Insbesondere<br />

gilt danach aber ok != -1, es wurde also zumindest ein Subject Alternative<br />

Name <strong>mit</strong> einem DNS-Namen im Zertifikat gef<strong>und</strong>en. Dies bedeutet <strong>mit</strong> Blick<br />

auf RFC 2818, daß der Common Name aus dem Subject des Zertifikats nicht<br />

mehr zur Identitätsprüfung herangezogen werden darf.<br />

Nachdem der Stapel von General Names abgearbeitet ist, muß der von<br />

X509_get_ext_d2i() für die Daten angelegte Speicherbereich über die Funktion<br />

sk_GENERAL_NAME_free() wieder freigegeben werden.<br />

Wurden im Zertifikat entweder keine Subject Alternative Names gef<strong>und</strong>en<br />

oder war in der Zertifikatserweiterung kein DNS-Name enthalten, dann hat<br />

die Variable ok immer noch den Initialwert -1. In diesem Fall muß das<br />

Feld Common Name aus der Subject-Komponente des Zertifikats ausgewertet<br />

werden. In diesem Fall extrahiert die openssl_match_host_cert()-<br />

Funktion das Subject des Zertifikats <strong>und</strong> kopiert den Common Name <strong>mit</strong>tels<br />

X509_NAME_get_text_by_NID() in einen Zwischenpuffer. Diese Zeichenkette<br />

wird dann zum Identitätsabgleich <strong>mit</strong> dem DNS-Namen des Kommunikationspartners<br />

verglichen. Stimmen die beiden Zeichenketten unabhängig von<br />

ihrer Groß-/Kleinschreibung überein, dann erhält ok den Wert 1, andernfalls<br />

den Wert 0.<br />

Beispiel 7.7. openssl-util.c, Teil 4<br />

161 /*<br />

162 * Falls es im Zertifikat kein subjectAltName -Element vom<br />

163 * Typ DNS-Name gibt, dann gilt ok < 0 <strong>und</strong> der gesuchte<br />

164 * DNS-Name wird aus dem commonName im Subject des<br />

165 * Zertifikats er<strong>mit</strong>telt.<br />

166 */<br />

167 if( ( ok < 0 ) &&<br />

168 ( subject = X509_get_subject_name( cert ) ) &&<br />

169 ( X509_NAME_get_text_by_NID( subject , NID_commonName ,<br />

170 commonname , 256 ) > 0 ) )<br />

171 {<br />

172 /* commonName <strong>mit</strong> dem Hostnamen vergleichen */<br />

8 Da bei DNS-Namen generell nicht zwischen Groß- <strong>und</strong> Kleinschreibung unterschieden<br />

wird, setzt das Programm zum Vergleich anstatt strncmp() die<br />

strcasecmp()-Funktion ein.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!