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

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

3 ответа3

1

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

Нет такой вещи как неподписанный сертификат. Если он не подписан, то это не сертификат.

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

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

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

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

1

В OpenSSL версии 1.0.2 TBS-часть сертификата является полем x509->cert_info с типом X509_CINF который является typedef для struct x509_cinf_st . Следуя обычному шаблону, вы можете заслужить это с помощью {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 по-прежнему официально экстернализуются. Это противоречиво, и меня не удивит, если это изменится в будущем.

0

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .