PHP에서 Socket_accept () 는 클라이언트 연결을 수락하고 OpenSSL 확장과 함께 TLS 암호화 된 전송을 구현하는 데 사용됩니다. 이는 네트워크 통신 보안을 개선하는 일반적인 방법입니다. 이 기사는 기본 소켓 인터페이스를 사용하여 OpenSSL 확장과 협력하여 암호화 된 TLS 기반 전송을 달성하는 방법을 소개합니다.
PHP가 OpenSSL 확장을 지원하는지 확인하십시오 phpinfo () 또는 명령 줄 php -m을 통해 OpenSSL 모듈이 활성화되어 있는지 확인하십시오.
인증서 및 개인 키 <br> 준비하십시오 OpenSSL 명령을 사용하여 자체 서명 된 인증서를 생성 할 수 있습니다.
openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt
소켓 서버를 만듭니다 <br> Socket_create () 및 관련 기능을 사용하여 기본 TCP 서버를 구축하십시오.
다음 예제는 socket_accept ()를 사용하여 클라이언트 연결을 수락 한 후 OpenSSL 확장을 통해 TLS 핸드 셰이크 및 암호화 된 통신을 수행하는 방법을 보여줍니다.
<?php
$host = '0.0.0.0';
$port = 8443;
// 만들다 TCP socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $host, $port);
socket_listen($sock);
echo "서버 시작,감시 장치 {$host}:{$port}\n";
// 로드 인증서 및 개인 키 경로
$certFile = '/path/to/server.crt';
$keyFile = '/path/to/server.key';
// 클라이언트 연결을 기다리고 있습니다
while (true) {
$clientSock = socket_accept($sock);
if ($clientSock === false) {
echo "연결을 수락하지 못했습니다\n";
continue;
}
// 만들다基于 socket ~의 stream 의지
$clientStream = socket_export_stream($clientSock);
// 만들다 SSL 문맥
$context = stream_context_create([
'ssl' => [
'local_cert' => $certFile,
'local_pk' => $keyFile,
'allow_self_signed' => true,
'verify_peer' => false,
]
]);
// 将普通~의 TCP 연결 업그레이드 TLS 암호화 된 연결
$sslStream = stream_socket_enable_crypto($clientStream, true, STREAM_CRYPTO_METHOD_TLS_SERVER);
if (!$sslStream) {
echo "TLS 핸드 셰이크가 실패했습니다\n";
fclose($clientStream);
socket_close($clientSock);
continue;
}
// 클라이언트 데이터를 읽습니다
$data = fread($clientStream, 8192);
echo "수신 된 데이터:$data\n";
// 응답을 보내십시오
fwrite($clientStream, "Hello from m66.net TLS server!\n");
// 연결을 닫으십시오
fclose($clientStream);
socket_close($clientSock);
}
socket_close($sock);
socket_export_stream ()
이 기능은 소켓 리소스를 PHP 스트림 리소스로 변환하여 Stream_Socket_enable_crypto ()를 사용하여 TLS 업그레이드를 수행 할 수 있습니다.
stream_socket_enable_crypto ()
TLS 핸드 셰이크 및 암호화 시작을 담당합니다. 세 번째 매개 변수는 서버 모드 ( stream_crypto_method_tls_server )를 선택하고 암호화를 활성화합니다.
인증서 구성
Stream_Context_create () 에서 인증서와 개인 키 경로를 전달하십시오. 예에서는 allow_self_signed 및 gryify_peer 설정이 테스트 환경에 적합하며 공식 환경을 검증해야합니다.
데이터 전송 <br> 후속 데이터 읽기 및 쓰기는 암호화 된 스트림을 통해 수행되며 암호화 및 암호 해독이 자동으로 완료됩니다.
Socket_accept () 및 OpenSSL Extension을 통해 PHP는 데이터 보안을 보장하기 위해 TLS 암호화 된 전송을 유연하게 구현할 수 있습니다. 핵심은 소켓 리소스를 스트림으로 변환하고 암호화 및 업그레이드에 stream_socket_enable_crypto ()를 사용하고 효과적인 인증서 관리와 결합하여 안전한 암호화 된 통신 서비스를 쉽게 구축하는 것입니다.