Создайте самозаверяющий сокет 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

это ссылка на официальный документ

Другие вопросы по тегам