23 апреля 2012

Lync - нафиг нам всё это в нашем зоопарке?

Есть такой замечательный анекдот:

Верблюжонок(В) спрашивает у мамы (М): 
В: - Мама, а зачем нам два горба?
М: - Это для того чтобы можно было обходиться без воды в пустыне много дней
В: - А зачем у нас такая густая шерсть ?
М: - Это для того чтобы в пустыне ночью не было холодно, а днем жарко
В: - А зачем у нас такие большие копыта?
М: - Для того чтобы было легко ходить по песчаным барханам в пустыне
В: - Мама. Так нафига нам эти навороты, если мы в зоопарке живем?


На мой взгляд, он очень хорошо отражает причину провалов внедрения Lync с точки зрения пользователя. Вот здесь хорошо описаны некоторые причины, почему финансирование внедрения не выгодно с точки зрения руководства.

10 апреля 2012

ICEnroll4::addExtensionToRequest or problem widely known to fiew people SOLVED

Sometimes it's needed to create a Certificate Signing Request (SAR), using Internet Explorer and ActiveX technology. There is a very good manual how to create a certificate request with CertEnroll for Windows Vista and newer (Windows 7, 2008, 8). There's also a manual in MSDN for CEnroll (Windows XP, 2003), and it works fine until you try to create a request with specific X.509 extensions (for example, Subject Alternative Name - SAN). Many programmers complain that addExtensionToRequest method doesn't work. If you look for addExtensionToRequest in Google, you'll see that most of links lead to discussions of this problem and I've found no one with working solution. Some of them even claim that there is no solution for script languages at all. But solution exists!

Typical problem

Typically problematic code looks like this:

var enroll = CreateActiveXObject("CEnroll.CEnroll");
enroll.addExtensionToRequest(0, "2.5.29.17", strExtensionBase64);
strPKCS10 = enroll.CreatePKCS10(strDN, strEKU);

* This source code was highlighted with Source Code Highlighter.


This block of code runs without any errors, and generates a valid PKCS#10 request, but the problem is that generated request doesn't contain desired extension (in this sample 2.5.29.17 that used to assign SAN).

ICEnroll::addExtensionToRequest или решение проблемы, широко известной в узких кругах

Предисловие

По долгу службы мне понадобилось генерировать запросы на сертификат (CSR - Certificate Signing Request) в браузере. Под Windows, в Internet Explorer. А чо, дело-то нехитрое: создаёшь COM-компонент (CertEnroll под Windows Vista/7/8, CEnroll под XP/2000/2003), скармливаешь ему данные, отдаёшь команду сгенерировать запрос, и voila, PKCS#10 у тебя в кармане переменной. Есть очень хорошее руководство по тому, как сделать запрос на сертификат с помощью CertEnroll - с ним, как правило, не возникает никаких проблем. Для CEnroll тоже есть руководство, и у многих в соответствии с ним всё работает, и вопросов не возникает, особенно, если достаточно запрашивать сертификаты, не содержащие расширений (X.509 extensions) специфических для какого-либо применения сертификата, идентифицирующий владельца только по DN. Чаще всего, так оно и бывает. Однако, когда возникает необходимость добавить в запрос альтернативные имена (SAR - Subject Alternative Name), многие сталкиваются с проблемой: добавляемое имя в сгенерированный запрос не попадает. Разумеется, я тоже столкнулся. При поиске в Google по названию метода addExtensionToRequest большинство ссылок окажутся жалобами на различных языках на то, что он не работает. К сожалению, среди всего этого множества обсуждений проблемы мне так и не удалось найти действительного решения. Наоборот, есть прямые указания на то, что для скриптовых языков решения нет. Но оно существует!

Проблема

Итак, типичная формулировка проблемы: есть код, который генерирует запрос на сертификат
var enroll = CreateActiveXObject("CEnroll.CEnroll");
enroll.addExtensionToRequest(0, "2.5.29.17", strExtensionBase64);
strPKCS10 = enroll.CreatePKCS10(strDN, strEKU);

* This source code was highlighted with Source Code Highlighter.
Примечание:
В strExtensionBase64 записано значение расширения, закодированное в ASN.1 / DER (бинарный формат), которое, в свою очередь, закодировано в Base64.

Данный код прекрасно выполняется, запрос генерируется, однако, вопреки ожиданиям, в сгенерированном запросе отсутствует расширение (в данном случае 2.5.29.17, добавляющее альтернативное имя).