web-dev-qa-db-ja.com

PowershellとPowerShellCoreのNet.HttpWebRequestの違い

誰かがこれに光を当てることができることを願っています。 Powershellでは、次のコードがWebサイト証明書の出力を生成します。

$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にnull /空白を返します。

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
2
Geoff Vass

.NET Core issue 36979 がこれをかなりよく説明しているようです。

つまり、 System.Net.HttpWebRequest は廃止され、.NETCoreで部分的にのみ再実装されました。特に、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;
        }
    }
}
1
Ryan Bolger

誰かが興味を持っているなら、これが私がPSCoreのためにそれを作り直した方法です:

$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()

(等)

SslStream。RemoteCertificateProperty

0
Geoff Vass