2013-10-08 50 views
2

我有问题,使用powershell连接到一个ssl套接字与自我认证证书。我有一个连接好的ruby客户端,我也用--ssl开关测试了ncat,并确认它连接正常。 $ sslStream.AuthenticateAsClient是代码失败的地方,我从powershell中得到以下错误:“带有”1“参数的异常调用”AuthenticateAsClient“:”对SSPI的调用失败,请参阅内部异常。“ 。Powershell SSL套接字客户端

PowerShell客户端中

$socket = New-Object Net.Sockets.TcpClient('172.26.4.38', 8080) 
$stream = $socket.GetStream() 
$sslStream = New-Object System.Net.Security.SslStream($stream,$false,({$True} -as [Net.Security.RemoteCertificateValidationCallback])) 
$sslStream.AuthenticateAsClient('172.26.4.38') 
$writer = new-object System.IO.StreamWriter($sslStream) 
$writer.WriteLine('hello world') 
$writer.flush() 
$socket.close() 

红宝石服务器

#!/usr/bin/env ruby 
require 'openssl' 
require 'socket' 
tcp_server = TCPServer.new('172.26.4.38', 8080) 
ctx = OpenSSL::SSL::SSLContext.new 
ctx.ssl_version = :SSLv23 
ctx.key = OpenSSL::PKey::RSA.new 2048 
ctx.cert = OpenSSL::X509::Certificate.new 
ctx.cert.subject = OpenSSL::X509::Name.new [['CN', '172.26.4.38']] 
ctx.cert.issuer = ctx.cert.subject 
ctx.cert.public_key = ctx.key 
ctx.cert.not_before = Time.now 
ctx.cert.not_after = Time.now + 60 * 60 * 24 
ctx.cert.sign ctx.key, OpenSSL::Digest::SHA1.new 
server = OpenSSL::SSL::SSLServer.new tcp_server, ctx 
socket = server.accept 
puts 'client connected' 
puts socket.gets 
+0

只是想指出的是,重新生成,如果你为每个连接您的自签名的证书,有没有办法让客户端将能够将其作为受信任的锚点,因此您必须始终以这种方式忽略无效证书,这也会使您的连接容易受到MITM攻击。 – Bruno

回答

0

这是创建自签名证书的ruby代码的问题。使用openssl和openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt以下的PowerShell代码正常工作。

客户

$socket = New-Object Net.Sockets.TcpClient('172.26.4.38', 8080) 
$stream = $socket.GetStream() 
$sslStream = New-Object System.Net.Security.SslStream($stream,$false,({$True} -as [Net.Security.RemoteCertificateValidationCallback])) 
$sslStream.AuthenticateAsClient('172.26.4.38') 
$writer = new-object System. IO.StreamWriter($sslStream) 
$writer.WriteLine('Hello World') 
$writer.flush() 
$socket.close() 

服务器

#!/usr/bin/env ruby 
require 'openssl' 
require 'socket' 
tcp_server = TCPServer.new('172.26.4.38', 8080) 
ctx = OpenSSL::SSL::SSLContext.new 
ctx.cert = OpenSSL::X509::Certificate.new(File.open('server.crt')) 
ctx.key = OpenSSL::PKey::RSA.new(File.open('server.key')) 
server = OpenSSL::SSL::SSLServer.new tcp_server, ctx 
socket = server.accept 
puts 'client connected' 
puts socket.gets 
0

你可以得到PowerShell中通过强制忽略任何证书问题无论如何回调只是返回true。

[Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} 

请注意,这将绕过powershell会话中的任何ssl验证。

+0

我试过了,我也试过 $ sslStream = New-Object System.Net.Security.SslStream($ socket.GetStream(),$ false,({$ True} -as [Net.Security.RemoteCertificateValidationCallback] )) 但这也因为某些原因不起作用。它一直在证书上失败。 – b00stfr3ak