Todos los compontes de PAPI desarrollados en PHP necesitan utilizar la función ‘openssl_pkey_get_details‘, ya que siempre se necesita trabajar con la clave pública RSA de algún componente de la infraestructura PAPI donde está desplegado.
El problema que muchos de nosotros nos hemos encontrado cuando hemos realizado instalaciones de PAPI, es que algunas distribuciones de Linux, como Red Hat, sólo incluyen la versión 5.1.6 dentro de sus ramas o versiones estables.
En adAS hemos intentado hacer la vida más fácil a la hora de instalarlo, por lo que estamos incorporando una solución «de emergencia» (o workaround) para aquellas situaciones en las que es imposible actualizar la versión de PHP. ¿Cómo? Utilizando el ejecutable de OpenSSL.
La función de PHP ‘openssl_pkey_get_details’ necesita un parámetro con un objeto que representa a la clave y devuelve un ‘array’ con la siguiente estructura (para el caso de claves RSA, que es el que nos interesa):
array('bits' => ...,'key' => ...,'type' => 0,'rsa' => array('n' => ...,'e' => ...),)
Donde,
Toda esta información la podemos obtener también ejecutando el comando ‘openssl’, aunque lo obtendremos en otro formato:
$ openssl rsa -pubin -in test.pem -modulus -textModulus (1024 bit):
00:a8:cd:4f:02:e4:b3:2c:b7:3b:3b:77:7c:0f:c8:9b:24:66:c9:92:9d:05:8e:4b:b4:50:14:8b:41:00:19:f7:31:49:49:4a:38:40:81:8f:29:a4:99:eb:0c:4c:ee:a3:6c:d5:04:a1:8a:1f:1b:33:2a:da:95:5e:62:40:b1:2a:99:36:37:d5:1d:9a:99:26:b7:7b:11:0c:37:84:e0:d0:15:42:1c:d3:b5:61:f7:0f:8a:b6:ca:18:03:0d:36:c2:50:f5:ae:b5:60:16:c0:92:f3:84:68:12:a8:e1:ce:72:21:c9:d1:2c:18:e4:e7:37:c3:79:d8:22:38:86:2a:dc:97Exponent: 65537 (0x10001)Modulus=A8CD4F02E4B32C ... C18E4E737C379D82238862ADC97writing RSA key-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCozU8C5LMstzs7d3wPyJskZsmSnQWOS7RQFItBABn3MUlJSjhAgY8ppJnrDEzuo2zVBKGKHxszKtqVXmJAsSqZNjfVHZqZJrd7EQw3hODQFUIc07Vh9w+KtsoYAw02wlD1rrVgFsCS84RoEqjhznIhydEsGOTnN8N52CI4hirclwIDAQAB-----END PUBLIC KEY-----
$data = explode("\n", trim($salida));for ($i = 0; $i < count($data); $i++) {$temp = explode(" ", $data[$i]);if ($temp[0] == "Exponent:") {$exp = $temp[1];}}$e = base_convert($exp, 10, 16);$e = asciihex2hex($e);
function asciihex2hex($str) {while ((strlen($str) % 2) != 0) {$str = "0" . $str;}$out = "";for ($i = 0; $i < strlen($str); $i+=2) {$out .= chr(hexdec($str[$i] . $str[$i + 1]));}return $out;}
$data = explode("\n", trim($salida));for ($i = 0; $i < count($data); $i++) {$temp = explode(" ", $data[$i]);if (strpos($data[$i], "Modulus=") !== false) {$modulus = substr($data[$i], strlen("Modulus="));}}$m = $modulus;$m = self::asciihex2hex($m);
$res = array('bits' => $keylength,'key' => $publickeypem,'type' => 0,'rsa' => array('n' => $m,'e' => $e));
You must be logged in to post a comment.