2012-12-17 21 views
9

Hier ist, wie ich es mit phpseclib tun würde (das funktioniert):Entfernen Passwort von privaten RSA-Schlüssel

<?php 
include('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 
$rsa->setPassword('password'); 
$result = $rsa->loadKey('-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,E3B1C06E0D0C2633 

gvmXzl6W7eV1a3N5rQNwBWKY9on3IgxZudS33cip5f88FotsPSDJMvqj6LVw2RxobDjhlOOzqmTb 
VrlTnoQ6CogXFZSfiPmixiyyptCUEKJkSiEhYGM5GQm0OoGcLeLbgBb9tRpWh5IlXulKD6XFhx8q 
/eGg5a+mSkX1i7kv2+Ih3jHmEKwrnfzhcA29pBF3OQJo+Ks9IYneuk676pHtsIs7CpFKq1tDvD8Q 
O7URxnVnHLltaFvIxshqyZu92xbUYZR7YzjXl5+3w4TVgeAHUogEV+H9iZTosD/copUsbQO+78w2 
E1D3iDS94wRgx0Tjv4xlwrTpOV38FS5rdL32492DcCRlCYM4VtuwjYeWi5shJg69jCb0EwGRqfAo 
xko+lbKWELTuFKwD7n1rc/2fTarbGuf8S2AEggBLZyfXHC/9N84mXLFO2XKq+0WdiEFhQj2Cze+a 
9qcSK6tPSrjK1LPlnOOppFgDElZaZ0rxsgjtiWSIAEw/Ad+SIM5u+vqwzF8J317JlsdKoBFDw8mS 
MxCMuMksKJ23mgvY+THRIVgH3E7lEDZQzCi1Uy6ldLJcran/6wHwP88pVM2odiHkpnrJGcEBbbIk 
qsxJZhFT8aUt/cUEBj3fnP7cxoNLQfTHMPqUTqKBWaVufFzGU9YB1R+XWFULLddwJHnV7gPheBlk 
MDapowb+Is77+a9Y2VDsOXEvNpqTY0giiSrckG05IZnrhJ24JnSCwyNd99lm7XKdEGGrjBCMqIyI 
Fqox8Ahkv3KWAJPYK1eOCc5d/KwZHlnlFJq7ZYy9u3fEnxQCjOEmeXLkLangKA== 
-----END RSA PRIVATE KEY-----'); 

echo $result ? 'true' : 'false'; 
?> 

Zum Vergleich aber ich versuche es mit OpenSSL zu tun. Hier ist mein Code:

<?php 
$pkey = openssl_pkey_get_private('-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,E3B1C06E0D0C2633 

gvmXzl6W7eV1a3N5rQNwBWKY9on3IgxZudS33cip5f88FotsPSDJMvqj6LVw2RxobDjhlOOzqmTb 
VrlTnoQ6CogXFZSfiPmixiyyptCUEKJkSiEhYGM5GQm0OoGcLeLbgBb9tRpWh5IlXulKD6XFhx8q 
/eGg5a+mSkX1i7kv2+Ih3jHmEKwrnfzhcA29pBF3OQJo+Ks9IYneuk676pHtsIs7CpFKq1tDvD8Q 
O7URxnVnHLltaFvIxshqyZu92xbUYZR7YzjXl5+3w4TVgeAHUogEV+H9iZTosD/copUsbQO+78w2 
E1D3iDS94wRgx0Tjv4xlwrTpOV38FS5rdL32492DcCRlCYM4VtuwjYeWi5shJg69jCb0EwGRqfAo 
xko+lbKWELTuFKwD7n1rc/2fTarbGuf8S2AEggBLZyfXHC/9N84mXLFO2XKq+0WdiEFhQj2Cze+a 
9qcSK6tPSrjK1LPlnOOppFgDElZaZ0rxsgjtiWSIAEw/Ad+SIM5u+vqwzF8J317JlsdKoBFDw8mS 
MxCMuMksKJ23mgvY+THRIVgH3E7lEDZQzCi1Uy6ldLJcran/6wHwP88pVM2odiHkpnrJGcEBbbIk 
qsxJZhFT8aUt/cUEBj3fnP7cxoNLQfTHMPqUTqKBWaVufFzGU9YB1R+XWFULLddwJHnV7gPheBlk 
MDapowb+Is77+a9Y2VDsOXEvNpqTY0giiSrckG05IZnrhJ24JnSCwyNd99lm7XKdEGGrjBCMqIyI 
Fqox8Ahkv3KWAJPYK1eOCc5d/KwZHlnlFJq7ZYy9u3fEnxQCjOEmeXLkLangKA== 
-----END RSA PRIVATE KEY-----', 'password'); 
if ($pkey === false) exit('FAILURE'); 
openssl_pkey_export($pkey, $out_key_file); 
echo $out_key_file; 
?> 

Einziges Problem: Der Code stirbt vorzeitig, AUSFALL echo'ing aus. dh. openssl_pkey_get_private() lädt den Schlüssel nicht. openssl_error_string sagt "error: 0906D066: PEM routinen: PEM_read_bio: bad end line".

Irgendwelche Ideen?

+5

Ich hoffe, dass diese spezielle Taste, die Sie veröffentlicht haben, ist nicht ein Sie planen zum sicheren Aufbewahren von Sachen =) – paddy

+2

@paddy doh! >. < –

+2

Vielleicht ist das Passwort von "password", das er für den von ihm geposteten Schlüssel verwendet, ein Passwort, das er universell verwendet. Vielleicht hat er sein stackoverflow Passwort gepostet: P – neubert

Antwort

8

Ich bin mir nicht sicher, was hier vor sich geht; Ich habe Ihren Code versucht, und es gibt das gleiche Problem, also habe ich einen Schlüssel selbst erzeugt:

openssl genrsa -des3 -out des3.rsa 

Dann wird der Inhalt in diesem Skript kopiert:

$out_key_file = 'des3nopass.rsa'; 

$key = <<<EOS 
-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,5F2FDB4C8F710F92 

pkaBIMCdnvrejw6egagg/lGrrGJWLsceDkC0KSdouRfR8LhQS/XjSJ/Wqrj7fa36 
xXRd/USBebgy2hLAi9RMPofOjlcUyUVvZZgh0+JDQ79pH5q1FsRMcsJ+J8GO0edw 
kh8zdZoCbbtJgQjTx0JheJMDdZymw4cfK5hoZbnxX6HZ1wNhtPb7Z/noNcxpK6Zl 
CCzPgLd9hCGLBD2XqoRjOM1U2vpZwpCTdYgAtFIPMVXQQpzgIyw06CHcHvYZgnAc 
oxiVx7Z7N9r0J1vDnlrW/OU1l07D0pBr1yPRTDMI5tBMo8KDsL2tkBxqtYyOJdZr 
as/5zQDPRlbW7Jve1JuXmsnja+gN7jZ+3LpUzfRFo/wWnvOzhHQxLz+RaUpVDYTl 
F4m9zjo9dgOhlZzigOhYTB+5aq5f92Yf6K0daCwTDpU= 
-----END RSA PRIVATE KEY----- 
EOS; 

$pkey = openssl_pkey_get_private($key, 'password'); 
if ($pkey === false) { 
     die(openssl_error_string()); 
} 

openssl_pkey_export($pkey, $out_key_file); 
echo "Wrote to $out_key_file\n"; 

Und das funktioniert gut für mich .

aktualisieren

Ich habe versucht, auch diese mit openssl Befehlszeile auszuführen, Ihre Schlüssel:

openssl rsa -in des3big.rsa -out des3bignopass.rsa 
unable to load Private Key 
14179:error:0906D066:PEM routines:PEM_read_bio:bad end line:pem_lib.c:746: 

Es scheint, dass OpenSSL ein Problem mit ihm als gut, so ist es nicht PHP.

Update 2

Es stellte sich heraus, dass Ihre Zeilen zu lang sind (sie 64 Zeichen breit sein sollte):

-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,E3B1C06E0D0C2633 

gvmXzl6W7eV1a3N5rQNwBWKY9on3IgxZudS33cip5f88FotsPSDJMvqj6LVw2Rxo 
bDjhlOOzqmTbVrlTnoQ6CogXFZSfiPmixiyyptCUEKJkSiEhYGM5GQm0OoGcLeLb 
gBb9tRpWh5IlXulKD6XFhx8q/eGg5a+mSkX1i7kv2+Ih3jHmEKwrnfzhcA29pBF3 
OQJo+Ks9IYneuk676pHtsIs7CpFKq1tDvD8QO7URxnVnHLltaFvIxshqyZu92xbU 
YZR7YzjXl5+3w4TVgeAHUogEV+H9iZTosD/copUsbQO+78w2E1D3iDS94wRgx0Tj 
v4xlwrTpOV38FS5rdL32492DcCRlCYM4VtuwjYeWi5shJg69jCb0EwGRqfAoxko+ 
lbKWELTuFKwD7n1rc/2fTarbGuf8S2AEggBLZyfXHC/9N84mXLFO2XKq+0WdiEFh 
Qj2Cze+a9qcSK6tPSrjK1LPlnOOppFgDElZaZ0rxsgjtiWSIAEw/Ad+SIM5u+vqw 
zF8J317JlsdKoBFDw8mSMxCMuMksKJ23mgvY+THRIVgH3E7lEDZQzCi1Uy6ldLJc 
ran/6wHwP88pVM2odiHkpnrJGcEBbbIkqsxJZhFT8aUt/cUEBj3fnP7cxoNLQfTH 
MPqUTqKBWaVufFzGU9YB1R+XWFULLddwJHnV7gPheBlkMDapowb+Is77+a9Y2VDs 
OXEvNpqTY0giiSrckG05IZnrhJ24JnSCwyNd99lm7XKdEGGrjBCMqIyIFqox8Ahk 
v3KWAJPYK1eOCc5d/KwZHlnlFJq7ZYy9u3fEnxQCjOEmeXLkLangKA== 
-----END RSA PRIVATE KEY----- 
+5

OMG OpenSSL ist so knifflig.Neue Zeile am Ende, Zeilen müssen 64 Zeichen lang sein, usw. Schönes finde ich aber! –

1

Might weitere Informationen finden, indem Sie in die Ursache des Fehlers suchen:

if ($pkey === false) { 
    echo openssl_error_string(); 
    exit('FAILURE'); 
} 

Edit: der Fehler gegeben „PEM_read_bio: bad Endlinie“ hier ist der Anteil der OpenSSL Quelle, die auslöst:

[...] 
if ((strncmp(buf,"-----END ",9) != 0) || 
     (strncmp(nameB->data,&(buf[9]),i) != 0) || 
     (strncmp(&(buf[9+i]),"-----\n",6) != 0)) { 

     PEMerr(PEM_F_PEM_READ_BIO,PEM_R_BAD_END_LINE); 
     goto err; 
     } 
[...] 

Mit Blick auf Ihren Code vermute ich, dass Sie ein Newline-Zeichen an das Ende der privaten Schlüssel Zeichenfolge angehängt werden müssen.

+0

Es sagt "Fehler: 0906D066: PEM-Routinen: PEM_read_bio: schlechte Endlinie" –

+0

das könnte helfen: http://edokan.wordpress.com/2011/10/22/error0906d066pem-routinespem_read_biobad- end-line/- der autor schlägt vor, muss mit einem line feed char – Nathan

+0

ich habe nur den fehler in openssl quellen nachgeschlagen und in der tat muss es eine newline als das letzte zeichen in der string – Nathan