Console Connect используя IP адреса

В продолжении поста о Console Connect настроим его для работы по IP.

В чем же отличие между подключением по IP и по FQDN?

В случае подключение к Hyper-V хосту по IP адресу IP адрес запроса и IP адрес в сертификате не совпадут и Вам будет возращена ощибка An authentication error occurred (0×607). В то время как при подключение по FQDN значения совпадут.

Для начала Вам необходимо будет воспроизвести настройки как в предыдущем посте, но вместо указания типа подключения FQDN необходимо указать IP.

Set-SCVMMServer -VMConnectGatewayCertificatePassword $mypwd -VMConnectGatewayCertificatePath $cert -VMConnectHostIdentificationMode IP -VMConnectHyperVCertificatePassword $mypwd -VMConnectHyperVCertificatePath $cert -VMConnectTimeToLiveInMinutes 2 -VMMServer $VMMServer

Вам необходимо будет сгенерировать сертификаты для хостов Hyper-V, но поскольку makecert не может создать сертификат с двумя значениями в поле Subject мы используем powershell. Эту процедуру необходимо выполнить на каждом хосте Hyper-V, кроме того, в случае смены IP адреса Hyper-V хоста, Вам необходимо будет сгенерировать сертификат снова.

$name = new-object -com "X509Enrollment.CX500DistinguishedName.1"
$name.Encode("CN=FQDN, CN=IP адрес", 0)
$key = new-object -com "X509Enrollment.CX509PrivateKey.1"
$key.ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
$key.KeySpec = 1
$key.Length = 2048
$key.SecurityDescriptor = "D:PAI(A;;0xd01f01ff;;;SY)(A;;0xd01f01ff;;;BA)(A;;0×80120089;;;NS)"
$key.MachineContext = 1
$key.Create()
$serverauthoid = new-object -com "X509Enrollment.CObjectId.1"
$serverauthoid.InitializeFromValue("1.3.6.1.5.5.7.3.2")
$ekuoids = new-object -com "X509Enrollment.CObjectIds.1"
$ekuoids.add($serverauthoid)
$ekuext = new-object -com "X509Enrollment.CX509ExtensionEnhancedKeyUsage.1"
$ekuext.InitializeEncode($ekuoids)
$kuext = new-object -com "X509Enrollment.CX509ExtensionKeyUsage.1"
$kuext.InitializeEncode(0×30)
$cert = new-object -com "X509Enrollment.CX509CertificateRequestCertificate.1"
$cert.InitializeFromPrivateKey(2, $key, "")
$cert.Subject = $name
$cert.Issuer = $cert.Subject
$cert.NotBefore = (Get-Date).ToUniversalTime()
$cert.NotAfter = $cert.NotBefore.AddDays(900)
$cert.X509Extensions.Add($ekuext)
$cert.X509Extensions.Add($kuext)
$cert.Encode()
$enrollment = new-object -com "X509Enrollment.CX509Enrollment.1"
$enrollment.InitializeFromRequest($cert)
$certdata = $enrollment.CreateRequest(0)
$enrollment.InstallResponse(2, $certdata, 0, "")

Получаем отпечатки сертификатов

$thumbprints = @(dir cert:localmachineMy Where-Object { $_.subject -eq “CN=FQDN, CN=IP адрес”} ).thumbprint

$thumbprints

Скопируйте отпечаток нужного сертификата и используйте его в следующем скрипте

$thumbprint = "отпечаток"
$certs = dir cert: -recurse | ? { $_.Thumbprint -eq $thumbprint }
$cert = @($certs)[0]
$location = $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
$folderlocation = gc env:ALLUSERSPROFILE
$folderlocation = $folderlocation + "MicrosoftCryptoRSAMachineKeys"
$filelocation = $folderlocation + $location
$filelocation
icacls $filelocation /grant "*S-1-5-83-0:(R)"
$cert.thumbprint
reg add "HKLMSoftwareMicrosoftWindows NTCurrentVersionVirtualization" /v "AuthCertificateHash" /f /t REG_BINARY /d $thumbprint
reg add "HKLMSoftwareMicrosoftWindows NTCurrentVersionVirtualization" /v "DisableSelfSignedCertificateGeneration" /f /t REG_QWORD /d 1

Данный скрипт сконфигурирует Hyper-V. Он “импортирует” созданный сертификат в Hyper-V и запретит Hyper-V генерировать новые сертификаты. После этого службу Hyper-V нужно перезапустить, а виртуальные машины смигрировать на другой хост.

К сожалению, в данном случае у пользователей будет “выскакивать” еще одно окно вопрощающее доверяет ли пользователь хосту Hyper-V. Чтобы обойти это необходимо отредактировать RDP файл и добавить значение “authentication level:i:0”. Ну, естественно, делать это руками бред, тем более если Вы планируете предоставлять виртуальные машины как услуги, это не приемлимо.

Для того чтобы делать это автоматически необходимо с помощью URL Rewrite (устанавливается с помощью Web Platform Installer) на хосте где насположен SPF создать мнимое правило URL Rewrite (Outbound) заполнить название и написать что-либо в поле Pattern Field, после чего отредактировать web.config файл  (c:inetpubspf по умолчанию) следующим образом

outboundRules>
 <clear />
 <rule name="Remote Console on IP Address" preCondition="VMConsole RDP File" enabled="true">
 <match filterByTags="None" pattern="negotiate security layer:i:1" />
 <conditions logicalGrouping="MatchAll" trackAllCaptures="true" />
 <action type="Rewrite" value="negotiate security layer:i:1 
authentication level:i:0" />
 </rule>
 <preConditions>
 <preCondition name="VMConsole RDP File"
 <add input="{REQUEST_URI}" pattern="^.*(/VMConnection)$" />
 <add input="{RESPONSE_CONTENT_TYPE}" pattern="^application/x-rdp$" />
 </preCondition>
 </preConditions>
 </outboundRules>

Напоминаю, что для передачи “Ctrl+Alt+Delete” необходимо использовать комбинацию ”Ctrl+Alt+End”. 😉

Written on June 24, 2014