У меня есть сервер, написанный на 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 генерация
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout test.key -out test.crt
Редактировать
@ Syntonym - оригинальная ошибка:
client.php
PHP Предупреждение: stream_socket_client (): невозможно установить файл закрытого ключа `test.crt 'в client.php в строке 19
Предупреждение PHP: stream_socket_client (): не удалось включить шифрование в client.php в строке 19
Предупреждение PHP: stream_socket_client (): невозможно подключиться к ssl: // localhost: 9000 (неизвестная ошибка) в client.php в строке 19
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: сбой квитирования оповещения sslv3 в client.php в строке 15
Предупреждение PHP: stream_socket_client (): не удалось включить шифрование в client.php в строке 15
Предупреждение PHP: stream_socket_client (): невозможно подключиться к ssl: // localhost: 9000 (неизвестная ошибка) в client.php в строке 15
Предупреждение PHP: fwrite () ожидает, что параметр 1 будет ресурсом, логическое значение указано в client.php в строке 17
Предупреждение PHP: fclose () ожидает, что параметр 1 будет ресурсом, логическое значение указывается в client.php в строке 18