Rumah >pembangunan bahagian belakang >tutorial php >Pemahaman mendalam tentang mekanisme pengesahan dua hala SSL/TLS dalam PHP

Pemahaman mendalam tentang mekanisme pengesahan dua hala SSL/TLS dalam PHP

王林
王林asal
2023-08-07 19:37:431589semak imbas

Pemahaman mendalam tentang mekanisme pengesahan dua hala SSL/TLS dalam PHP

Pemahaman mendalam tentang mekanisme pengesahan dua hala SSL/TLS dalam PHP

SSL (Lapisan Soket Selamat) dan TLS (Keselamatan Lapisan Pengangkutan) ialah protokol yang digunakan untuk melindungi keselamatan komunikasi rangkaian. Dalam PHP, kita boleh menggunakan sambungan OpenSSL untuk menggunakan protokol SSL/TLS. Protokol SSL/TLS menyediakan mekanisme pengesahan dua hala untuk memastikan pengesahan antara klien dan pelayan dan memastikan keselamatan komunikasi. Artikel ini akan menyelidiki mekanisme pengesahan dua hala SSL/TLS dalam PHP dan memberikan beberapa contoh kod.

  1. Buat sijil

Pengesahan dua hala memerlukan kedua-dua pihak mempunyai sijil sendiri. Secara umumnya, pelayan perlu mempunyai sijil kunci awam, dan pelanggan perlu menjana pasangan kunci awam/peribadi dan memberikan kunci awam kepada pelayan.

Sijil pelayan boleh dibuat melalui langkah berikut:

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

Pasangan kunci awam/pribadi pelanggan boleh dijana melalui langkah berikut:

$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. Konfigurasikan pelayan

Pelayan perlu memuatkan kunci awam sijil dan kunci peribadi, dan kemudian teruskan pengesahan dua hala.

Berikut ialah contoh mudah:

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

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

Konteks SSL di atas kemudiannya boleh digunakan semasa membuat pelayan:

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

Dalam contoh ini, pelayan akan mendengar pada port tempatan 443 dan menggunakan sijil yang dipercayai untuk komunikasi SSL.

  1. Konfigurasikan pelanggan

Pelanggan perlu memuatkan pasangan kunci awam/peribadi dan menggunakan kunci awamnya untuk berjabat tangan dengan pelayan.

Berikut ialah contoh mudah:

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

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

Konteks SSL di atas kemudiannya boleh digunakan semasa membuat pelanggan:

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

Dalam contoh ini, pelanggan akan menyambung ke port 443 example.com dan menggunakan kunci awamnya dengan Pelayan melakukan jabat tangan SSL.

  1. Sahkan pengesahan dua hala

Setelah kedua-dua pihak berjaya mewujudkan sambungan dan menggunakan SSL/TLS untuk berjabat tangan, pengesahan dua hala boleh dilakukan.

Berikut ialah contoh mudah:

Sebelah pelayan:

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

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

Pihak pelanggan:

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

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

Dalam contoh ini, kedua-dua bahagian pelayan dan bahagian pelanggan akan menghuraikan sijil satu sama lain dan menyemak sama ada nama biasa (CN) dalam sijil adalah Seperti yang dijangka. Jika pengesahan gagal, sijil mungkin tidak sepadan atau sijil mungkin telah diganggu.

Kesimpulan

Dengan memahami secara mendalam mekanisme pengesahan dua hala SSL/TLS dalam PHP, kami belajar cara menjana sijil, mengkonfigurasi pelayan dan pelanggan serta melaksanakan pengesahan pengesahan dua hala. Mekanisme pengesahan dua hala SSL/TLS boleh memastikan komunikasi selamat antara pelayan dan pelanggan dan meningkatkan keselamatan penghantaran data. Dalam pembangunan sebenar, kita harus mengkonfigurasi dan menggunakan pengesahan dua hala SSL/TLS mengikut keperluan sebenar.

Atas ialah kandungan terperinci Pemahaman mendalam tentang mekanisme pengesahan dua hala SSL/TLS dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn