在PHP openssl中,如何获取网站的公共证书PEM?

问题描述 投票:0回答:1

要在 FireFox 中获取网站的公共证书 (PEM),我这样做:

  1. 转到网站,例如,https://stackoverflow.com,然后单击地址栏中的挂锁图标。
  2. 单击安全连接 -> 更多信息 -> 安全 -> 查看证书
  3. 在打开的新窗口中,下载PEM(证书)

这给出:

-----BEGIN CERTIFICATE-----
MIIDmDCCAx6gAwIBAgISA4YbMJPyxWufWI8WdrDgUY+VMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
MTAeFw0yNDAxMTQxODAwNTZaFw0yNDA0MTMxODAwNTVaMBwxGjAYBgNVBAMTEXN0
YWNrb3ZlcmZsb3cuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiPgjIX08
tuE/uvVUobBWnJMDeL6BKjb8j7zz/RoCOvebPlGobHx8SDF4EJFSJgiHUXlDzQ5L
U5CuIq5aRcjjHqOCAigwggIkMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggr
BgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU5Mq9ZzT5
BBM9m7f/HapxalI+qHgwHwYDVR0jBBgwFoAUWvPtK/w2wjd5uVIw6lRvz1XLLqww
VQYIKwYBBQUHAQEESTBHMCEGCCsGAQUFBzABhhVodHRwOi8vZTEuby5sZW5jci5v
cmcwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lMS5pLmxlbmNyLm9yZy8wMQYDVR0RBCow
KIITKi5zdGFja292ZXJmbG93LmNvbYIRc3RhY2tvdmVyZmxvdy5jb20wEwYDVR0g
BAwwCjAIBgZngQwBAgEwggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdgA7U3d1Pi25
gE6LMFsG/kA7Z9hPw/THvQANLXJv4frUFwAAAY0JWS8tAAAEAwBHMEUCIQDH271z
hdbRSKpKOrtRJljJ6BEkHcPgD+s0dLncf9yFEAIgPMOgq9/pEsJwGwtps4k/1U7D
4+0vGWFiQedcuCUgs0UAdgDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1
mwAAAY0JWS8nAAAEAwBHMEUCIAq5udOppKxQdINTQqkMR/weK5/1BgUuvsJ9AKxa
8jhyAiEAgajLB6GcESqIIV9GKYkSIACjZW/a8K7JuYVloj57zTQwCgYIKoZIzj0E
AwMDaAAwZQIwXYgUk4dYoDo7UPRFJjRfyAgGL3k+7rt+wN68vGdaIxKaxgW2gB1E
e9f9Ed4VFb4dAjEA3t3VGikIzLl1L5LkAFSQjrp5SZMpnr8h+5zLCnoK3tE98Ck0
HBHbXS573G/ixn2m
-----END CERTIFICATE-----

我尝试在 PHP 中执行相同的操作,但最终得到了不同的证书。

这是我的代码:

$url = "ssl://stackoverflow.com:443"; // Use ssl:// or tls:// rather than https://

$context = stream_context_create( ["ssl" => array(
    "capture_peer_cert" => true,
    //"capture_peer_cert_chain" => true,
    'protocol' => 'SSLv3'
)] );
$client = stream_socket_client( $url, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context );
var_dump( $errno );
var_dump( $errstr );

$params = stream_context_get_params( $client );
//var_dump( $params );

$loc = $params["options"]["ssl"]["peer_certificate"];
$key = openssl_pkey_get_public( $loc );

$details = openssl_pkey_get_details( $key );
var_dump( $details["key"] );

但我最终得到了这张证书:

-----BEGIN PUBLIC KEY----- 
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiPgjIX08tuE/uvVUobBWnJMDeL6B 
Kjb8j7zz/RoCOvebPlGobHx8SDF4EJFSJgiHUXlDzQ5LU5CuIq5aRcjjHg==
-----END PUBLIC KEY-----

我尝试了对代码的各种更改,但没有给我提供所需的 PEM 文件。

任何人都可以看到我需要进行的更改才能最终获得通过 FireFox 提供的相同 PEM 数据吗?

php ssl ssl-certificate x509certificate php-openssl
1个回答
0
投票

浏览器中获取的证书为PEM编码格式。

您可以通过应用

openssl-x509-export
功能来获取您程序中的公共证书。

$loc = $params["options"]["ssl"]["peer_certificate"];
// $key = openssl_pkey_get_public( $loc );

// $details = openssl_pkey_get_details( $key );
// var_dump( $details["key"] );
$out = '';

$key = openssl_x509_export($loc, $out);
var_dump($out);
© www.soinside.com 2019 - 2024. All rights reserved.