2014-02-04 2 views
0

У меня есть аппаратное обеспечение, которое я использую для генерации ключей RSA и подписей. Мне нужны две вещи:Как использовать openssl с аппаратным чипом шифрования?

1) Создайте запрос сертификата. С помощью аппаратного обеспечения я могу получить открытый ключ для сертификата и сделать часть подписи. Мне нужен код для создания сертификата, т. Е. Делайте материал ASN.1/DER/PEM.

2) Подпишите данные, используя S/MIME. Опять же, я буду использовать аппаратное обеспечение для части подписи, но мне нужен код для части формата: PKCS # 7 для конвертации как подписи, так и сертификата x509 в результате предыдущей задачи.

Поэтому я мог бы использовать openssl как для генерации CSR, так и для S/MIME-форматов, но openssl требует для таких задач закрытого ключа для подписывания, и, как я уже сказал, подписание я делаю с помощью аппаратного обеспечения. Я знаю, что есть механизм, называемый «двигателями» для подключения аппаратных функций к openssl, но он использует динамические библиотеки, которые не поддерживаются на моей платформе (ранний uClinux для ARM).

Итак, вопрос в том, есть ли другой способ заставить openssl принять внешний ключ и, что более важно, делегировать подписку на мое оборудование? В противном случае, вы бы порекомендовали другую библиотеку C/C++, которую я мог бы использовать для этого? Мне действительно не нужна криптографическая библиотека, ей будет достаточно библиотеки, которая знает, как создавать эти форматы (запросы на сертификаты и S/MIME).

ответ

2

Двигатели по-прежнему идут своим путем, поскольку они являются единственным способом разгрузить криптографические задачи, используя OpenSSL вдали от самой библиотеки. Насколько я понимаю вас, вы можете создавать что угодно, но его нужно статически связать с OpenSSL, потому что вы не можете загружать разделяемые библиотеки (или создавать их?). Я действительно не знаю uClinux, так что медведь со мной здесь.

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

Так что вы хотите создать движок, способный выполнять криптографию на существующих ключах и строить его вместе. с OpenSSL. В качестве примера попробуйте построить OpenSSL изначально (без изменений) и запустить openssl engine. Он легко покажет вам все встроенные двигатели (один из которых является dynamic, но есть и другие, такие как chil для nCipher ИМП.

У меня была аналогичная проблема, около двух лет назад (хотя я уже имел работающий двигатель), где я первый необходимо создать CSR w/private key, а затем сделать крипто с этим (или другим) закрытым ключом (на самом деле PKCS # 7). Моим решением было использовать инструменты командной строки для генерации ключа и CSR и использовать OpenSSL для наиболее важных криптографических операций, то есть подписи и дешифрования (на самом деле мне нужны только функции RSA и dec dec).

OpenSSL - это ужасно документированный проект, и мне пришлось прочитать много его исходного кода, чтобы заставить думать работать правильно Чтобы получить ваш двигатель и я предлагаю вам прочитать исходный код движков (среди прочего, я работал с e_capi.c, который я нашел довольно простым для понимания). Для фактического использования двигателя вы можете найти некоторые из моих исходных кодов sscep.

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

Смежные вопросы