我有一个奇怪的要求。我正在尝试与用 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 的参数)。我也不太熟悉这些联系。
也许这里有人可以伸出援手?
谢谢!
最佳答案
您可以简化 SslStream 构造函数调用:
SslStream sslStream = new SslStream(client.GetStream());
sslStream.AuthenticateAsServer(_pushCert);
此服务器发送 _pushCert 并且不希望客户端发回证书。服务器需要证书的私钥才能建立 SSL 连接。
客户端只需要签署服务器证书的 CA 根证书(或者接受不受信任的证书的选项。)这需要在“受信任的根证书库”中,或者以其他方式标识为对客户端包装程序的信任。
如果服务器证书由中间 CA 证书签名,而该中间 CA 证书本身由根 CA 证书签名,则客户端也需要该中间证书。可以由服务器发送,也可以已经在客户端。无论哪种方式,整个签名证书链都必须在客户端手中,以验证链上的所有签名。中间 CA 证书不需要位于受信任的根存储中。
双方都不需要 CA 根或中间签名证书的私钥。
但是,如果您的服务器希望客户端发送客户端证书,那么您必须使用更多参数调用 AuthenticateAsServer (clientCertificateRequired == true)。在这种情况下,客户端需要自己的证书和证书的私钥。服务器需要在其受信任的存储中签署客户端证书的 CA 根。例如,客户端包装器将采用一个 pfx 文件,其中包含客户端证书和私钥。服务器不需要客户端的私钥。
关于c# - 使用 Python 或 Ruby 或 Perl 连接到 .NET Sslstream x.509 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4262648/