Очень хорошо, у вас есть глубокое понимание механизма работы SSL-сертификата. См. Ссылку ниже.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/message-security-with-a-certificate-client
Клиентская и серверная стороны автоматически согласовывают ключ сертификатов publi c во время связи для шифрования сообщения с другими ключ publi c и дешифрование сообщения soap с помощью закрытого ключа. Таким образом, нам не нужно вручную программировать эту процедуру. Достаточно установить сертификат друг друга в локальном хранилище сертификатов.
Если мы аутентифицируем клиента в режиме безопасности сообщений, нам необходимо использовать раздел service credential
для настройки сертификата службы. Как и то, что вы сделали.
<serviceCredentials>
<serviceCertificate findValue="0000xx000" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySerialNumber"/>
<clientCertificate>
<authentication certificateValidationMode="PeerOrChainTrust"/>
</clientCertificate>
</serviceCredentials>
На стороне клиента, как правило, нам нужно указать два сертификата, один - сертификат службы, другой - сертификат клиента.
//message security, we need to specify both the default certificate and the client certificate.
ServiceReference1.ServiceClient client = new ServiceReference1.ServiceClient(); client.ClientCredentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.LocalMachine, StoreName.Root, X509FindType.FindByThumbprint, "cbc81f77ed01a9784a12483030ccd497f01be71c");
client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "9b8db0dfe615458ace0ae9e89fcb983c5d16f633");
try
{
var result = client.SayHello();
Console.WriteLine(result);
}
catch (Exception)
{
throw;
}
Что касается доверительных отношений между сертификатами, на стороне клиента нам нужно установить сертификат сервера в LocalCA
, а на стороне сервера нам нужно установить клиент сертификат в определенном месте в зависимости от режима аутентификации. По умолчанию его можно установить в LocalCA
.
//this is default authentication mode.
sh.Credentials.ClientCertificate.Authentication.CertificateValidationMode= System.ServiceModel.Security.X509CertificateValidationMode.ChainTrust;
Не стесняйтесь, дайте мне знать, если я могу чем-то помочь.