我有这段 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/