Создайте самозаверяющий сокет SSL от клиента Java (на Android) к серверу Python
Я создал самозаверяющий сертификат (server.crt, server.key, server.p12). Я получаю соединение через сокет Python-Python SSL с помощью этого самозаверяющего сертификата, работающего просто отлично.
Python сервер:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 10023))
s.listen(5)
s_, fromaddr = s.accept()
connstream = ssl.wrap_socket(s_,
server_side=True,
certfile="server.crt",
keyfile="server.key")
data = connstream.read()
...
Теперь я хотел бы, чтобы мое приложение для Android общалось с моим сервером Python. Я могу установить соединение без SSL. Я не уверен, как поступить с самоподписанными сертификатами. Насколько я понимаю, я должен хранить сертификат в хранилище доверенных сертификатов Java. У меня возникают трудности с поиском примеров выполнения этого в приложении для Android (программно) с использованием файла доверенного сертификата (например, crt?). Очевидно, что область этого доверия ограничена только приложением и не предназначена для постоянного решения.
Java-клиент (на Android):
SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
Socket socket = ssf.createSocket(HOST, PORT);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("hello from java!");
out.flush();
...
Когда я пытаюсь подключиться, я получаю следующую ошибку на сервере:
ssl.SSLError: [Errno 1] _ssl.c:499: error:14094416:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate unknown
1 ответ
- экспортировать файл crt на сервер
- импортировать файл crt из заявлений или файла в коде Android
- настроить ЭЛТ с
TrustManagerFactory
в коде Android - в этом
SSLContext
сTrustManagerFactory
это ссылка на официальный документ