создайте csr с ключом кривой secp384r1elliptic и хэш-сигнатурой sha384

Я использую команды openssl для создания CSR с эллиптической кривой secp384r1 и хэшем, подписанным алгоритмом sha384:

openssl ecparam-out ec_client_key.pem-name secp384r1-genkey

openssl req-новый ключ ec_client_key.pem-out ec_clientReq.Пем!--3-->

затем я показываю CSR в удобочитаемом формате с помощью этой команды:

openssl req-в ec_clientReq.pem-noout-text

в подпись часть КСО, я получаю это:

Signature Algorithm: ecdsa-with-SHA1
    30:64:02:30:06:a1:f2:5e:1b:34:18:b9:f3:7c:e9:52:c8:78:
    99:90:63:d2:1e:d2:f5:7a:25:f3:d6:4d:6d:90:d0:bf:25:45:
    15:ad:aa:17:34:ad:1a:b9:1e:67:2b:cf:d7:a6:9b:e5:02:30:
    31:fe:76:37:4b:11:3a:e7:2d:63:52:bb:18:2f:8e:43:a7:bb:
    65:74:38:a4:92:38:9d:eb:ec:22:8f:77:f3:e4:5f:47:2d:f8:
    2a:9b:e1:2c:ba:a7:b0:e6:c2:54:8d:0e

что мне делать, чтобы получить алгоритм подписи "ecdsa-with-SHA384" вместо "ecdsa-with-SHA1"? Я что-то упускаю в этом процессе? Я попытался использовать -sha384 во второй команде

openssl req-новый ключ ec_client_key.pem-out ec_clientReq.Пэм-значения sha384

но я получил тот же результат относительно подписи Алгоритм

Signature Algorithm: ecdsa-with-SHA1
    30:65:02:30:4e:b4:b6:5f:3a:fc:b7:28:e5:4b:f0:3d:9a:ea:
    4a:ba:ce:a4:f1:a6:e8:cd:15:19:23:a6:81:3f:24:01:d7:81:
    3c:9d:9a:4c:cd:4b:4a:12:6d:69:48:ec:7e:73:7d:73:02:31:
    00:d7:a5:63:9b:21:b2:95:ce:7f:13:3f:c5:1a:ac:99:01:ff:
    ba:9c:59:93:d5:ee:97:03:b5:9e:c1:7d:03:f8:72:90:65:b5:
    08:7c:79:ae:ea:4f:6e:b0:2b:55:1a:11:a5

другой вопрос касается формата подписи. В приведенных выше примерах длина одного составляет 102 байта, а второго-103 байта. Кажется, что первые байты являются заголовком, включая тип, длину и могут быть некоторые другие вещи, такие как заполнение. Но я не могу найти точного определения. Может кто-нибудь пролить свет на это? Спасибо

3 ответов


Я попробовал снова с последней версией openssl 1.0.1 e на этот раз (вместо 0.9.8 n).

openssl ecparam-out ec_client_key.pem-name secp384r1-gen

openssl req-config openssl.cnf-new-ключ ec_client_key.pem-out ec_clientReq.Пэм-значения sha384

openssl req-в ec_clientReq.pem-noout-text

теперь я получаю ожидаемый результат:

Подпись : ecdsa-with-SHA384

похоже, что версия 0.9.8 n не поддерживает sha384.

эта выдержка из файла изменений, похоже, подтверждает это:

изменения между 1.0.0 h и 1.0.1 [14 Mar 2012] : ... * ) Добавить HMAC ECC шифровальных наборов от RFC5289. Включают в себя значения sha384 поддержка ПРФ. Как требуется RFC5289, эти шифры нельзя использовать, если для версии TLS ранее 1.2. [Стив Хенсон]

спасибо gtrig за вашу помощь.


когда я использую ту же команду, что и вы с опцией-SHA384, я получаю это в результирующем CSR: "алгоритм подписи: ecdsa-with-SHA384".

введите эту команду, чтобы просмотреть список поддерживаемых дайджестов:

openssl list-message-digest-algorithms

надеюсь, вы увидите SHA384 в этом списке.

о вашем 2-м вопросе, формат ASN.1. "30" означает, что следует последовательность (в данном случае это последовательность из 2 целых чисел). "65" - это число октетов в последовательности. "02" представляет целое число, а 30-это количество октетов в это число. Если вы пропустите вперед 0x30 (48 в десятичном) октетах, вы придете ко 2-му целому числу, которое помечено "02" и "31". Таким образом, длина первого целого числа равна 30, а второго-31. Добавьте 2 октета для каждого целого числа, и вы получите 65, что является длиной последовательности. Это страница может рассказать вам больше о ASN.1.

поскольку это значение является последовательностью из 2 целых чисел, это имеет смысл. На уровнем подпись состоит из 2 чисел. См.RFC6605 раздел 4 для получения дополнительной информации. Существует также страница wiki это объясняет, как вычислить 2 целых числа.


чтобы сделать ответ более полным, можно упомянуть генерацию несамозаверяющих сертификатов с подписью ecdsa-sha384, потому что это немного отличается. Хитрость заключается в использовании параметра "-md sha384" с командой "openssl ca".

пример, включая сертификат клиента

создать ключ для центра сертификации:

openssl ecparam -out ca.key -name secp384r1 -genkey

создать самозаверяющий сертификат для ca:

openssl req -x509 -new -key ca.key -out ca-ca.pem -outform pem -sha384

создать ключ для a клиент:

openssl ecparam -out host1.key -name secp384r1 -genkey

создать запрос сертификата для ключа клиента:

openssl req -new -nodes -key host1.key -outform pem -out host1.req -sha384

создать сертификат для клиента в ответ на запрос:

openssl ca -keyfile ca.key -cert ca-ca.pem -in host1.req
  -out ca-host1-cert.pem -md sha384 -outdir .