| ||||
| ||||
Поддерживает ли Window’ая служба сертификации расширение сертификата "альтернативное имя субьекта" | ||||
Ответы: | ||||
| ||||
Сертификат с данным расширением будет издан MS CA, если запрос на сертиифкат, поступающий в службу содержит "альтернативное имя субьекта". | ||||
| ||||
День добрый, Все дело в том, что запрос содержит данное поле и виндовый CA выдает сертификат по этому запросу, однако, в самом сертификате данное поле отсутствует. Причем, если обрабатывать этот запрос с помощью УЦ, то сертификат также выдается без данного расширения, при этом в базе ЦР сохраняется запрос, содержащий "альтернотивное имя субекта". Может быть все-таки дела в виндовом СА? | ||||
| ||||
Если у Вас стоит ПАК "КриптоПро УЦ", то на ЦС в модуле политики КриптоПро для службы MS CA, на вкладке "Расширения Х.509" нужно добавить и разрешить расширение 2.5.29.17 "Дополнительное имя субъекта" и тогда сертификат будет содержать данное раширение. Не забудьте перезапустить службу СА после изменения настроек модуля политики. | ||||
| ||||
В том то и дело, что это расширение включено. | ||||
| ||||
значит все дело в запросе. Т.к. SubjectAltName является составным типом данных, то проверьте как В ыего закодировали. Служба СА, со стандартным модулем политики ДОЛЖНА изготавливать сертификат с таким расширением по "правильному" запросу, а ЦС от ПАК "КриптоПро УЦ" МОЖЕТ, если настроен модуль политики КриптоПро. Проверьте ваш запрос на стандартной службе СА... | ||||
| ||||
Вот дамп запроса: File: A:\test.der Time: 11:34:00, 04/25/2005 --------------------------------------------------------------------- 0000 30 154: SEQUENCE { 0004 30 FF: SEQUENCE { 0007 02 1: INTEGER 0 000A 30 45: SEQUENCE { 000C 31 2C: SET { 000E 30 2A: SEQUENCE { 0010 06 9: OBJECT IDENTIFIER emailAddress (1 2 840 113549 1 9 1) : (PKCS #9. Deprecated, use an altName extension instead) 001B 16 1D: IA5String ’vasija_durak@wewewebebebe.com’ : } : } 003A 31 15: SET { 003C 30 13: SEQUENCE { 003E 06 3: OBJECT IDENTIFIER commonName (2 5 4 3) : (X.520 id-at (2 5 4)) 0043 1E C: BMPString ’’ : } : } : } 0051 30 5C: SEQUENCE { 0053 30 D: SEQUENCE { 0055 06 9: OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1) : (PKCS #1) 0060 05 0: NULL : } 0062 03 4B: BIT STRING 0 unused bits, encapsulates { 0065 30 48: SEQUENCE { 0067 02 41: INTEGER : 00 B9 38 05 E4 45 74 6E ..8..Etn : D3 32 8F 67 29 78 71 38 .2.g)xq8 : 0F 30 EB 1E FA 08 7B 19 .0....{. : 05 3F 4C AE F6 A1 6D AC .?L...m. : 74 E0 BA F9 B1 29 5D C0 t....)]. : 1B 3E 3A 62 EE 0E 6B 60 .>:b..k` : 84 6B 97 BA 71 AB 36 FE .k..q.6. : 33 53 25 65 B3 32 B9 CD 3S%e.2.. : B5 . 00AA 02 3: INTEGER 65537 : } : } : } 00AF A0 55: [0] { 00B1 30 25: SEQUENCE { 00B3 06 A: OBJECT IDENTIFIER : certReqExtensions (1 3 6 1 4 1 311 2 1 14) : (Microsoft) 00BF 31 17: SET { 00C1 30 15: SEQUENCE { 00C3 30 13: SEQUENCE { 00C5 06 3: OBJECT IDENTIFIER extKeyUsage (2 5 29 37) : (X.509 id-ce (2 5 29)) 00CA 04 C: OCTET STRING, encapsulates { 00CC 30 A: SEQUENCE { 00CE 06 8: OBJECT IDENTIFIER : emailProtection (1 3 6 1 5 5 7 3 4) : (PKIX key purpose) : } : } : } : } : } : } 00D8 30 2C: SEQUENCE { 00DA 06 3: OBJECT IDENTIFIER subjectAltName (2 5 29 17) : (X.509 id-ce (2 5 29)) 00DF 31 25: SET { 00E1 30 23: SEQUENCE { 00E3 81 6: [1] ’Beavis’ 00EB 82 4: [2] ’Comp’ 00F1 86 13: [6] ’http://www.porno.ru’ : } : } : } : } : } 0106 30 D: SEQUENCE { 0108 06 9: OBJECT IDENTIFIER : sha1withRSAEncryption (1 2 840 113549 1 1 5) : (PKCS #1) 0113 05 0: NULL : } 0115 03 41: BIT STRING 0 unused bits : 3D AA 92 67 54 66 0F 6E =..gTf.n : EB B5 CE 4A 28 F0 72 02 ...J(.r. : 7A 59 CC FB 01 C6 A9 32 zY.....2 : 7F 5C 17 B0 90 13 0C 6C .\.....l : 41 BA 4B AE AF D8 79 E8 A.K...y. : F9 44 66 9B CE 1C 5E 47 .Df...^G : 5B DA 8B AE B6 23 C9 DE [....#.. : 32 4E 5E 95 C3 34 1B 82 : } | ||||
| ||||
И что? | ||||
| ||||
:) Данный запрос мы подсовываем как чисто виндовому, так и УЦ КриптоПро вроде с полем "альтернативное имя субьекта" все в порядке, однако в сертификате это поле не отображается. | ||||
| ||||
Повторяю, что Ваш запрос не корректный. Написать программу формирования запроса за Вас не представляется возможным. Попробуйте в качестве атрибута запроса 1.2.840.113549.1.9.14 (Расширения сертификатов) а в раширении "Дополнительное имя субъекта" типа вот так: 2.5.29.17: Флаги = 0, Длина = __ Дополнительное имя субъекта Другое имя: 1.2.643.1.12345.1=13 21 | ||||
| ||||
вопрос сюда же (чтоб по плотнее была инфа) на веб странице создается запрос на издание сертификата пытаюсь добавить таким образом почтовый адрес qwe = IControl.stringToBinary(2, "1@mail.ru") sPKCS10 = IControl.addExtensionToRequest(1,"2.5.29.17", qwe) sPKCS10 = IControl.CreatePKCS10(sDistinguishedName, sCertUsage) но тут возникает беда поля после выпуска сертификата не вижу (равно как и certutil ничего не показывает) в чем моя ошибка? | ||||
| ||||
народ местные гуру чем dump делаете запросов - это раз есть какой-н нормальный форум по PKI на котором ребята не щитают позорным ответить новичку в этой области??? я устал спрашивать тут про альтернативное имя такое ощущение либо все треплются про то что они добавили в и выпустили сертификат с альтернативным именем ибо ни одного сертификата из тысяч я не видел с этим полем использовал обе функции addextensions addextentiontorequest всем спасибо (разработчик фирмы ХХХ-PKI) | ||||
| ||||
Дамп делается certutil либо dumpasn1 (можно скачать с нашего сайта). Ошибка в том, что расширение SubjectAltName кодируется не простым байтовым копированием, а намного более сложнее. Для примера посмотрите объект CCertEncodeAltName в MSDN. | ||||
| ||||
Набросал тут функцию дабы проверить что это за зверь "alternativeName". Выкладываю тут так как может это кому и пригодится. Кодируется "issuerAltName". Кому нужно кодировать "subjectAltName" - поставьте идентификатор алгоритма "2.5.29.17". //---------------------------------------------- void test_altName() { DWORD size = 0; CERT_ALT_NAME_ENTRY alt_entry[1]; ZeroMemory(alt_entry, sizeof(CERT_ALT_NAME_ENTRY)); alt_entry[0].dwAltNameChoice = CERT_ALT_NAME_RFC822_NAME; if(EncodeUTF8("2@2.ru", &alt_entry[0].pwszRfc822Name, &size)) return; CERT_ALT_NAME_INFO alt_info; ZeroMemory(&alt_info, sizeof(CERT_ALT_NAME_INFO)); alt_info.cAltEntry = 1; alt_info.rgAltEntry = alt_entry; BYTE* enc_alt_info; if(Encode(X509_ASN_ENCODING, X509_ALTERNATE_NAME, &alt_info, &enc_alt_info, &size)) return; //--- certificate extension CERT_EXTENSION cert_ext[1]; ZeroMemory(cert_ext, sizeof(CERT_EXTENSION)); cert_ext[0].fCritical = FALSE; cert_ext[0].pszObjId = "2.5.29.18"; cert_ext[0].Value.cbData = size; cert_ext[0].Value.pbData = enc_alt_info; CERT_EXTENSIONS cert_exts; ZeroMemory(&cert_exts, sizeof(CERT_EXTENSIONS)); cert_exts.cExtension = 1; cert_exts.rgExtension = cert_ext; BYTE* enc_cert_exts; if(Encode(X509_ASN_ENCODING, X509_EXTENSIONS, &cert_exts, &enc_cert_exts, &size)) return; store_to_file("enc_alt_name.txt", enc_cert_exts, size); } //---------------------------------------------- По функциям, используемым в коде: 1) Encode(...) - корректный вызов CryptEncodeObject; 2) EncodeUTF8 - кодирование в UTF8 посредством MultiByteToWideChar | ||||
| ||||
И вот как это выглядит внутри сертификата (в данном случае сертификат самоподписаный): 415 64: [3] { 417 62: SEQUENCE { 419 15: SEQUENCE { 421 3: OBJECT IDENTIFIER basicConstraints (2 5 29 19) 426 1: BOOLEAN TRUE 429 5: OCTET STRING, encapsulates { 431 3: SEQUENCE { 433 1: BOOLEAN TRUE : } : } : } 436 43: SEQUENCE { 438 3: OBJECT IDENTIFIER issuerAltName (2 5 29 18) 443 36: OCTET STRING, encapsulates { 445 34: SEQUENCE { 447 6: [1] '2@2.ru' 455 24: [2] 'http://www.microsoft.com' : } : } : } : } : } : } | ||||
| ||||
>> Кому нужно кодировать "subjectAltName" - поставьте идентификатор алгоритма "2.5.29.17" а чего не идентификатор алгоритма "2.5.29.7" ?? в msdn написано что 17 - subject_alt_name2 что это за две вариации альтернативных имен кто-н знает?? | ||||
| ||||
OID от лукавого :) 2.5.29.17 - это в соответствие с RFC 3280. Может в MS опечатались просто. Или, как всегда, пытались придумывать "новый стандарт". | ||||
| ||||
Ан нет - это просто устаревший OID: http://www.oid-info.com/cgi-bin/display?oid=2+5+29+7&submit=Display&action=display | ||||
| ||||
прикольно про OID репозитарий - спасибо дополнительное )) | ||||
| ||||
а EncodeUTF8 в на где валяется?? я в Delphi пытаюсь накорябать (ибо на скриптах походу дальше никуда не двинуть) | ||||
| ||||
>Kirill Sobolev вы писали: Ошибка в том, что расширение SubjectAltName кодируется не простым байтовым копированием, а намного более сложнее. Для примера посмотрите объект CCertEncodeAltName в MSDN. ----------------------------------- The addExtensionToRequest method adds an extension to the request. This method was first defined in the ICEnroll4 interface. Sub addExtensionToRequest( _ ByVal Flags As Long, _ ByVal strName As String, _ ByVal strValue As String _ ) Parameters Flags [in] Specifies whether the extension is critical. If True, the extension being added is critical. If False, it is not critical. Note that TRUE is defined (in a Microsoft header file) for C/C++ programmers as one, while Visual Basic defines the True keyword as negative one. As a result, Visual Basic developers must use one (instead of True) to set this parameter to TRUE. However, to set this parameter to FALSE, Visual Basic developers can use zero or False. strName [in] Object Identifier (OID) that represents the extension name. strValue [in] Base64-encoded or binary extension value. ------------------------------------------ но разве IControl.stringToBinary(2, "1@mail.ru") не должно по идее работать?? | ||||
| ||||
y1zhf10c8r <a href = http://www.198234.com/910611.html > rjcrortbfbdl7j </a> [URL=http://www.947314.com/699214.html] dixffzk8j9 [/URL] 16mibji8 | ||||
| ||||
y1zhf10c8r [URL=http://www.947314.com/699214.html] dixffzk8j9 [/URL] 16mibji8 | ||||
| ||||
y1zhf10c8r http://www.1080683.com/160259.html 16mibji8 | ||||
| ||||
y1zhf10c8r qt7eowso4 16mibji8 | ||||
| ||||
мдааа замечательный ответ типааа "иди ннаа" :'(((( | ||||
| ||||
это во всех отверах всех тем появилось, вирусяка видимо :-) | ||||
| ||||
нет, stringToBinary лишь позволяет переводить данные из одной кодировки в другую (base64 c заголовком, без, бинарные, hex). А Вам нужно положить туда ASN.1 структуру. | ||||
| ||||
ага с этим ясно а вот Юрий пишет >По функциям, используемым в коде: >1) Encode(...) - корректный вызов CryptEncodeObject; а можно посмотреть синтаксис функции?? и ее код бы посмотреть в msdn молчек на эту тему | ||||
| ||||
не может быть http://msdn2.microsoft.com/en-us/library/aa379921.aspx | ||||
| ||||
читать умею )) ----CryptEncodeObject()---- <> Encode() | ||||
| ||||
полагаю он переназначение сделал но какой смысл - если все в том же виде параметры передаваемые остались в чем секрет-то? | ||||
| ||||
Насчет CryptEncodeObject: нужно просто один раз написать код, использующий эту функцию, и сразу станет понятно, аачем я сделал такое "переназначение" :) | ||||
| ||||
или воспользоваться функцией CryptEncodeObjectEx | ||||