Socket (Computerterminologie)
Zwei Programme im Netzwerk tauschen Daten über eine bidirektionale Kommunikationsverbindung aus. Ein Ende dieser Verbindung wird Socket genannt.
Mindestens ein Paar Portnummern (Socket) ist erforderlich, um eine Netzwerkkommunikationsverbindung herzustellen. Die Essenz von Socket ist die ProgrammierungSchnittstelle (API), die TCP/IP kapselt und Programmierern eine Schnittstelle zur Verfügung stellt, die für die Netzwerkentwicklung verwendet werden kann . HTTP ist das Auto, das eine spezifische Form der Kapselung oder Anzeige von Daten bereitstellt; Socket ist die Engine, die die Möglichkeit zur Kommunikation über das Netzwerk bietet.
Die ursprüngliche englische Bedeutung von Socket ist „Loch“ oder „Buchse“. Als Prozesskommunikationsmechanismus von BSD UNIX wird die letztere Bedeutung angenommen. Auch „Socket“ genannt, wird es zur Beschreibung einer IP-Adresse und eines Ports verwendet. Es ist ein Handle für eine Kommunikationskette und kann zur Implementierung der Kommunikation zwischen verschiedenen virtuellen Maschinen oder verschiedenen Computern verwendet werden. Hosts im Internet führen im Allgemeinen mehrere Dienstsoftware aus und stellen mehrere Dienste gleichzeitig bereit. Jeder Dienst öffnet einen Socket und ist an einen Port gebunden. Verschiedene Ports entsprechen unterschiedlichen Diensten. Socket ist genau wie seine ursprüngliche Bedeutung im Englischen wie eine Mehrlochsteckdose. Ein Host ist wie ein Raum, der mit verschiedenen Steckdosen gefüllt ist. Einige Steckdosen liefern 220-Volt-Wechselstrom, andere bieten Kabelfernsehprogramme. Die Client-Software steckt die Stecker in Steckdosen mit unterschiedlichen Nummern, um unterschiedliche Dienste zu erhalten.
Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zur Verwendung von PHP Socket zum Erhalten des SSL-Zertifikats und des öffentlichen Schlüssels der Website ein. Der Artikel enthält detaillierte Beispielcodes für Ihre Referenz und Ihr Studium, die einen gewissen Referenz- und Lernwert haben Für alle, Freunde, die es brauchen, können unten vorbeischauen.
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 .
Das obige ist der detaillierte Inhalt vonPHP verwendet Socket, um das SSL-Zertifikat und den öffentlichen Schlüssel des Website-Beispielcodes abzurufen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!