Что мне нужно для распространения (ключи, сертификаты) для подключения Python W / SSL-сокет?

StackOverflow https://stackoverflow.com/questions/4609859

  •  25-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь написать общий сервер-клиентское приложение, которое сможет обменять данные между серверами. Я прочитал довольно несколько документов OpenSSL, и я успешно настроил свой собственный CA и создал сертификат (и закрытый ключ) для целей тестирования.

Я застрял с Python 2.3, поэтому я не могу использовать стандартную библиотеку «SSL». Вместо этого я застрял с pyopenssl, который не кажется плохой, но не так много документов об этом.

Мой вопрос на самом деле не о его работе. Я более запутался к сертификатам и куда им нужно идти.

Вот мои две программы, которые делать работай:

Сервер:

#!/bin/env python

from OpenSSL import SSL
import socket
import pickle

def verify_cb(conn, cert, errnum, depth, ok):
    print('Got cert: %s' % cert.get_subject())
    return ok


ctx = SSL.Context(SSL.TLSv1_METHOD)
ctx.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT, verify_cb)

# ??????
ctx.use_privatekey_file('./Dmgr-key.pem')
ctx.use_certificate_file('Dmgr-cert.pem')
# ??????
ctx.load_verify_locations('./CAcert.pem')

server = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))

server.bind(('', 50000))
server.listen(3)

a, b = server.accept()

c = a.recv(1024)
print(c)

Клиент:

from OpenSSL import SSL
import socket
import pickle


def verify_cb(conn, cert, errnum, depth, ok):
    print('Got cert: %s' % cert.get_subject())
    return ok

ctx = SSL.Context(SSL.TLSv1_METHOD)
ctx.set_verify(SSL.VERIFY_PEER, verify_cb)

# ??????????
ctx.use_privatekey_file('/home/justin/code/work/CA/private/Dmgr-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/Dmgr-cert.pem')
# ?????????
ctx.load_verify_locations('/home/justin/code/work/CA/CAcert.pem')

sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
sock.connect(('10.0.0.3', 50000))

a = Tester(2, 2)
b = pickle.dumps(a)
sock.send("Hello, world")

sock.flush()
sock.send(b)
sock.shutdown()
sock.close()

Я нашел эту информацию от ftp://ftp.pbone.net/mirror/ftp.pld-inux.org/dists/2.0/pld/i586/pld/rpms/yython-pyopensssl-examples-0.6-2.i586.rpm. который содержит некоторые примеры сценариев.

Как вы могли бы собраться, я не полностью понимаю разделы между «# ????????». Я не понимаю, почему сертификат и частный ключ необходимы на клиенте, так и на сервере. Я не уверен, где каждый должен идти, но мне не нужно только распространять одну часть ключа (вероятно, общественная часть)? Он подрывает цель наличия асимметричных ключей, если вам все еще нужно как на каждом сервере, верно?

Я попробовал перемещаться с удалением либо пеки или сертификата на любой коробке, и я получаю следующую ошибку независимо от того, что я удаляю:

Openssl.ssl.Error: [(«Процедуры SSL», «SSL3_READ_BYTES», «SSLV3 Alert Headshake Shileckake»), («Процедуры SSL», «SSL3_WRITE_BYTES», «Сбой рукопожатия SSL»)]

Может ли кто-то объяснить, если это ожидаемое поведение для SSL. Мне действительно нужно распространять частный ключ и общественный сертификат всем своим клиентам? Я пытаюсь избежать любых огромных проблем безопасности, а утечка частных ключей, как правило, является большой ...

Спасибо за помощь!

==================================================================

Благодаря CAF за помощь мне выяснить проблему. Основываясь на его рекомендации, я создал два новых пары сертификата: Spaceman и Dmgr. Затем я поставил оба части «Spaceman» Parts (Key, Cert) в клиентской программе и то же самое для клавиш «DMGR».

В основном, только следующие две строки в Клиент Изменено, хотя на боковой стороне было много работы.

ctx.use_privatekey_file('/home/justin/code/work/CA/private/Dmgr-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/Dmgr-cert.pem')

Исправленная версия:

ctx.use_privatekey_file('/home/justin/code/work/CA/private/spaceman-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/spacemancert.pem')
Это было полезно?

Решение

В транзакции SSL каждая сторона может представить сертификат для проверки его личности на другую сторону. Для этого необходимо, чтобы закрыть ключ, соответствующий этому сертификату. Они предназначены для двух разные Сертификаты, поэтому каждая сторона будет иметь два разных частных ключа.

Эта пара сертификата / частной ключей является той, которую вы устанавливаете, используя use_privatekey_file() а также use_certificate_file(). Отказ Это должно быть разные Пара сертификата / ключей на сервере и клиенте.

При проверке сертификата сверстников вам потом нужно проверить:

  • Что сертификат действительный (то есть подписано CA, которое вы доверяете к этому приложению, не срок его действия, не отзыв); а также
  • Соответствует сверстнику, что вы думать Вы подключены к (то есть сертификат соответствует личности, что претензии к одному изобретению). Эта идентичность хранится в пределах SubjectName Поле сертификата, и это специфичный к применению, как вы сопоставляете это для идентификации сверстников (это может быть имя входа пользователя, имя DNS или что-то еще).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top