Подключение к сокету .NET Sslstream x.509 с помощью Python, Ruby или Perl - PullRequest
2 голосов
/ 24 ноября 2010

У меня странное требование.Я пытаюсь связаться с сервером, написанным на C #.В основном это выглядит так:

 SslStream sslStream = new SslStream(client.GetStream(), true,
                                   ValidateServerCertificate,
                                   SelectLocalCertificate); 
sslStream.AuthenticateAsServer(_pushCert);

У меня также есть пример кода на C #, который использует сертификат X509 и подключается к серверу.У меня также есть пароль для файла cert.pfx.

Что я хотел бы сделать, это настроить какой-нибудь сценарий оболочки, который может подключаться к сокету, передавать несколько байтов и получать ответ.(на самом деле на любом языке, хотя я смотрел на Python, Ruby или Perl)

Я пытался использовать оболочку SSL из Python, но я получаю сообщение об ошибке, в котором говорится, что сервер / клиент не общается с известным алгоритмом.

Пример моего кода Python:

ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = ssl.wrap_socket(ss, ca_certs=CERT, ssl_version=ssl.PROTOCOL_SSLv23 )
#Attempt connection to our server
try:
    s.connect((HOST, PORT))
    print s
except:
    print 'ERROR Connecting'
    sys.exit(0)

Для CERT я пробовал несколько разных файлов: .pfx, а некоторые извлекаются из .pfx с помощью openssl.

Я также пробовал много разных примеров (Аргументы для ssl.wrap_socket).Я не очень знаком с этими связями.

Может быть, кто-то здесь мог бы протянуть руку?

Спасибо!

1 Ответ

0 голосов
/ 08 декабря 2010

Вы можете упростить вызов конструктора SslStream:

SslStream sslStream = new SslStream(client.GetStream()); 
sslStream.AuthenticateAsServer(_pushCert);

Этот сервер отправляет _pushCert и не ожидает, что клиент отправит сертификат обратно.Серверу нужен закрытый ключ для сертификата, чтобы установить соединение SSL.

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

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

Ни одной из сторон не нужен закрытый ключ для корневого центра сертификации или промежуточного сертификата подписи.

Однако, если ваш серверожидает, что клиент отправит сертификат клиента, затем вы должны вызвать AuthenticateAsServer с большим количеством аргументов (clientCertificateRequired == true).В этом случае клиенту нужен как собственный сертификат, так и закрытый ключ для его сертификата.Серверу нужен корень CA, который подписывает сертификат клиента в своем доверенном хранилище.Оболочка клиента возьмет файл pfx, например, содержащий сертификат клиента и закрытый ключ.Серверу не нужен закрытый ключ клиента.

...