У меня есть рабочая реализация этого, но я хочу убедиться, что это безопасно.Цель состоит в том, чтобы использовать SSLStream и принимать только SSL-сертификаты с сервера, которые подписаны определенным ключом RSA.
Вот мой код подключения:
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;
}
}