Как создать TCP-соединение с клиентским сертификатом в Powershell - PullRequest
1 голос
/ 26 января 2012

С помощью следующего кода я могу установить соединение SSL:

   $cert = dir cert:\CurrentUser\My | where {$_.Subject -like "*Alice*"}

   $computerName = "google.com"
   $port = "443"

   $socket = New-Object Net.Sockets.TcpClient($computerName, $port)
   $stream = $socket.GetStream()

   $sslStream = New-Object System.Net.Security.SslStream $stream,$false
   $sslStream.AuthenticateAsClient($computerName)


    $sslStream

Это работает нормально.Но теперь я не хочу добавлять сертификат клиента для аутентификации.Думаю, мне просто нужно заменить

$sslStream.AuthenticateAsClient($computerName)

на

$sslStream.BeginAuthenticateAsClient($computerName,$cert,"SslProtocols",$false,"Foo" ,"Bar")

Но мне не повезло правильно понять Аргументы.Может ли Sombody решить Assync Calls, пожалуйста ;-) Может быть, мне нужен какой-нибудь код C # для этого?!?

Аргументы:

System.IAsyncResult BeginAuthenticateAsClient(

string targetHost, 
System.Security.Cryptography.X509Certificates.X509CertificateCollection clientCertificates, 
System.Security.Authentication.SslProtocols enabledSslProtocols,
bool checkCertificateRevocation, 
System.AsyncCallback asyncCallback, 
System.Object asyncState)

Чего я, наконец, хочу достичь, это перечислить и позжеукажите CipherSuites, к которым подключен клиент.(Я мог бы использовать Wireshark, я знаю ;-))

Ответы [ 2 ]

3 голосов
/ 26 января 2012

Наконец-то все заработало, не аргумент 4, а $ Cert, который не был коллекцией.

   $cert = dir cert:\CurrentUser\My | where {$_.Subject -like "*alice*"}

   $computerName = "google.com"
   $port = "443"

    [System.Security.Authentication.SslProtocols]$protocol = "ssl3"

   $certcol = New-object System.Security.Cryptography.X509Certificates.X509CertificateCollection
   $certcol.Add($cert)




   $socket = New-Object Net.Sockets.TcpClient($computerName, $port)
   $stream = $socket.GetStream()

   $sslStream = New-Object System.Net.Security.SslStream $stream,$false
   #$sslStream.AuthenticateAsClient($computerName)
   $sslStream.AuthenticateAsClient($computerName,$certcol,$protocol,$false) 


    $sslStream
0 голосов
/ 26 января 2012

Согласно документации, разница между AuthenticateAsClient и BeginAuthenticateAsClient заключается в том, что последний предназначен для асинхронного использования.

Вам следует попробовать AuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean), где второй аргументявляется набором клиентских сертификатов, которые можно использовать (предпочтительно X509Certificate2, поскольку вам потребуется закрытый ключ, связанный с сертификатом, чтобы его можно было использовать для аутентификации).

...