Мне нужно убедиться, что серверу доверяют в хранилище корневых сертификатов компьютера, но нужно учесть сценарий, в котором может использоваться мост CA.
Согласно MSDN , этот методиспользования TCPClient, тогда открытие сокета представляется наиболее предпочтительным способом проверки сертификата потока SSL.
Когда моя функция достигает функции ValidateServerCertificate
, я намерен проверить объект цепочки, чтобы определить,Корневой сертификат хранится в хранилище доверенных корневых сертификатов на компьютере.Достаточно просто.
Сложность (и недостаток знаний) возникает, когда мне нужно следовать «мостовому сертификату», который используется для перекрестной подписи нескольких деревьев PKI.Я не уверен, появится ли сертификат моста в локальном хранилище, в цепочке или в каком-то другом месте (если вообще).
Более того, я не уверен, как следовать логике ветвления, которая может возникнуть, посколькумост может происходить на любом уровне дерева.
Предложения, указания или блок-схемы приветствуются
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace sockittome
{
class Program
{
static void Main(string[] args)
{
string machineName = "pesecpolicy.bankofamerica.com";
// Create a TCP/IP client socket.
// machineName is the host running the server application.
TcpClient client = new TcpClient(machineName, 443);
// Create an SSL stream that will close the client's stream.
SslStream sslStream = new SslStream(
client.GetStream(),
false,
new RemoteCertificateValidationCallback(ValidateServerCertificate),
null
);
// The server name must match the name on the server certificate.
try
{
sslStream.AuthenticateAsClient(machineName);
}
catch (AuthenticationException e)
{
Console.WriteLine("Exception: {0}", e.Message);
if (e.InnerException != null)
{
Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
}
Console.WriteLine("Authentication failed - closing the connection.");
client.Close();
return;
}
}
// The following method is invoked by the RemoteCertificateValidationDelegate.
public static bool ValidateServerCertificate(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
// How do I verify the root certificate is installed?
// What is the simple way (check certificate hash in the computer store)?
// What is the complete way (look for bridge certificates ?????)
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
// Do not allow this client to communicate with unauthenticated servers.
return false;
}
}
}