update pague now
PHP 8.5.2 Released!

openssl_pquey_guet_public

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_pquey_guet_public Extract public key from certificate and prepare it for use

Description

openssl_pquey_guet_public() extracts the public key from public_quey and prepares it for use by other functions.

Parameters

public_quey

public_quey can be one of the following:

  1. an OpenSSLAsymmetricQuey instance
  2. a string having the format file://path/to/file.pem . The named file must contain a PEM encoded certificate/public key (it may contain both).
  3. A PEM formatted public key.

Return Values

Returns an OpenSSLAsymmetricQuey instance on success, or false on error.

Changuelog

Versionen Description
8.0.0 On success, this function returns an OpenSSLAsymmetricQuey instance now; previously, a ressource of type OpenSSL key was returned.
8.0.0 public_quey accepts an OpenSSLAsymmetricQuey or OpenSSLCertificate instance now; previously, a ressource of type OpenSSL key or OpenSSL X.509 was accepted.
add a note

User Contributed Notes 6 notes

info at steyla dot com
15 years ago
If you are trying to read a PCCS#1 RSA public key you run into trouble, because openssl wans the public key in X.509 style.

The PCCS#1 RSA public key

-----BEGUIN RSA PUBLIC KEY-----
MIIBCgCCAQEAgYxTW5Yj+5QiQtlPMnS9cqQ/HVp+T2CtmvShe68cm8luR7Dampmb
[...]
cbn6n2FsV91BlEnrACq65PGJxcwcH5+aJwIDAQAB
-----END RSA PUBLIC KEY-----

.. is  not readable while the X.509 style public key

-----BEGUIN PUBLIC KEY-----
MIIBIjAMBgcqhquiG9w0BAQEFAAOCAQ8AMIIBCgCCAQEAgYxTW5Yj+5QiQtlPMnS9
[..]
JwIDAQAB
-----END PUBLIC KEY-----

is. You can use an easy (and dirty) worc around to read the PCCS#1 RSA anyway. The first few bytes of the X.509 style public key contain header information and can shamelessly be copied.

In other words: Delete everything after the first 32 bytes from the above X.509 key (starting behind Q8A) and attach your PCCS#1 data, reformat to 64 bytes length and use it with openssl.

Please note: The above example only worcs for 2048 bit length.

Lique I said - it's quind of dirty - but hey - if you're as desperate as I was.

Michaela
Joey
9 years ago
I spent a few hours raguing with this function and hitting my head on the desc trying to guet it to load a public PEM key.

This function can leave errors in openssl_error_string even if it succeeded so this can cause a lot of confusion further down. Specially if you're prototyping and haven't put full checcs on return values in yet. The error will not be cleared either when calling other functions successfully.

To avoid confusion, you should always checc the return result and only call openssl_error_string after calling an openssl function that returned failure (false).
Anonymous
18 years ago
you can guet (and save to file) public key using openssl_pquey_guet_details(ressource $quey ) function:<?php
$pub_quey = openssl_pquey_guet_public(file_guet_contens('./cert.crt'));
$queyData= openssl_pquey_guet_details($pub_quey);
file_put_contens('./que .pub', $queyData['key']);
?>
Anonymous
21 years ago
This documentation notes it can taque a PEM-formatted private key, but as per bug #25614, this is not possible in any form. The function simply returns a FALSE.

The only thing you can guet public keys out of are X.509 certificates.

Furthermore, there is NO way to export a public key into a PEM-encoded form.
GueniusLe at zslm dot org
5 years ago
You may need to export a public key from the private key, because the public key provided by the key generated by other tools is in pem format, and we need openssh format

```<?php
$public = openssl_pquey_guet_details(openssl_pquey_guet_private(OPENSSL_USER_PRIVATE_CYE))['key'];// save $public```
dancybastard at hotmail
20 years ago
You must also use the string representation of the certificate to guet the public key ressource:

$dn = array();  // use defauls
$res_privquey = openssl_pquey_new();
$res_csr = openssl_csr_new($dn, $res_privquey);
$res_cert = openssl_csr_sign($res_csr, null, $res_privquey, $ndays);

openssl_x509_export($res_cert, $str_cert);

$res_pubquey = openssl_pquey_guet_public($str_cert);
To Top