2016-04-18 11 views
3

ich einen SSH-Schlüssel mit PHP OpenSSL generiert haben:generieren privaten RSA-SSH-Schlüssel in PHP

$rsaKey = openssl_pkey_new(array( 
    'private_key_bits' => 4096, 
    'private_key_type' => OPENSSL_KEYTYPE_RSA, 
)); 
$privKey = openssl_pkey_get_private($rsaKey); 
openssl_pkey_export($privKey, $pem); 

Dies führt zu $pem wie folgt aussehen:

-----BEGIN PRIVATE KEY----- 
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQC8ggt6rVHYnqNP 
... 
e95+EXbPc6THyWt9pgwOsJltpylIYG4= 
-----END PRIVATE KEY-----

Aber ich kann nicht authentifizieren diesen Schlüssel. Bevor ich es benutzen kann, habe ich es konvertieren diesem Befehl:

openssl rsa -in xxx.key -outform pem > xxx.key2 

Das Ergebnis der Umwandlung ist dies:

-----BEGIN RSA PRIVATE KEY----- 
MIIJKQIBAAKCAgEAvIILeq1R2J6jT+xjlK5NrOqFZTOJ4PByvgPQNbb2Kp7c3W15 
... 
o1t2KBkaSoR+JyOPOZakq5BLv8lgD3vefhF2z3Okx8lrfaYMDrCZbacpSGBu 
-----END RSA PRIVATE KEY-----

Beide sind PEM-Format, aber das zweite ist ein privater RSA-Schlüssel . Mit der zweiten kann sich PHP einloggen. Also brauche ich einen Schlüssel, der mit RSA PRIVATE KEY beginnt, nicht nur PRIVATE KEY. Wie kann ich dies mit PHP und OpenSSL PHP-Implementierung erstellen?

+0

Sie wissen, dass diese werden aus einem Grund * private * Schlüssel genannt, oder? Du wirst diesen hier wegwerfen wollen. – Sammitch

+0

@Sammitch: Natürlich. Aber es gibt keinen Grund, sie zu verstecken. Sie werden in einer nicht produktiven Umgebung generiert und von keinem System verwendet. – Richard

+3

Dies scheint versionsabhängig zu sein. Wenn ich es auf PHP 5.5.31 ausführe, bekomme ich 'BEGIN RSA PRIVATE KEY', führe es aber auf PHP 7.0.4 aus. Ich bekomme' BEGIN PRIVATE KEY'. Konnte mit OpenSSL-Version verwandt werden, mit der es auch kompiliert wurde. – miken32

Antwort

3

Also, das sind two different key types. Sie suchen nach PKCS # 1, erhalten aber PKCS # 8.

Dies scheint mit der Version von OpenSSL verwandt zu sein, die PHP verwendet. Versionen seit 1.0 erstellen eine PKCS # 8-Datei, und es gibt nothing the PHP developers wollen darüber zu tun. Das gleiche Problem tritt auf, wenn es von der Kommandozeile mit folgendem Befehl tun:

openssl req -new -keyout mykey.key -out mycertreq.csr -nodes -sha1 -newkey rsa:2048 

Sie können versuchen, eine externe Bibliothek mit phpseclib genannt, obwohl ich es selbst nicht versucht habe:

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

$rsa = new Crypt_RSA(); 
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH); 
$result = $rsa->createKey(); 
echo $result["privatekey"]; 
?> 
+0

Ich habe das schon gesehen und hatte Angst vor "PHP 4". Ich habe gerade das Github-Repository überprüft und es ist nicht so veraltet, wie ich zuvor dachte. Ich werde es versuchen, wenn ich keine andere Lösung mit einer anderen OpenSSL-Version finden kann. – Richard

+1

Ja, ich werde den Link aktualisieren, da ich denke, dass die Sourceforge nicht aktuell ist! – miken32