Для нормальной работы в домене может понадобиться создать сертификат для контроллера домена.
На необходимость этого может указывать сообщение о ненайденных сертификатах при выполнении команды:
certutil -dcinfo verify
Создание сертификата для контроллера домена описано тут:
http://technet.microsoft.com/en-us/library/cc782583.aspx
Вкратце:
1. Берем скрипт vbs, переносим его на контроллер домена в отдельную папку, переходим в эту папку в командной строке и запускаем его в командной строке с правами администратора домена. Скрипт создаст файлы:
Set oArgs = WScript.Arguments Set oShell = WScript.CreateObject("WScript.Shell") ' ' Parse command line ' if oArgs.Count < 1 then sTemplateName = "DomainController" sType = "E" else if ((oArgs(0) = "-?") or (oARgs.Count < 2)) then Wscript.Echo "Usage: reqdccert.vbs [Templatename] [Type]" Wscript.Echo "[Templatename] is the name of a V2 template" Wscript.Echo "[Type] can be E for Email and A for Authentication certificate" Wscript.Echo "If no option is specified, the DomainController certificate template is used." Wscript.Quit 1 else sTemplateName = oArgs(0) sType = oArgs(1) end if end if Set oFilesystem = CreateObject("Scripting.FileSystemObject") Set objSysInfo = CreateObject("ADSystemInfo") Set objDC = GetObject("LDAP://" & objSysInfo.ComputerName) sGUID = objDC.GUID sDNShostname = objDC.DNShostname sHostname = objDC.cn '############################################################################## ' ' Create the ASN.1 file ' '############################################################################## Dim aASNsubstring(2, 5) Const HEX_DATA_LENGTH = 1 Const ASCIIDATA = 2 Const HEXDATA = 3 Const HEX_BLOB_LENGTH = 4 Const HEX_TYPE = 5 aASNsubstring(0, ASCIIDATA) = sDNShostname aASNsubstring(0, HEX_TYPE) = "82" ' ' Convert DNS name into Hexadecimal ' For i = 1 to Len(aASNsubstring(0, ASCIIDATA)) aASNsubstring(0, HEXDATA) = aASNsubstring(0, HEXDATA) & _ Hex(Asc(Mid(aASNsubstring(0, ASCIIDATA), i, 1^ Next aASNsubstring(0, HEX_DATA_LENGTH) = ComputeASN1 (Len(aASNsubstring(0, HEXDATA)) / 2) ' ' Build the ASN.1 blob for DNS name ' sASN = aASNsubstring(0, HEX_TYPE) & _ aASNsubstring(0, HEX_DATA_LENGTH) & _ aASNsubstring(0, HEXDATA) ' ' Append the GUID as other name ' if (sType = "E") then aASNsubstring(1, HEXDATA) = sGUID aASNsubstring(1, HEX_TYPE) = "A0" aASNsubstring(1, HEX_DATA_LENGTH) = ComputeASN1 (Len(aASNsubstring(1, HEXDATA)) / 2) sASN = sASN & _ "A01F06092B0601040182371901" & _ aASNsubstring(1, HEX_TYPE) & _ "120410" & _ aASNsubstring(1, HEXDATA) end if ' ' Write the ASN.1 blob into a file ' Set oFile = oFilesystem.CreateTextFile(sHostname & ".asn") ' ' Put sequence, total length and ASN1 blob into the file ' oFile.WriteLine "30" & ComputeASN1 (Len(sASN) / 2) & sASN oFile.Close ' ' Use certutil to convert the hexadecimal string into bin ' oShell.Run "certutil -f -decodehex " & sHostname & ".asn " & _ sHostname & ".bin", 0, True ' ' Use certutil to convert the bin into base64 ' oShell.Run "certutil -f -encode " & sHostname & ".bin " & _ sHostname & ".b64", 0, True '############################################################################## ' ' Create the INF file ' '############################################################################## Set iFile = oFilesystem.OpenTextFile(sHostname & ".b64") Set oFile = oFilesystem.CreateTextFile(sHostname & ".inf") oFile.WriteLine "[Version]" oFile.WriteLine "Signature= " & Chr(34) & "$Windows NT$" & Chr(34) oFile.WriteLine "" oFile.WriteLine "[NewRequest]" oFile.WriteLine "KeySpec = 1" oFile.WriteLine "KeyLength = 1024" oFile.WriteLine "Exportable = TRUE" oFile.WriteLine "MachineKeySet = TRUE" oFile.WriteLine "SMIME = FALSE" oFile.WriteLine "PrivateKeyArchive = FALSE" oFile.WriteLine "UserProtected = FALSE" oFile.WriteLine "UseExistingKeySet = FALSE" oFile.WriteLine "ProviderName = " & Chr(34) & _ "Microsoft RSA SChannel Cryptographic Provider" & Chr(34) oFile.WriteLine "ProviderType = 12" oFile.WriteLine "RequestType = PKCS10" oFile.WriteLine "KeyUsage = 0xa0" oFile.WriteLine "" oFile.WriteLine "[EnhancedKeyUsageExtension]" oFile.WriteLine "OID=1.3.6.1.5.5.7.3.1" oFile.WriteLine "OID=1.3.6.1.5.5.7.3.2" oFile.WriteLine ";" oFile.WriteLine "; The subject alternative name (SAN) can be included in the INF-file" oFile.WriteLine "; for a Windows 2003 CA." oFile.WriteLine "; You don't have to specify the SAN when submitting the request." oFile.WriteLine ";" oFile.WriteLine "[Extensions]" iLine = 0 Do While iFile.AtEndOfStream <> True sLine = iFile.Readline If sLine = "-----END CERTIFICATE-----" then Exit Do end if if sLine <> "-----BEGIN CERTIFICATE-----" then if iLine = 0 then oFile.WriteLine "2.5.29.17=" & sLine else oFile.WriteLine "_continue_=" & sLine end if iLine = iLine + 1 end if Loop oFile.WriteLine "Critical=2.5.29.17" oFile.WriteLine ";" oFile.WriteLine "; The template name can be included in the INF-file for any CA." oFile.WriteLine "; You don't have to specify the template when submitting the request." oFile.WriteLine ";" oFile.WriteLine ";[RequestAttributes]" oFile.WriteLine ";CertificateTemplate=" & sTemplateName oFile.Close iFile.Close '############################################################################## ' ' Create the certreq.exe command-line to submit the certificate request ' '############################################################################## Set oFile = oFilesystem.CreateTextFile(sHostname & "-req.bat") oFile.WriteLine "CERTREQ -attrib " _ & Chr(34) & "CertificateTemplate:" & sTemplateName _ & Chr(34) & " " & sHostname & ".req" ' ' The GUID structure needs to be reconstructed. The GUID is read ' as a string like f4aaa8576e6828418712b6ca89fbf5bc however the ' format that is required for the certreq command looks like ' 57a8aaf4-686e-4128-8712-b6ca89fbf5bc. The bytes are reordered ' in the following way: ' ' 11111111112222222222333 ' Position 12345678901234567890123456789012 ' |------|--|--|--|--------------| ' Original GUID: f4aaa8576e6828418712b6ca89fbf5bc ' ' 11 1 1111 1112 222222222333 ' Position 78563412 1290 5634 7890 123456789012 ' |------- |--- |--- |--- |----------| ' Reformatted GUID: 57a8aaf4-686e-4128-8712-b6ca89fbf5bc ' oFile.WriteLine "REM " oFile.WriteLine "REM !!! Only valid for Windows 2003 or later versions !!!" oFile.WriteLine "REM If you do not specify certificate extensions in the *.INF file" oFile.WriteLine "REM they can be specified here like the following example" oFile.WriteLine "REM " oFile.WriteLine "REM CERTREQ -submit -attrib " _ & Chr(34) & "CertificateTemplate:" & sTemplateName _ & "\n" _ & "SAN:guid=" _ & Mid(sGUID, 7, 2) _ & Mid(sGUID, 5, 2) _ & Mid(sGUID, 3, 2) _ & Mid(sGUID, 1, 2) & "-" _ & Mid(sGUID, 11, 2) _ & Mid(sGUID, 9, 2) & "-" _ & Mid(sGUID, 15, 2) _ & Mid(sGUID, 13, 2) & "-" _ & Mid(sGUID, 17, 4) & "-" _ & Mid(sGUID, 21, 12) _ & "&DNS=" & sDNShostname & Chr(34) & " " & sHostname & ".req" oFile.Close '############################################################################## ' ' Create the certificate verification script ' '############################################################################## Set oFile = oFilesystem.CreateTextFile(sHostname & "-vfy.bat") oFile.WriteLine "certutil -viewstore " & Chr(34) & objDC.distinguishedname & _ "?usercertificate" & chr(34) oFile.Close '############################################################################## ' ' Compute the ASN1 string ' '############################################################################## Function ComputeASN1 (iStrLen) If Len(Hex(iStrLen)) Mod 2 = 0 then sLength = Hex(iStrLen) else sLength = "0" & Hex(iStrLen) end if if iStrLen > 127 then ComputeASN1 = Hex (128 + (Len(sLength) / 2)) & sLength else ComputeASN1 = sLength End If End Function
2. Затем создаем запрос к центру сертификации командой:
CERTREQ -new <dcname>.inf <dcname>.req
Запрос будет создан в файле <dcname>.req
3. Затем можно проверить запрос с помощью сгенеренного пакетного файла:
DC-STASUS-TK-vfy.bat
4. И наконец запросить сертификат в центре сертификации AD с помощью также сгенерированного файла:
DC-STASUS-TK-req.bat
Потом нужно выбрать центр сертификации у которого запросим сертификат.
Запрос сертификата появится в центре сертификации.
Сертификат надо выдать, экспортировать и установить.
Если все правильно сделано, то в ответ на команду
certutil -dcinfo verify
будут предоставлены сведения о сертификате контроллера домена.
Discussion