我用python3编写服务器,用PHP编写客户端。 我的客户端可以与服务器通信,但我想在此连接中添加SSL。
为什么下面这两个脚本无法相互通信?
server.py
#!/usr/bin/env python3
import ssl
import socket
ssl_context = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH)
ssl_context.load_verify_locations(capath='.')
sock = socket.socket()
sock = ssl_context.wrap_socket(sock)
sock.bind(('0.0.0.0', 9000))
sock.listen(5)
csock, address = sock.accept()
csock.send(b'Server is listening...')
while True:
client_msg = csock.recv(256)
if not client_msg:
break
print('Client said: {}'.format(client_msg))
csock.close()
sock.close()
client.php
<?php
$context = stream_context_create([
'ssl' => [
'local_cert' => 'test.crt'
]
]);
$sock = stream_socket_client(
'ssl://localhost:9000',
$errno, $errstr,
30,
STREAM_CLIENT_CONNECT,
$context
);
fwrite($sock, 'hello from client');
fclose($sock);
test.key和test.crt generation
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout test.key -out test.crt
修改 @syntonym - 原始错误是:
client.php
PHP警告:stream_socket_client():无法设置私钥文件`test.crt&#39;在第19行的client.php中 PHP警告:stream_socket_client():无法在第19行的client.php中启用加密 PHP警告:stream_socket_client():无法连接到第19行client.php中的ssl:// localhost:9000(未知错误)
server.py
self._sslobj.do_handshake() ssl.SSLEOFError:EOF发生违反协议(_ssl.c:645)
修改 @Deepti 你的答案推动了这个问题。我补充说:
...
'ssl' => [
'local_cert' => 'test.crt',
'local_pk' => 'test.key'
...
现在我有错误:
server.py
self._sslobj.do_handshake() ssl.SSLError:[SSL:NO_SHARED_CIPHER]没有共享密码(_ssl.c:645)
client.php
PHP警告:stream_socket_client():SSL操作失败,代码为1. OpenSSL错误消息: 错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:第15行client.php中的sslv3警报握手失败 PHP警告:stream_socket_client():无法在第15行的client.php中启用加密 PHP警告:stream_socket_client():无法连接到第15行的client.php中的ssl:// localhost:9000(未知错误) PHP警告:fwrite()期望参数1是资源,在第17行的client.php中给出布尔值 PHP警告:fclose()期望参数1是资源,第18行的client.php中给出的布尔值