【问题标题】:Connecting to .NET Sslstream x.509 socket with Python or Ruby or Perl使用 Python 或 Ruby 或 Perl 连接到 .NET Sslstream x.509 套接字
【发布时间】:2010-11-24 01:14:20
【问题描述】:

我有一个奇怪的要求。我正在尝试与用 C# 编写的服务器通信。基本上是这样的:

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

我还有使用 X509 证书并连接到服务器的 C# 示例代码。我也有 cert.pfx 文件的密码。

我想做的是设置某种可以连接到套接字、传输几个字节并接收响应的 shell 脚本。 (实际上任何语言,虽然我在看 Python 或 Ruby 或 Perl)

我尝试使用 Python 中的 SSL 包装器,但我收到一条错误消息,指出它们不是供服务器/客户端通信的已知算法。

我的 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,以及使用 openssl 从 .pfx 中提取的一些文件。

我也尝试了许多不同的示例(ssl.wrap_socket 的参数)。我对这些联系也不是很熟悉。

也许这里有人可以帮忙?

谢谢!

【问题讨论】:

  • 服务器需要访问服务器私钥,而不是客户端。
  • 我使用的证书 (.pfx) 来自连接到此服务器的 C# 客户端。我不断收到的错误(异常)是:“客户端和服务器无法通信,因为它们没有通用算法”
  • AuthenticateAsServer 默认使用 SSL 3.0 或 TLS 1.0,而您的 Python 代码似乎使用 SSL 2 或 3。所以他们应该同意 SSL 3.0(其中 afaik 指定了一组所有实现必须支持的算法)。我想说这里唯一可能的失败点是证书。换一个试试。 (您可以使用makecert.exe 轻松创建自签名证书。)
  • 感谢指点!现在我没有遇到异常,但是 python 脚本在 s.connect 上冻结了。之后 C# 服务器似乎也停止做任何事情了。也许是某种握手或需要做的事情。
  • 当我杀死 python 进程(使用 100% cpu)时,C# 会: e = {"无法从传输连接读取数据:现有连接被远程主机强行关闭。"}所以它似乎在等待一些数据什么的。

标签: c# python ssl sslstream


【解决方案1】:

您可以简化您的 SslStream 构造函数调用:

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

此服务器发送 _pushCert 并且不希望客户端发回证书。服务器需要证书的私钥来建立 SSL 连接。

客户端只需要签署服务器证书的 CA 根证书(或接受不受信任证书的选项)。这需要位于“受信任的根证书存储”中,或者以其他方式标识为受客户端包装器信任。

如果服务器证书由中间 CA 证书签名,而中间 CA 证书本身由根 CA 证书签名,则客户端也需要该中间证书。这可以由服务器发送,也可以已经在客户端。无论哪种方式,整个签名证书链都必须在客户端手中,以验证链上的所有签名。中间 CA 证书不需要位于受信任的根存储中。

双方都不需要 CA 根或中间签名证书的私钥。

但是,如果您的服务器希望客户端发送客户端证书,那么您必须使用更多参数调用 AuthenticateAsServer (clientCertificateRequired == true)。在这种情况下,客户端既需要自己的证书,也需要其证书的私钥。服务器需要在其受信任的存储区中签署客户端证书的 CA 根。例如,客户端包装器将采用一个 pfx 文件,其中包含客户端证书和私钥。服务器不需要客户端的私钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    相关资源
    最近更新 更多