私はこれを実装していますが、安全であることを確認したいと考えています。目標は、SSLStream を使用し、特定の RSA キーによって署名されたサーバーからの SSL 証明書のみを受け入れることです。
これが私の接続コードです:
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 などをチェックする必要がないことを確認したいと思います。
たとえば、攻撃者が私の公開鍵で署名されていることを「主張」し、無効な署名を送信することは可能でしょうか?
ありがとう!!
更新: OK、これまでのところ、元の foreach の上に次のチェックを入れることにしました。これは多少アプリケーション固有であることに注意してください。たとえば、証明書を期限切れにしたい場合は、NotTimeValid などをチェックします。
foreach (var status in chain.ChainStatus) {
switch (status.Status) {
case X509ChainStatusFlags.Cyclic:
case X509ChainStatusFlags.NotSignatureValid:
case X509ChainStatusFlags.PartialChain:
return false;
}
}