나는 이것의 작동 구현을하고 있지만 그것이 안전한지 확인하고자합니다. 목표는 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의 구현 : 때문에 내가하지 않도록해야 할 X509Chain 객체의 풍요 로움의
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;
}
X509ChainStatusFlags.NotSignatureValid 등과 같은 항목을 확인해야합니다.
예를 들어, 공격자가 내 술집에서 서명하도록 요청할 수 있습니까? lic 키, 잘못된 서명을 보내면 .NET에서 모든 플래그를 확인한다고 가정하기 때문에이 공격이 작동합니다.
감사합니다.
업데이트 : 좋아, 지금까지 나는 원래 foreach 위에 다음 검사를하기로 결정했습니다. 이것은 다소 응용 프로그램에 따라 다릅니다. 예를 들어 내가 당신 같은 인증서가 신뢰할 수없는 만료 된 경우, 또는 같은 추가 오류에 대해 sslPolicyErrors 매개 변수를 확인하실 수 있습니다
foreach (var status in chain.ChainStatus) {
switch (status.Status) {
case X509ChainStatusFlags.Cyclic:
case X509ChainStatusFlags.NotSignatureValid:
case X509ChainStatusFlags.PartialChain:
return false;
}
}
** public ** 키는 일반 대중을 위해 사용됩니다 ... 당신 (개인 키를 가진 사람)만이 해독 할 수 있습니다 암호화 된 메시지. 데이터가 실제로 제 3 자의 데이터인지 확인하려면 공개 키를 가져옵니다 (키를 사용하여 데이터를 암호화합니다). –