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

王林
Lepaskan: 2023-08-07 19:42:02
asal
1577 orang telah melayarinya

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);
Salin selepas log masuk

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);
Salin selepas log masuk
  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,
));
Salin selepas log masuk

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
);
Salin selepas log masuk

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,
));
Salin selepas log masuk

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
);
Salin selepas log masuk

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 {
    // 鉴权失败
}
Salin selepas log masuk

Pihak pelanggan:

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

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

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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan