我有这个工作实现,但要确保它是安全的。目标是使用SSLStream,并且只接受来自服务器的由特定RSA密钥签名的SSL证书。要求SslStream只接受由特定公钥签名的证书
这里是我的连接代码:
var client = new TcpClient("server_address", port_number);
var sslStream = new SslStream(client.GetStream(), false,
new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
sslStream.AuthenticateAsClient("SpeechGrid");
这里是我的执行ValidateServerCertificate的:
private static bool ValidateServerCertificate(object sender, X509Certificate certificate,
X509Chain chain, SslPolicyErrors sslPolicyErrors) {
// Only accept our specific key pair
foreach (var cert in chain.ChainElements) {
if (cert.Certificate.GetPublicKeyString() == k_prodPublicKey) {
return true;
}
}
return false;
}
因为X509Chain对象我想确保我没有的丰富的需要检查X509ChainStatusFlags.NotSignatureValid等事情。
例如,攻击者是否可以“声称”由我的酒吧签名许可证密钥,发送一个无效签名,并且这种攻击将工作,因为.NET假定我正在检查所有这些标志?
谢谢!
更新:好的,到目前为止,我决定把以下检查放在原始foreach之上。请注意,这在某种程度上是特定的;例如,如果我想要证书过期我会检查NotTimeValid等
foreach (var status in chain.ChainStatus) {
switch (status.Status) {
case X509ChainStatusFlags.Cyclic:
case X509ChainStatusFlags.NotSignatureValid:
case X509ChainStatusFlags.PartialChain:
return false;
}
}
** ** public ** key用于普通大众......只有你(带私钥的人)可以解密加密的消息,但。如果您想确保数据来自第三方,请从中获取公钥(他们将使用密钥对数据进行加密)。 – 2011-03-07 21:33:57