최신 네트워크 응용 프로그램에서 보안 커뮤니케이션이 특히 중요합니다. PHP는 소켓 기능과 TLS/SSL 암호화 프로토콜을 결합하여 안전한 암호화 된 통신을 달성하는 풍부한 네트워크 프로그래밍 인터페이스를 제공합니다. 이 기사는 PHP의 Socket_accept () 함수를 사용하여 TLS/SSL과의 안전한 연결을 달성하는 방법에 중점을 둘 것입니다.
Socket_accept () : PHP에서 소켓 프로그래밍의 중요한 기능으로 클라이언트 연결 요청을 수락하고 후속 통신을 위해 새로운 소켓 리소스를 반환하는 데 사용됩니다.
TLS/SSL : 통신 컨텐츠를 암호화하고 데이터 전송 보안을 보장하는 데 사용되는 전송 계층 보안.
서버 측면에서 소켓은 일반적으로 먼저 생성되며 바인딩 주소와 포트는 연결 요청을 듣도록 묶여 있습니다. 클라이언트 요청을받은 후에는 Socket_Accept ()를 호출하여 연결을 수락 한 다음 데이터를 읽거나 작성할 수 있습니다.
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 4433);
socket_listen($server);
$client = socket_accept($server);
$data = socket_read($client, 2048);
socket_write($client, "Hello Client!");
socket_close($client);
socket_close($server);
위의 예제 코드는 간단한 암호화되지 않은 통신입니다.
PHP의 자체 Socket_* 함수는 SSL/TLS를 직접 지원하지 않지만 OpenSSL 확장과의 안전한 통신을 구현하는 데 사용할 수 있습니다.
클라이언트에 연결된 소켓 자원을 수신 한 후 Stream_Socket_enable_crypto ()를 사용하여 암호화를 활성화하십시오.
// 만들다TCP socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 4433);
socket_listen($server);
// 클라이언트 연결을 수락합니다
$clientSocket = socket_accept($server);
if ($clientSocket === false) {
die("Failed to accept socket connection\n");
}
// 할 것이다 socket 리소스로 변환 stream 의지,사용하기 쉽습니다 stream_socket_enable_crypto()
$clientStream = socket_export_stream($clientSocket);
if ($clientStream === false) {
die("Failed to convert socket to stream\n");
}
// 설정 SSL 문맥,인증서 및 개인 키가 포함되어 있습니다
$contextOptions = [
'ssl' => [
'local_cert' => '/path/to/certificate.pem', // 서버 인증서 파일
'local_pk' => '/path/to/private_key.pem', // 개인 키 파일
'allow_self_signed' => true,
'verify_peer' => false,
]
];
$context = stream_context_create($contextOptions);
// 시작 TLS 암호화
if (!stream_socket_enable_crypto($clientStream, true, STREAM_CRYPTO_METHOD_TLS_SERVER, $context)) {
die("Failed to enable TLS encryption\n");
}
// 클라이언트 데이터를 읽습니다
$data = fread($clientStream, 2048);
echo "Received (decrypted): " . $data . "\n";
// 向客户端发送암호화数据
fwrite($clientStream, "Welcome to secure PHP server!");
// 연결을 닫으십시오
fclose($clientStream);
socket_close($server);
인증서 준비 : Local_Cert 및 Local_PK 파일은 유효한 인증서 및 개인 키 여야하며, 인증서는 신뢰할 수있는 CA에서 발행하거나 자체 서명해야합니다 (예에 표시된대로).
socket_export_stream () : 하위 레벨 소켓 리소스를 스트리밍으로 작동 할 수있는 리소스로 변환 한 다음 stream_socket_enable_crypto ()를 사용할 수 있습니다.
오류 처리 : 프로덕션 환경은 오류 캡처 및 로깅에 적합한 작업을 수행해야합니다.
보안 채팅 서비스 : 클라이언트와 서버 간의 통신 내용은 데이터가 도청되거나 변조되는 것을 방지하기 위해 암호화해야합니다.
개인 데이터 전송 : 엔터프라이즈 내부 서비스에는 민감한 데이터 전송을위한 암호화가 필요합니다.
사용자 정의 프로토콜 보안 업그레이드 : 소켓을 기반으로하는 사용자 정의 프로토콜은 TLS를 통해 구현하여 보안을 개선 할 수 있습니다.
php socket_accept () 와의 연결을 수신 한 후 OpenSSL에 의해 확장되는 stream_socket_enable_crypto ()는 TLS/SSL을 기반으로 보안 암호화 된 통신을 쉽게 구현할 수 있습니다. 초보자에게는 어렵지만 일단 마스터 된 경우 네트워크 응용 프로그램의 보안을 효과적으로 향상시킬 수 있습니다.