Для нормальной работы в домене может понадобиться создать сертификат для контроллера домена.
На необходимость этого может указывать сообщение о ненайденных сертификатах при выполнении команды:
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