Heim  >  Artikel  >  Backend-Entwicklung  >  Vertiefende Kenntnisse des bidirektionalen SSL/TLS-Authentifizierungsmechanismus in PHP

Vertiefende Kenntnisse des bidirektionalen SSL/TLS-Authentifizierungsmechanismus in PHP

王林
王林Original
2023-08-07 19:37:431523Durchsuche

Vertiefende Kenntnisse des bidirektionalen SSL/TLS-Authentifizierungsmechanismus in PHP

Umfassendes Verständnis des bidirektionalen SSL/TLS-Authentifizierungsmechanismus in PHP

SSL (Secure Sockets Layer) und TLS (Transport Layer Security) sind Protokolle, die zum Schutz der Sicherheit der Netzwerkkommunikation verwendet werden. In PHP können wir die OpenSSL-Erweiterung verwenden, um das SSL/TLS-Protokoll zu verwenden. Das SSL/TLS-Protokoll bietet einen bidirektionalen Authentifizierungsmechanismus, um die Authentifizierung zwischen dem Client und dem Server sicherzustellen und die Kommunikationssicherheit zu gewährleisten. Dieser Artikel befasst sich mit dem Mechanismus der bidirektionalen SSL/TLS-Authentifizierung in PHP und stellt einige Codebeispiele bereit.

  1. Zertifikat erstellen

Für die bidirektionale Authentifizierung müssen beide Parteien über eigene Zertifikate verfügen. Im Allgemeinen muss der Server über ein öffentliches Schlüsselzertifikat verfügen und der Client muss ein öffentliches/privates Schlüsselpaar generieren und den öffentlichen Schlüssel dem Server bereitstellen.

Das Serverzertifikat kann durch die folgenden Schritte erstellt werden:

$sslConfig = array(
    "private_key_bits" => 2048,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);
$sslContext = openssl_pkey_new($sslConfig);
openssl_pkey_export($sslContext, $privateKey);
$csr = openssl_csr_new(
    array(
        "commonName" => "example.com",
        "subjectAltName" => "www.example.com",
    ),
    $privateKey
);
openssl_csr_export($csr, $csrOut);
openssl_csr_sign($csr, null, $privateKey, 365);
openssl_x509_export($csr, $publicKey);

file_put_contents("server.key", $privateKey);
file_put_contents("server.csr", $csrOut);
file_put_contents("server.crt", $publicKey);

Das öffentliche/private Schlüsselpaar des Clients kann durch die folgenden Schritte generiert werden:

$sslConfig = array(
    "private_key_bits" => 2048,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);
$sslContext = openssl_pkey_new($sslConfig);
openssl_pkey_export($sslContext, $privateKey);
$csr = openssl_csr_new(
    array(
        "commonName" => "client.example.com",
    ),
    $privateKey
);
openssl_csr_export($csr, $csrOut);
openssl_csr_sign($csr, null, $privateKey, 365);
openssl_x509_export($csr, $publicKey);

file_put_contents("client.key", $privateKey);
file_put_contents("client.csr", $csrOut);
file_put_contents("client.crt", $publicKey);
  1. Konfigurieren Sie den Server

Der Server muss den öffentlichen Schlüssel laden Geben Sie das Zertifikat und den privaten Schlüssel ein und fahren Sie dann mit der bidirektionalen Authentifizierung fort.

Hier ist ein einfaches Beispiel:

$sslOptions = array(
    "local_cert" => "server.crt",
    "local_pk" => "server.key",
);

$sslContext = stream_context_create(array(
    "ssl" => $sslOptions,
));

Der obige SSL-Kontext kann dann beim Erstellen des Servers verwendet werden:

$server = stream_socket_server(
    "ssl://0.0.0.0:443",
    $errno,
    $errorMessage,
    STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,
    $sslContext
);

In diesem Beispiel lauscht der Server auf dem lokalen Port 443 und verwendet ein vertrauenswürdiges Zertifikat für die SSL-Kommunikation.

  1. Konfigurieren Sie den Client

Der Client muss das öffentliche/private Schlüsselpaar laden und seinen öffentlichen Schlüssel für den Handshake mit dem Server verwenden.

Hier ist ein einfaches Beispiel:

$sslOptions = array(
    "local_cert" => "client.crt",
    "local_pk" => "client.key",
);

$sslContext = stream_context_create(array(
    "ssl" => $sslOptions,
));

Der obige SSL-Kontext kann dann beim Erstellen eines Clients verwendet werden:

$client = stream_socket_client(
    "ssl://example.com:443",
    $errno,
    $errorMessage,
    30,
    STREAM_CLIENT_CONNECT,
    $sslContext
);

In diesem Beispiel stellt der Client eine Verbindung zu Port 443 von example.com her und verwendet seinen öffentlichen Schlüssel mit dem Server führt den SSL-Handshake durch.

  1. Überprüfen Sie die bidirektionale Authentifizierung

Sobald beide Parteien erfolgreich eine Verbindung hergestellt haben und SSL/TLS für den Handshake verwenden, kann die bidirektionale Authentifizierung durchgeführt werden.

Hier ist ein einfaches Beispiel:

Serverseite:

$peerCertificate = openssl_x509_parse(stream_context_get_params($client)["options"]["ssl"]["peer_certificate"]);

if ($peerCertificate["subject"]["CN"] === "client.example.com") {
    // 鉴权成功
} else {
    // 鉴权失败
}

Clientseite:

$peerCertificate = openssl_x509_parse(stream_context_get_params($client)["options"]["ssl"]["peer_certificate"]);

if ($peerCertificate["subject"]["CN"] === "example.com") {
    // 鉴权成功
} else {
    // 鉴权失败
}

In diesem Beispiel analysieren sowohl die Serverseite als auch die Clientseite gegenseitig das Zertifikat und prüfen, ob der Common Name (CN) im Zertifikat vorhanden ist Wie erwartet. Wenn die Authentifizierung fehlschlägt, stimmt das Zertifikat möglicherweise nicht überein oder das Zertifikat wurde manipuliert.

Fazit

Durch ein tiefes Verständnis des SSL/TLS-Zwei-Wege-Authentifizierungsmechanismus in PHP haben wir gelernt, wie man Zertifikate generiert, Server und Clients konfiguriert und eine Zwei-Wege-Authentifizierungsüberprüfung durchführt. Der bidirektionale Authentifizierungsmechanismus SSL/TLS kann eine sichere Kommunikation zwischen dem Server und dem Client gewährleisten und die Sicherheit der Datenübertragung verbessern. In der tatsächlichen Entwicklung sollten wir die bidirektionale SSL/TLS-Authentifizierung entsprechend den tatsächlichen Anforderungen angemessen konfigurieren und verwenden.

Das obige ist der detaillierte Inhalt vonVertiefende Kenntnisse des bidirektionalen SSL/TLS-Authentifizierungsmechanismus in PHP. 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