Heim  >  Artikel  >  Backend-Entwicklung  >  PHP verwendet Socket, um das SSL-Zertifikat und den öffentlichen Schlüssel der Website abzurufen

PHP verwendet Socket, um das SSL-Zertifikat und den öffentlichen Schlüssel der Website abzurufen

陈政宽~
陈政宽~Original
2017-06-28 13:09:001114Durchsuche

Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen über die Verwendung von PHP durch, um das SSL-Zertifikat und den öffentlichen Schlüssel der Website zu erhalten. Der Artikel bietet einen gewissen Referenz- und Lernwert für alle. Es ist nötig, Freunde, schauen wir uns das gemeinsam an.

Beim Anfordern der Webseite über PHP Curl können die Zertifikatsinformationen nicht abgerufen werden. In diesem Fall müssen Sie SSL-Socket verwenden, um den Zertifikatsinhalt abzurufen. Werfen wir einen Blick auf die ausführliche Einführung:

Beispielcode:

// 创建 stream context
$context = stream_context_create([
 'ssl' => [
  'capture_peer_cert' => true,
  'capture_peer_cert_chain' => true,
 ],
]);
 
$resource = stream_socket_client("ssl://$domain:$port", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
$cert = stream_context_get_params($resource);
 
$ssl = $cert['options']['ssl'];
$resource = $ssl['peer_certificate'];
 
// 网站证书中只有公钥,通过 openssl_pkey_get_details 导出公钥
 
$ret = [
 'crt' => '',
 'pub' => '',
];
 
$pkey = openssl_pkey_get_public($resource);
$ret['pub'] = openssl_pkey_get_details($pkey)['key'];
 
openssl_x509_export($resource, $pem);
$ret['crt'] = $pem;
 
foreach ($ssl['peer_certificate_chain'] as $resource)
{
 openssl_x509_export($resource, $pem);
 $ret['crt'] .= "\n" . $pem;
}
 
// 保存 $ret['crt'] 为 domain.crt
// 保存 $ret['pub'] 为 domain.pub
 
return $ret;

Überprüfen Sie, ob der öffentliche Schlüssel A im Zertifikat korrekt ist privater Schlüssel Exportieren Sie den öffentlichen Schlüssel B, vergleichen Sie die beiden und stellen Sie fest, dass sie konsistent sind.

$domain = 'blog.zhengxianjun.com';
$port = '443';
// ...
$pub_a = $ret['pub'];
 
$private_key_path = '/conf/ssl/blog.zhengxianjun.com.key';
 
// 证书没有设置密码,$passphrase 为空字符串
$pkey = openssl_pkey_get_private(file_get_content($private_key_path), $passphrase = '');
$pub_b = openssl_pkey_get_details($pkey)['key'];
 
// 两者一致
var_dump($pub_a === $pub_b);

Funktion Eine weitere Verwendung von stream_socket_client besteht darin, den Domänennamen abzurufen, den der Server möglicherweise verwenden kann, wenn die Server-IP bekannt ist.

$resource = stream_socket_client("ssl://$ip:$port", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
$cert = stream_context_get_params($resource);
 
// 解析 X.509 格式证书
$info = openssl_x509_parse($cert['options']['ssl']['peer_certificate']);
 
// 获取证书中的可信域名列表
$domain = str_replace('DNS:', '', $info['extensions']['subjectAltName']);

Wie Sie oben sehen können, ermöglicht Ihnen der Erhalt des Website-Zertifikats nicht den Erhalt des privaten Schlüssels.

Müssen Sie auf einigen Websites, die CDN verwenden, dem CDN-Anbieter Ihren privaten Schlüssel zur Verfügung stellen, wenn Sie HTTPS verwenden und Ihren eigenen Domänennamen verwenden möchten? Tatsächlich müssen der Zertifikatspfad und der Benutzername (Domänenname, der https unterstützt) nicht konsistent sein.

Das heißt, wenn Sie Ihren eigenen Domänennamen verwenden und eine CDN-Beschleunigung durchführen, müssen Sie kein eigenes SSL-Zertifikat verwenden. Sie müssen lediglich Ihren eigenen CDN-Domänennamen zur Domänennamenliste des Herstellerzertifikats hinzufügen .

Zusammenfassung

Das obige ist der detaillierte Inhalt vonPHP verwendet Socket, um das SSL-Zertifikat und den öffentlichen Schlüssel der Website abzurufen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn