【发布时间】: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 = {"无法从传输连接读取数据:现有连接被远程主机强行关闭。"}所以它似乎在等待一些数据什么的。