2010-11-24 3 views
2

У меня есть странное требование. Я пытаюсь связаться с сервером, написанным на C#. Похоже, что это в основном:Подключение к .NET Sslstream x.509 сокет с Python или Ruby или Perl

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 я попробовал несколько различных filee: в .pfx, а некоторые извлечены из .pfx с помощью OpenSSL.

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

Возможно, кто-то здесь может протянуть руку?

Спасибо!

+0

Серверу необходим доступ к закрытому ключу сервера, а не к клиенту. – 2010-11-24 01:23:12

ответ

0

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

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

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

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

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

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

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