2016-04-08 10 views
0

In den ergänzenden Kommentare zu PHP's OpenSSL functions gibt es diese SchnipselWarum sind pem2der und der2pem nicht invers?

function pem2der($pem_data) { 
    $begin = "CERTIFICATE-----"; 
    $end = "-----END"; 
    $pem_data = substr($pem_data, strpos($pem_data, $begin)+strlen($begin)); 
    $pem_data = substr($pem_data, 0, strpos($pem_data, $end)); 
    $der = base64_decode($pem_data); 
    return $der; 
} 

function der2pem($der_data) { 
    $pem = chunk_split(base64_encode($der_data), 64, "\n"); 
    $pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n"; 
    return $pem; 
} 

Diese Funktionen nicht Umkehrungen sind. Mein Testcode:

$priv_key = ...; 

print $priv; // dev data, of course 

print der2pem (pem2der ($priv)); 

Drucke

-----BEGIN PRIVATE KEY----- 
MIIJQwIBADANBgkqhkiG9w0BAQEFAAS... (etc) 

dann

-----BEGIN CERTIFICATE----- 
TEKEYMIIJQwIBADANBgkqhkiG9w0BAQEFA... (etc) 

Notiere die zweite hat ein TEKEY Präfix. In Hex ist das 4c4284, das nicht signifikant aussieht.

Woher kam das?

+0

Es ist kein offizieller PHP-Code. Wenn Sie es nicht mögen, schreiben Sie vielleicht Ihr eigenes? Ich wette, es gibt eine bessere Unterstützung für das, was du jetzt sowieso machen willst – Machavity

Antwort

1

Diese Funktionen dienen nur zur Verarbeitung von Zertifikaten, nicht von privaten Schlüsseln. Der Grund, warum das Ergebnis falsch ist, liegt darin, dass die Funktion pem2der nach dem Start eines Zertifikats sucht (CERTIFICATE----- von -----BEGIN CERTIFICATE-----). Sie versuchen, einen Schlüssel zu entschlüsseln, der mit -----BEGIN PRIVATE KEY----- beginnt. Der "TE KEY" -Teil des Ergebnisses kommt von hier: "----- BEGIN PRIVA TE KEY ----" und ist ein Ergebnis der Funktionen, die diesen Header nicht behandeln, so dass die substr Aufrufe das falsche Ergebnis zurückgeben .

Theoretisch sollten die Funktionen jedoch sehr einfach geändert werden können, um private Schlüsseldateien verarbeiten zu können.

Verwandte Themen