Я пытаюсь реализовать метод, с помощью которого браузер (а именно IE) подключается к веб-сайту и отображает только связанные пользовательские сертификаты в хранилище сертификатов, которые соответствуют тем, которые приняты сервером сайта. Захват WireShark Показывает пример данных, которые я пытаюсь захватить в массиве переменных.
введите описание изображения здесь
Это для Windows PowerShell.
# url encode the uri
$RequestURI = [uri]::EscapeUriString($NonceURI)
$httpsString = "https://"
$BaseURL_DNS = $BaseURL
$BaseURL_DNS = $BaseURL_DNS.Replace($httpsString, "")
$baseURL_escaped = [uri]::EscapeUriString($BaseURL_DNS)
# gets Current User Store
# "My" is store name for personal store on windows
# "CurrentUser" is enum value of System.Security.Cryptography.X509Certificates.StoreLocation
# "LocalMachine" is alternate value
# x509Store can be used with type X509CertificateCollection
$PersonalUserStore = New-Object System.Security.Cryptography.X509Certificates.X509Store("My", "CurrentUser")
# ReadOnly and OpenExistingOnly are enum values of System.Security.Cryptography.X509Certificates.OpenFlags
$PersonalUserStore.Open("ReadOnly,OpenExistingOnly")
# gets only the valid certificates from the personal user store
$CurrentDateTime = Get-Date
$ValidCertificates = $PersonalUserStore.Certificates.Find("FindByTimeValid",$CurrentDateTime,$false)
$certCollection_Type = $ValidCertificates.GetType()
#$baseURL_Request = [System.Net.WebRequest]::Create($baseURL_escaped)
#$webSocket = [System.Net.WebSockets.WebSocketContext.RequstUri]
$client_TLS = New-Object System.Net.Sockets.TcpClient
#$tlsProtocol = New-Object System.Security.Authentication.SslProtocols
$client_TLS.Connect($baseURL_escaped, 443)
#$client_TLS.Write($dataToSubmit, 0, $dataToSubmit.Length)
$sender = New-Object System.Object
$ssl_Connect_Stream = New-Object System.Net.Security.SslStream($client_TLS.GetStream())
#Authenticate to Server As Client (computerName of target HostName, Empty Cert Collection, Enum Value of TLS Protocol, and Check Revocation Value of FALSE)
$ssl_Connect_Stream.AuthenticateAsClient($baseURL_escaped, $null, 'Tls', $false)
$remoteCert = $ssl_Connect_Stream.RemoteCertificate
$test = [System.Net.ServicePointManager]::ServerCertificateValidationCallback
[string[]] $acceptableIssuers
$sslCert_Callback = New-Object System.Net.Security.LocalCertificateSelectionCallback($sender, $baseURL_escaped, $ValidCertificates, $null, $acceptableIssuers)
#$sslServer_Callback = New-Object System.Net.Security.ServerCertificateSelectionCallback($sender, $baseURL_escaped)
#$transContext = $ssl_Connect_Stream.TransportContext().ToSting()
$textConext = $transContext.ToString()
#$ssl_Connect_Stream.Write()
Я ожидал увидеть вложенную переменную, которая содержит значение всех сертификатных центров (CA), исключаемых сайтом.
Я ожидал, что переменная $ remoteCert будет содержать только цепочку сертификатов, но она содержит только один сертификат сайта.
Когда я пытаюсь выполнить строку для присвоения переменной $ sslCert_Callback, я получаю сообщение об ошибке: «Не удается найти перегрузку для LocalCertificateSelectionCallback» и количество аргументов 5 ».«
Используя команду $ PSVersionTable, я подтвердил, что моя версия Powershell - 2.0, поэтому «System.Net.Security.ServerCertificateSelectionCallback» не поддерживается, поэтому я не могу использовать это ('https://docs.microsoft.com/en-us/dotnet/api/system.net.security.servercertificateselectioncallback?view=netstandard-2.1')