현재 위치: > 최신 기사 목록> Socket_accept () + TLS는 암호화 된 데이터 전송을 구현합니다 (OpenSSL 확장자와 결합)

Socket_accept () + TLS는 암호화 된 데이터 전송을 구현합니다 (OpenSSL 확장자와 결합)

M66 2025-06-01

PHP에서 Socket_accept () 는 클라이언트 연결을 수락하고 OpenSSL 확장과 함께 TLS 암호화 된 전송을 구현하는 데 사용됩니다. 이는 네트워크 통신 보안을 개선하는 일반적인 방법입니다. 이 기사는 기본 소켓 인터페이스를 사용하여 OpenSSL 확장과 협력하여 암호화 된 TLS 기반 전송을 달성하는 방법을 소개합니다.

1. 준비

  1. PHP가 OpenSSL 확장을 지원하는지 확인하십시오 phpinfo () 또는 명령 줄 php -m을 통해 OpenSSL 모듈이 활성화되어 있는지 확인하십시오.

  2. 인증서 및 개인 키 <br> 준비하십시오 OpenSSL 명령을 사용하여 자체 서명 된 인증서를 생성 할 수 있습니다.

     openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt
    
  3. 소켓 서버를 만듭니다 <br> Socket_create () 및 관련 기능을 사용하여 기본 TCP 서버를 구축하십시오.

2. 샘플 코드 설명

다음 예제는 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);

3. 키 포인트 설명

  1. socket_export_stream ()
    이 기능은 소켓 리소스를 PHP 스트림 리소스로 변환하여 Stream_Socket_enable_crypto ()를 사용하여 TLS 업그레이드를 수행 할 수 있습니다.

  2. stream_socket_enable_crypto ()
    TLS 핸드 셰이크 및 암호화 시작을 담당합니다. 세 번째 매개 변수는 서버 모드 ( stream_crypto_method_tls_server )를 선택하고 암호화를 활성화합니다.

  3. 인증서 구성
    Stream_Context_create () 에서 인증서와 개인 키 경로를 전달하십시오. 예에서는 allow_self_signedgryify_peer 설정이 테스트 환경에 적합하며 공식 환경을 검증해야합니다.

  4. 데이터 전송 <br> 후속 데이터 읽기 및 쓰기는 암호화 된 스트림을 통해 수행되며 암호화 및 암호 해독이 자동으로 완료됩니다.


4. 요약

Socket_accept () 및 OpenSSL Extension을 통해 PHP는 데이터 보안을 보장하기 위해 TLS 암호화 된 전송을 유연하게 구현할 수 있습니다. 핵심은 소켓 리소스를 스트림으로 변환하고 암호화 및 업그레이드에 stream_socket_enable_crypto ()를 사용하고 효과적인 인증서 관리와 결합하여 안전한 암호화 된 통신 서비스를 쉽게 구축하는 것입니다.