Возможно недопонимание. stream_context_create()
- создать TCP-сервер. Он может обрабатывать рукопожатия, но для этого должен иметь целую связку ключей, отформатированную, как показано ниже:
Это .crt
и частный .key
файл, сгенерированный openssl, объединенный в один файл.
-----BEGIN CERTIFICATE-----
MIIDaDCCAlCgAwIB(...)
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAK(...)
-----END RSA PRIVATE KEY-----
С такой связкой ключей я могу реализовать ssl / https и защитить серверы wss: // websockets.
Не уверен, что вы хотите сделать, почему file_get_contents () не Не работает без контекста. Обычно вам не нужно импортировать какой-либо CAcert, и если да, то он принадлежит браузеру.
Это может быть полезно в контексте предприятия или во избежание ошибок с самоподписанными связками ключей.
Таким образом, что не так с просто:
echo file_get_contents("https://stackoverflow.com/");
или
wget https://sourceforge.net/
Это просто работает без проблем.
Пожалуйста, объясните точно, чего вы пытаетесь достичь, много заметки из экспериментов с ssl и php.
Чтобы извлечь publi c ключ данного сервера, вы должны запросить через порт 443:
<?php
$opt = [
"capture_peer_cert" => true,
"capture_peer_cert_chain" => true
];
$a = stream_context_create(["ssl"=>$opt]);
$b = stream_socket_client("tls://stackoverflow.com:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $a);
$cont = stream_context_get_params($b);
$key = openssl_pkey_get_public($cont["options"]["ssl"]["peer_certificate"]);
$c = openssl_pkey_get_details($key);
var_dump($c["key"]);
Output
string(451) "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqdWs0NgjFlLV6yGQxYpu
7btsRTRWEi7fpSI8mSdTHgiZJY42ojQdNoLinhUUrj7DJNid18/DpjqBH271UHoz
HGsOogVT9VfkIRfiYYMjjkUJGUFfCSefCHDidT8KJMjAgDDlr3cR82o+9417MQvp
//jFO8rqvmNi7mRNYUGLX7WImv3tELZzw1JaZ41Ene2BA7wMzZymN/q9bJhThwoQ
4wMTLFvpSXyi7HDSrKZ3IobMdeiYWXBmW14jzznfdAf8wOcTRTglKJZXbTAHcRRy
qCmKTZoFq0MFbwwe1QhgENwojRkb3XDGv06QeElbGXNOwuk7w9+Xa9MC6GTeFqin
6wIDAQAB
-----END PUBLIC KEY-----
"
Возможно, этот ответ поможет