Создание CSR программно - PullRequest
       112

Создание CSR программно

1 голос
/ 03 августа 2011

Я пытаюсь создать CSR программно. Я читал об ASN.1, RFC 2986, X.509.
Я также вручную проанализировал несколько файлов CSR в кодировке DER, которые были созданы с использованием OpenSSL.
Все выглядит ясно, за исключением нескольких вещей:

  1. Часть открытого ключа содержит следующие байты 8D 00 30 81 89 02 81 81 до содержимого BIT STRING (и после 03 81). Что это? Я заметил, что все файлы CSR, закодированные с помощью DER, содержат их. Я не нашел ничего о них в RFC.

  2. Часть подписи содержит следующие непонятные байты перед содержимым подписи, но после 03 81. Насколько я понимаю, эта часть содержит информацию о последнем октете в BIT STRING (сколько фактически должно быть взято байтов в последнем байте). Но я не понимаю, как декодировать эти байты. Например, подпись может выглядеть следующим образом:
    03 81 81 00 64 12 ... 24 B1 28
    где 03h - формат BIT STRING, 81h длина строки битов, 64 12 ... 24 B1 28 - сигнатура (но она имеет длину 80h). Я не понимаю часть 81 00.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 04 августа 2011
  1. BIT STRING в SubjectPublicKeyInfo зависит от вашего алгоритма открытого ключа. Содержимое снова кодируется в DER, см. RFC 3370 .

  2. Если ваша подпись выглядит как

    03 81 81 00 64 12 ... 24 B1 28

это должно быть истолковано следующим образом. DER - кодировка TLV (Tag - Length - Value). Таким образом, первый байт (по-своему октет) представляет тег - 03 для BIT STRING, как вы правильно заметили.

Второй байт определяет длину:

В длинной форме октеты длины должны состоять из начального октета и одного или нескольких последующих октетов. Начальный Октет должен быть закодирован следующим образом:

а) бит 8 должен быть один;

b) биты с 7 по 1 должны кодировать число последующих октетов в октетах длины в виде двоичного целого без знака с битом 7 в качестве самого старшего бита;

81 имеет бит 8, установленный в единицу, поэтому остальные биты указывают количество байтов, определяющих общую длину. В вашем случае это просто 1 байт. Таким образом, следующий байт - это ваша длина - 81 соответствует длине подписи 129 байтов. Таким образом, следующие 129 байтов представляют ваше значение, начиная с 00.

1 голос
/ 09 августа 2011

Когда вы говорите «программно», что именно вы имеете в виду? В коде? Если да, то какой язык вы используете? Поставщик BouncyCastle JCE содержит классы для генерации запроса PKCS # 10 при условии, что вы используете Java. Все, что вам нужно сделать, это указать необходимые компоненты (DN, открытый ключ и т. Д.). Я также считаю, что существует реализация .Net, которая может быть более подходящей для сред Microsoft.

...