So erhalten Sie das SSL-Zertifikat und den öffentlichen Schlüssel der Website mithilfe von PHP Socket

墨辰丷
Freigeben: 2023-03-27 09:12:01
Original
2192 Leute haben es durchsucht

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;
Nach dem Login kopieren

Verifizierungszertifikat Ob das Der öffentliche Schlüssel A ist korrekt. Leiten Sie den öffentlichen Schlüssel B über den privaten Schlüssel ab, 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);
Nach dem Login kopieren

Eine weitere Verwendung der Funktion 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']);
Nach dem Login kopieren

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

Müssen Sie auf einigen Websites, die CDN verwenden, Ihren privaten Schlüssel dem CDN-Anbieter 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 .

Verwandte Empfehlungen:

PHP basierend auf der Socket-Methode zur Implementierung von Client- und Server-Kommunikationsfunktionen

PHP-Implementierung von WebSocketDetaillierte Schritte für Echtzeit-Nachrichten-Push

Socket Funktion in PHP

Das obige ist der detaillierte Inhalt vonSo erhalten Sie das SSL-Zertifikat und den öffentlichen Schlüssel der Website mithilfe von PHP Socket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage