Надеюсь, что кто-то сможет пролить свет на это. В Powershell следующий код генерирует вывод сертификата веб-сайта:
$req = [Net.HttpWebRequest]::Create('https://www.google.com')
$req.GetResponse()
$req.Servicepoint.certificate
Handle Issuer Subject
------ ------ -------
2266454817712 CN=GTS CA 1O1, O=Google Trust Services, C=US CN=www.google.com...
В Powershell Core он возвращает ноль / пробел в $req.Servicepoint.certificate
.
BindIPEndPointDelegate :
ConnectionLeaseTimeout : -1
Address : https://www.google.com/
MaxIdleTime : 100000
UseNagleAlgorithm : True
ReceiveBufferSize : -1
Expect100Continue : True
IdleSince : 20/09/2019 9:42:48 AM
ProtocolVersion : 1.1
ConnectionName : https
ConnectionLimit : 2
CurrentConnections : 0
Certificate :
ClientCertificate :
SupportsPipelining : True
Похоже на .NET Core Выпуск 36979 это хорошо объясняет.
Коротко, System.Net.HttpWebRequest является устаревшим и лишь частично повторно реализован в .NET Core. В частности, классы ServicePoint и ServicePointManager существуют, но на самом деле не работают.
Они рекомендуют перейти на System.Net.Http.HttpClient вместо этого один пользователь предложил следующий пример кода, чтобы продемонстрировать, как с его помощью получить сертификат.
using System;
using System.Net.Http;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
namespace NetCoreConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = CustomCallback;
var client = new HttpClient(handler);
HttpResponseMessage response = client.GetAsync("https://www.google.com.mx/").GetAwaiter().GetResult();
Console.WriteLine(response.StatusCode);
Console.WriteLine((int)response.StatusCode);
}
private static bool CustomCallback(HttpRequestMessage arg1, X509Certificate2 arg2, X509Chain arg3, SslPolicyErrors arg4)
{
Console.WriteLine(arg2.GetEffectiveDateString());
Console.WriteLine(arg2.GetExpirationDateString());
Console.WriteLine(arg2.Issuer);
Console.WriteLine(arg2.Subject);
return arg4 == SslPolicyErrors.None;
}
}
}
Если кому-то интересно, вот как я переделал это для PS Core:
$Req = [System.Net.Sockets.TcpClient]::new('www.google.com', '443')
$Stream = [System.Net.Security.SslStream]::new($Req.GetStream())
$Stream.AuthenticateAsClient('www.google.com')
$Stream.RemoteCertificate
$Stream.RemoteCertificate.GetExpirationDateString()
(и т.д)