php - 将 Python 中的 SSL 套接字迁移到 PHP

标签 php python sockets ssl

我有这段 Python 代码。它应该按原样工作 - 连接到远程服务器并发送数据包并检查响应的延迟时间。


    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(20)

    ssl_sock = ssl.wrap_socket(s,
                               keyfile="client_MY.key",
                               certfile="client_MY.crt",
                               ca_certs="CA_MY_chain.crt",
                               cert_reqs=ssl.CERT_REQUIRED)    

    ssl_sock.connect(('111.111.111.111', 2500)) # fake IP addy

    # ... onward to sending & receiving a packet...

编辑:在获得正确的 IP 地址后,上面的 python 代码运行并成功返回一个数据包。

编辑:在添加“verify_peer_name”之后,PHP 代码现在返回一个有效的套接字。

现在我需要转换一些使用 pack() 构建消息的 python 代码

以下是我迄今为止将 Python 转换为 PHP 所做的工作:


    $transport = "ssl";
    $ip = "111.111.111.111";
    $port = "2500";
    $timeout = 5;

    $local_pk   = "client_MY.key";
    $local_cert = "client_MY.crt"; // Path to certificate
    $cafile     = "CA_MY_chain.crt";

    //dd("openssl s_client -connect $ip:$port -cert $local_cert -key $local_pk -CAfile $cafile -showcerts -state");
    // openssl s_client -connect 111.111.111.111:2500 -cert client_MY.crt -key client_MY.key -CAfile CA_MY_chain.crt -showcerts -state

        $context = stream_context_create(
            array(
                $transport=>array(
                    'local_cert'=> $local_cert,
                    'local_pk'=> $local_pk,
                    'cafile'=>$cafile,
                    'verify_peer'=>true,
                    'verify_peer_name'=>false
                )
            )
        );

    if ($socket = stream_socket_client(
        "$transport://$ip:$port",
        $errno,
        $errstr,
        $timeout,
        STREAM_CLIENT_CONNECT,
        $context)
    ) {
        fwrite($socket, "\n");
        echo fread($socket,8192);
        fclose($socket);
    } else {
        echo "ERROR: $errno - $errstr\n";
    }

我的问题是:我是否正确地将代码移植/迁移到 PHP?我也不知道用什么来代替“cert_reqs”。我也不确定我是否正确完成了 key /证书文件。

我已经在 CLI 上尝试了注释掉的 openssl 调用,但它没有做任何事情。这就像远程登录到邮件服务器。除了无论我输入什么,都不会返回任何内容。在我按下 ctrl-c 后,出现了一堆 echo 。

最佳答案

成功。重要的部分是从客户那里获得正确的 IP 地址和端口。它也可能是 111.111.111.111:2500。然后添加

也很重要
'verify_peer_name'=>false

并创建了一个套接字。

关于php - 将 Python 中的 SSL 套接字迁移到 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59227748/

相关文章:

php - 如果查询在引号之间,如何从elasticsearch获取精确的文本匹配

php - 'C :\wmic' is not recognized as an internal or external command, 可运行的程序或批处理文件

python - python中为什么字符串被分割成字符

Python 字符串打印为 [u'String']

python - 在 python 3.5 上打开 UDP 套接字

javascript - 使用多页的选择选项标记从 mysql 中排序数据

php - 让搜索引擎链接到子页面而不是索引

python - 在 Python 2.7 中,为什么我要在其上调用方法时必须将 `int` 括在括号中?

c# - 带有 IPv6 地址的 Socket.Connect 引发 "Address Family Not supported"错误

java - 在Java中通过套接字传输文件的缓冲区大小应该是多少