Похоже, проблема в том, что система не доверяет новому сертификату.
Чтобы доверять, корень цепочки сертификатов должен быть представлен в одном из следующихмагазины:
- LocalMachine \ Root
- LocalMachine \ ThirdPartyRoot
- CurrentUser \ Root
(есть и другиезадействованные магазины, для корневых прав, управляемых доменом)
Итак, после того, как вы выполните
certificate = GenerateCertificate(serverName);
store.Add(certificate);
Вы также захотите сделать
using (X509Store rootStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine))
using (X509Certificate2 withoutPrivateKey = new X509Certificate2(certificate.RawData))
{
rootStore.Open(OpenFlags.ReadWrite);
rootStore.Add(withoutPrivateKey);
}
Теперь системасможет проверить (одноузловую) цепочку до доверенного сертификата, а ограничение validOnly: true
для Find будет считать сертификат действительным (что для этого метода означает доверенную цепочку и срок ее действия не истек).