Maison  >  Article  >  développement back-end  >  Compréhension approfondie du mécanisme d'authentification bidirectionnelle SSL/TLS en PHP

Compréhension approfondie du mécanisme d'authentification bidirectionnelle SSL/TLS en PHP

王林
王林original
2023-08-07 19:37:431523parcourir

Compréhension approfondie du mécanisme dauthentification bidirectionnelle SSL/TLS en PHP

Compréhension approfondie du mécanisme d'authentification bidirectionnelle SSL/TLS en PHP

SSL (Secure Sockets Layer) et TLS (Transport Layer Security) sont des protocoles utilisés pour protéger la sécurité des communications réseau. En PHP, on peut utiliser l'extension OpenSSL pour utiliser le protocole SSL/TLS. Le protocole SSL/TLS fournit un mécanisme d'authentification bidirectionnelle pour assurer l'authentification entre le client et le serveur et assurer la sécurité des communications. Cet article approfondira le mécanisme d'authentification bidirectionnelle SSL/TLS en PHP et fournira quelques exemples de code.

  1. Créer un certificat

L'authentification bidirectionnelle nécessite que les deux parties disposent de leurs propres certificats. De manière générale, le serveur doit disposer d'un certificat de clé publique et le client doit générer une paire de clés publique/privée et fournir la clé publique au serveur.

Le certificat du serveur peut être créé par les étapes suivantes :

$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);

La paire clé publique/clé privée du client peut être générée par les étapes suivantes :

$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. Configurer le serveur

Le serveur doit charger la clé publique certificat et clé privée, puis procédez à l'authentification bidirectionnelle.

Voici un exemple simple :

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

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

Le contexte SSL ci-dessus peut ensuite être utilisé lors de la création du serveur :

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

Dans cet exemple, le serveur écoutera sur le port local 443 et utilisera un certificat de confiance pour la communication SSL.

  1. Configurer le client

Le client doit charger la paire de clés publique/privée et utiliser sa clé publique pour établir une liaison avec le serveur.

Voici un exemple simple :

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

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

Le contexte SSL ci-dessus peut ensuite être utilisé lors de la création d'un client :

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

Dans cet exemple, le client va se connecter au port 443 de exemple.com et utiliser sa clé publique avec le serveur effectue la négociation SSL.

  1. Vérifiez l'authentification bidirectionnelle

Une fois que les deux parties ont réussi à établir une connexion et à utiliser SSL/TLS pour la prise de contact, une authentification bidirectionnelle peut être effectuée.

Voici un exemple simple :

Côté serveur :

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

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

Côté client :

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

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

Dans cet exemple, le côté serveur et le côté client analyseront mutuellement le certificat et vérifieront si le nom commun (CN) dans le certificat est Comme prévu. Si l'authentification échoue, le certificat peut ne pas correspondre ou avoir été falsifié.

Conclusion

En comprenant profondément le mécanisme d'authentification bidirectionnelle SSL/TLS en PHP, nous avons appris à générer des certificats, à configurer des serveurs et des clients et à effectuer une vérification d'authentification bidirectionnelle. Le mécanisme d'authentification bidirectionnelle SSL/TLS peut garantir une communication sécurisée entre le serveur et le client et améliorer la sécurité de la transmission des données. Dans le développement actuel, nous devrions raisonnablement configurer et utiliser l'authentification bidirectionnelle SSL/TLS en fonction des besoins réels.

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!

Déclaration:
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