c# - 使用 Python 或 Ruby 或 Perl 连接到 .NET Sslstream x.509 套接字

标签 c# python ssl sslstream

我有一个奇怪的要求。我正在尝试与用 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/

相关文章:

c# - 如何将参数从@Url.Action 传递给 Controller ​​函数

c# - 使用 Linq 递归查询 XML

c# - 正则表达式中的子表达式

python - 使用实时视频源中的 openCV 检测球的颜色

python - 复杂的矩阵乘法

java - 在 Dropwizard 中设置 SSL

curl (35) 安全卡或 token 不存在

c# - WPF 数据网格在 c# 中与远程/在线 mysql 绑定(bind)

asp.net - 如何完全编写导入 SSL 证书并将此证书绑定(bind)到特定站点的过程的脚本

python - 使用 python apscheduler 调度作业