ホームページ  >  記事  >  バックエンド開発  >  PHP の SSL/TLS 双方向認証メカニズムについての深い理解

PHP の SSL/TLS 双方向認証メカニズムについての深い理解

王林
王林オリジナル
2023-08-07 19:37:431521ブラウズ

PHP の SSL/TLS 双方向認証メカニズムについての深い理解

PHP における SSL/TLS 双方向認証メカニズムについての深い理解

SSL (Secure Sockets Layer) と TLS (Transport Layer Security) は、次の目的で使用されます。ネットワーク通信セキュリティ契約を保護します。 PHP では、OpenSSL 拡張機能を使用して SSL/TLS プロトコルを使用できます。 SSL/TLS プロトコルは、クライアントとサーバー間の認証を保証し、通信のセキュリティを確保するための双方向認証メカニズムを提供します。この記事では、PHP における SSL/TLS 双方向認証のメカニズムを詳しく説明し、いくつかのコード例を示します。

  1. 証明書の作成

双方向認証では、双方が独自の証明書を持っている必要があります。一般に、サーバーは公開キー証明書を持っている必要があり、クライアントは公開キーと秘密キーのペアを生成してサーバーに公開キーを提供する必要があります。

サーバー証明書は次の手順で作成できます:

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

クライアントの公開キー/秘密キーのペアは次の手順で生成できます:

$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. 構成サーバー

サーバーは、公開キー証明書と秘密キーをロードし、双方向認証を実行する必要があります。

これは簡単な例です:

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

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

上記の SSL コンテキストはサーバーの作成時に使用できます:

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

この例では、サーバーはローカルでリッスンします。 443 ポートを使用し、SSL 通信に信頼できる証明書を使用します。

  1. クライアントの構成

クライアントは、公開鍵/秘密鍵のペアをロードし、その公開鍵を使用してサーバーと握手をする必要があります。

これは簡単な例です:

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

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

上記の SSL コンテキストはクライアントの作成時に使用できます:

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

この例では、クライアントは example に接続します。 com のポート 443 に接続し、その公開キーを使用してサーバーとの SSL ハンドシェイクを実行します。

  1. 双方向認証の確認

双方が正常に接続を確立し、ハンドシェイクに SSL/TLS を使用すると、双方向認証を実行できます。

以下は簡単な例です:

サーバー側:

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

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

クライアント側:

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

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

この例では、サーバー側とクライアント側の両方が相手の証明書を解析し、証明書内の共通名 (CN) が期待どおりであることを確認します。認証に失敗した場合は、証明書が一致していないか、証明書が改ざんされている可能性があります。

結論

PHP の SSL/TLS 双方向認証メカニズムを深く理解することで、証明書の生成、サーバーとクライアントの構成、双方向認証検証の実行方法を理解できます。 SSL/TLS 双方向認証メカニズムにより、サーバーとクライアント間の安全な通信が保証され、データ送信のセキュリティが向上します。実際の開発では、実際のニーズに応じて SSL/TLS 双方向認証を合理的に構成して使用する必要があります。

以上がPHP の SSL/TLS 双方向認証メカニズムについての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。