2009-11-23 3 views
2

Мне нужно подписать цифровую строку с использованием алгоритма SHA-1 с RSA с использованием дополнения PKCS # 1. Я загрузил Turbo Power Lockbox.Чтение частного ключа в формате PEM с помощью LockBox

Секретный ключ я имею в формате PEM и был создан с помощью OpenSSL:

openssl req -x509 -nodes -days 365 -newkey rsa:1024 -sha1 -subj 
    "/C=US/ST=CA/L=Mountain View/CN=www.mycompany.com" 
    -keyout myrsakey.pem -out c:\temp\myrsacert.pem 

Вот как это выглядит:

-----BEGIN RSA PRIVATE KEY----- 
MIICXAIBAAKBgQDFzvqdAEQn9MrSLTNua5SOxshV/8jQIf3qpfunBXa9SVdm4NJw 
lY7iYpwivw7EdMlBe4FmezN9LGwyIokcUSt4KUdWmA8l4Lm5rcuDzzfmlVWP7y+j 
0GKG2XCp2JwHpW4Q5WiMgcAnCMD/gbDustfz3utxQhLNBdWp2MlrEH2/rQIDAQAB 
AoGAUMZmnHohWtehgxYmLG8N6QfPgx7CWAupbop9KwUWKdGrOT2RcZwBDv0JmT6/ 
vwWZsX3Hp5ujuPfM7uQfbUrQHrcruUg/fPY8YXcWgNfOytGpaN/XKxfy2g2Cp8mE 
4yoDR2QW8jo25ZH1q1cJ3jMyX9xlXaSZm7qtaoiDydE6roECQQDxqtP2tMEZ2FmQ 
2o4T5Zv7P4II2PrLq+9IP0ASCZ2VzLxm2Pk6kxjnPjZ2oHG8pUQHvMz0m8Br3BY8 
X1BpXrj9AkEA0YpBH7qm/nbG6YjxKAL3PbxXUJ06T/ByLjfstfCrT3LxDeklfWJb 
n/V8ahRcKPLajdbKAuWvJA5NvjeJPi34cQJAZ+vD1nUIDKsiaM3zBs9X8gTvUAqu 
XmMDNJguXxNPdplh8wAevHeA3/+6v+xivHJ8/K7Nm+pWJouv7Co4k/ctqQJASV4y 
TUzKmgC2xyCG5+6Z6Ujf/b7/ouva3un//PiG0yu40ZkX4l4lHM4UwQPd/QyDj/Rs 
CTWo7GQBvp+tc1MfUQJBALnQnNOIIkvwIK+1J6iLZgh7GurbCPMrH8nSn8SxkfBe 
qq5JWo31LQAUNDW5ntG0qHZQpx6zm2MzIlt2NgOLf4s= 
-----END RSA PRIVATE KEY----- 

Если я не ошибаюсь, компонент, который я хочу использовать, - TLbRSAKey. Так что я попытался создать ключевой объект и прочитать его из файла:

var 
    mPrivateKey: TLbRSAKey; 
begin 
    mPrivateKey := TLbRSAKey.Create(aks1024); 
    mPrivateKey.LoadFromFile('C:\temp\myrsakey.pem'); 

На LoadFromFile я получаю ошибку «Invalid RSA Key». Что я делаю не так? Поддерживает ли Lockbox ключи в формате PEM? Ни один из примеров не иллюстрирует; все, кажется, в формате ASN

+0

Just [велосипед линять] (http://bikeshed.com/), но * "CN = www.mycompany.com "* - это прежний способ сделать это. Сегодня это может вызвать массу проблем, даже если вы подписываете его со своим собственным ЦС (т. Е. Не подписались самостоятельно). См. [Как создать самозаверяющий сертификат с openssl?] (Http://stackoverflow.com/q/10175812/608639). Сосредоточьтесь на использовании альтернативных имен предмета (а не на самоподписанной части). – jww

ответ

3

Я не программист Delphi, но я думал, что попытаюсь предоставить некоторые указатели.

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

Во-вторых, формат ASN.1 генерируется с использованием вывода DER из OpenSSL. Формат PEM - это только кодировка base-64 двоичной структуры ASN.1 (и добавляются маркеры).

Вы можете вернуться к МЭД в одном из двух способов:

1) Можно анализировать и декодировать базу 64 данных в конверте PEM. Для этого просто декодируйте данные между маркерами -----BEGIN/END RSA PRIVATE KEY-----.

Или, так как вы создаете новый ключ в любом случае ...;)

2) Вы можете использовать -outform DER аргумент при создании ключа с помощью OpenSSL.

Я не уверен, что это сработает для вашего приложения, но, возможно, это поможет вам немного дальше.

TIP преобразовать provate ключ PEM в формате DER, используйте rsa утилиту в OpenSSL:

openssl rsa -inform PEM -outform DER -in privkey.pem -out privkey.der 
+0

Это помогает. Я решил, что у меня есть разрыв в формате данных. Я сделал то, что вы сказали в (2), т. Е. Добавил аргумент DER -out DER. Он сгенерировал сертификат и ключ. Сертификат кажется правильным, и я могу дважды щелкнуть по нему в окнах и содержать всю информацию. Но закрытый ключ все еще выходит в Base64 с маркерами. Я также пробовал аргумент DEP-формы формы, но получаю то же самое. –

+1

К сожалению, я не думаю, что есть способ создать секретные ключи в формате DER напрямую.Вместо этого я добавил подсказку для преобразования вашего закрытого ключа в формат DER. – jheddings

+0

ОК - я успешно преобразовал свой закрытый ключ в формат DER в соответствии с jheddings (я обновил свой вопрос, чтобы отразить это). Но теперь я получаю деление на нулевую ошибку. хеддинги - спасибо, но я думаю, что именно здесь он превращается в материал Delphi. –

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