Сохраните сертификат для последующей подписи

с OpenSSL, можно ли создать, сериализовать и сохранить сертификат в файл без его подписания (и я имею в виду сертификат, а не CSR), а затем загрузить сохраненный DER или PEM, десериализовать и подписать его, возможно, на другой машине?

Я не смог найти способ создать неподписанный сертификат с openssl через командную строку, но я собрал программу, чтобы сделать это (X509_new() и заполнить соответствующие данные). Однако проблема в том, что я не подписываю сертификат (с X509_sign()) перед сериализации, десериализации не с ошибками кодирования.

29
задан mnistic
06.03.2023 10:40 Количество просмотров материала 2649
Распечатать страницу

3 ответа

через OpenSSL выпуска 1.0.2, TBS часть сертификата поле x509->cert_info с типом X509_CINF который является typedef для struct x509_cinf_st. Следуя обычному шаблону, вы можете ser/deser это с {i2d,d2i}_X509_CINF_* . Помните, X. 509, который имеет AlgorithmIdentifier для подписи (в OpenSSL типа X509_ALGOR) как внутри TBS, так и снаружи, поэтому вам нужно будет установить внутреннее поле в какое-то допустимое значение, даже если это не то значение, которое будет фактически использоваться при подписывании.

в 1.1.0 структура X509 сделан непрозрачный (наряду со многими другими), и нет API для доступа к этой части. Но если немного схитрить и использовать crypto/include/internal/x509_int.h чтобы получить его, typedef и объявления для подпрограмм i2d/d2i по-прежнему официально экстернализованы. Это непоследовательно, и меня не удивит, если это изменится в будущем.

1
отвечен dave_thompson_085 2023-03-07 18:28

... сериализуйте и сохраните сертификат в файл, не подписывая его (и я имею в виду сертификат, а не CSR) ... создайте неподписанный сертификат

нет такого понятия, как неподписанный сертификат. Если он не подписан, то это не сертификат.

проблема, однако, если я не подпишу сертификат (с X509_sign()) перед сериализации, десериализации не с ошибками кодирования.

понятия не имею какой тип сериализации и десериализации вы пробовали (код не указан).

но то, что вы по существу спрашиваете, это заморозить все структуры данных, связанные с текущим состоянием процесса подписания, прежде чем делать фактическое подписание и разморозить их снова на другой машине, чтобы продолжить подписание. Теоретически это должно быть возможно, так как можно перенести целые процессы или виртуальные машины между системами, поэтому вопрос в основном заключается в том, как сделать замораживание минимальным.

OpenSSL не имеет явного API для этого, потому что до сих пор не было случая использования, который требовал, чтобы у него был такой API. И я не вижу реального варианта использования из вашего вопроса, потому что вы можете просто использовать CSR и всю информацию, необходимую для подписи и выполнения всех процессов на другой машине. Это больше похоже на проблема по XY для меня.

1
отвечен Steffen Ullrich 2023-03-07 20:45

Я думаю, что вы немного смущены терминами. Сертификат-это документ, который был подписан центром сертификации (ca), если это не подписано, это не сертификат. Запрос на подпись сертификата (CSR) - это документ, который необходимо подписать, а также метаданные, необходимые для подписи. Вообще говоря, и особенно, когда вы имеете дело с OpenSSL, "документ", который будет подписан, является открытым ключом.

шаги, которые вы обычно делаете с OpenSSL:

  1. использовать openssl genpkey для создания пары открытый / закрытый ключ.
  2. собирать метаданные, касающиеся использования ключа, отличительное имя, и т. д.
  3. использовать openssl req для форматирования метаданных и открытого ключа в соответствии со структурой запросов на подпись сертификата; формат PKCS#10 является ASN.1 закодированный документ, используемый при создании запросов на сертификат X. 509. Если вы собираетесь передать эти данные CSR по электронной почте или в текстовом файле, это часто кодируется Base64.
  4. отправить CSR в центр сертификации для подписания.
  5. получите подписанный сертификат от CA.

Также обратите внимание, что вы обычно не используете OpenSSL для подписи CSR самостоятельно. Вы бы сделали это только в том случае, если бы у вас была веская причина для самозаверяющего сертификата (возможно, настройка собственной частной VPN.) Самозаверяющие сертификаты не доказывают ничего никому, кроме вас, потому что они не подписаны доверенным корневым центром сертификации; поэтому они не доверяют браузерам или другим компьютерам.

что вы описать это можно, сохранив CSR. Опять же, если он не подписан, это не может быть сертификатом.

0
отвечен John Deters 2023-03-07 23:02

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх