PHP utilise Socket pour obtenir le certificat SSL et la clé publique de l'exemple de code du site Web

怪我咯
Libérer: 2023-03-13 19:24:01
original
1298 Les gens l'ont consulté

socket (terminologie informatique)

Deux programmes sur le réseau échangent des données via une connexion de communication bidirectionnelle. Une extrémité de cette connexion est appelée une socket.

Au moins une paire de numéros de port (socket) est requise pour établir une connexion de communication réseau. L'essence de socket est une programmationinterface (API), qui encapsule TCP/IP et fournit également une interface que les programmeurs peuvent utiliser pour le développement du réseau. . HTTP est la voiture, fournissant une forme spécifique d'encapsulation ou d'affichage de données ; Socket est le moteur, offrant la possibilité de communiquer sur le réseau.

La signification anglaise originale de Socket est "hole" ou "socket". En tant que mécanisme de communication de processus de BSD UNIX, c'est ce dernier sens qui est pris. Également communément appelé « socket », il est utilisé pour décrire une adresse IP et un port. Il s'agit d'un handle vers une chaîne de communication et peut être utilisé pour mettre en œuvre la communication entre différentes machines virtuelles ou différents ordinateurs. Les hôtes sur Internet exécutent généralement plusieurs logiciels de services et fournissent plusieurs services en même temps. Chaque service ouvre un Socket et est lié à un port. Différents ports correspondent à différents services. Socket est tout comme sa signification originale en anglais, comme une prise multi-trous. Un hôte est comme une pièce remplie de diverses prises. Chaque prise a un numéro. Certaines prises fournissent une alimentation de 220 volts CA, d'autres une alimentation de 110 volts CA et d'autres encore des programmes de télévision par câble. Le logiciel client branche les fiches dans des prises portant des numéros différents pour obtenir différents services.

Cet article vous présente principalement les informations pertinentes sur PHP utilisant Socket pour obtenir le certificat SSL et la clé publique du site Web. L'article fournit un exemple de code détaillé pour votre référence et votre étude, qui a une certaine valeur de référence et d'apprentissage. pour tout le monde. , les amis qui en ont besoin peuvent venir jeter un oeil ci-dessous.

La demande de page Web via php curl ne peut pas obtenir les informations du certificat. Dans ce cas, vous devez utiliser le socket SSL pour obtenir le contenu du certificat. Jetons un coup d'œil à l'introduction détaillée :

Exemple de code :

// 创建 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;
Copier après la connexion

Vérifiez si la clé publique A dans le certificat est correcte, via le clé privée Exportez la clé publique B, comparez les deux et constatez qu'elles sont cohérentes.

$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);
Copier après la connexion

Fonction Une autre utilisation de stream_socket_client consiste à obtenir le nom de domaine que le serveur peut utiliser lorsque l'adresse IP du serveur est connue.

$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']);
Copier après la connexion

Comme vous pouvez le constater ci-dessus, l'obtention du certificat du site web ne permet pas d'obtenir la clé privée.

Sur certains sites qui utilisent le CDN, si vous utilisez HTTPS et souhaitez utiliser votre propre nom de domaine, devez-vous fournir votre clé privée au fournisseur de CDN ? En fait, le chemin du certificat et le nom d'utilisateur (nom de domaine prenant en charge https) n'ont pas besoin d'être cohérents.

En d'autres termes, lorsque vous utilisez votre propre nom de domaine et effectuez une accélération CDN, vous n'avez pas besoin d'utiliser votre propre certificat SSL. Il vous suffit d'ajouter votre propre nom de domaine CDN à la liste des noms de domaine du certificat du fabricant. .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!