2015-07-13 1 views
4

Одной из задач приложения Java, которую я создаю, является подключение к удаленному SFTP-серверу. Для этого у меня есть сертификат удаленной машины и локальный идентификатор (id_rsa и id_rsa.pub в папке .ssh). Это работает нормально.Как добавить ключевую пару файла идентификатора SSH в хранилище JKS

Я хотел бы поместить сертификат и личность в хранилище ключей java, защищенное паролем, для упрощения и более безопасной конфигурации. У меня это работает для сертификата, но у меня возникают проблемы с хранением SSH-идентификации в хранилище ключей JKS или PKCS12 (любой из них будет работать).

Чтобы изолировать проблему, я попытался следующие шаги:

я использую ssh-keygen -b 2048 создать два файла удостоверения id_rsa_demo и id_rsa_demo.pub в тэ локальный каталог. Как я понимаю, эти частные и открытые ключи идентичности, поэтому я стараюсь, чтобы объединить тех, кто в identity.p12 файл:

openssl pkcs12 -export \ 
       -inkey "id_rsa_demo" \ 
       -in "id_rsa_demo.pub" \ 
       -out "identity.p12" \ 
       -password "pass:topsecret" \ 
       -name "demoalias" 

Это дает мне ошибку unable to load certificates. Я искал вокруг, и кажется, что openssl ожидает сертификат с полной цепочкой для параметра -in. Поскольку моя генерироваться идентичность не имеет, что я попробовал вариант -nocerts, например, так:

openssl pkcs12 -export \ 
       -inkey "id_rsa_demo" \ 
       -in "id_rsa_demo.pub" \ 
       -out "identity.p12" \ 
       -password "pass:topsecret" \ 
       -name "demoalias" \ 
       -nocerts 

я не получаю никаких ошибок, но вариант -nocerts оправдывает свое обещание и не добавить свой открытый ключ в файл PKCS12 :

openssl pkcs12 -info -in identity.p12 

Enter Import Password: 
MAC Iteration 2048 
MAC verified OK 
PKCS7 Data 
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048 
Bag Attributes 
    friendlyName: demoalias 
Key Attributes: <No Attributes> 
Enter PEM pass phrase: 
Verifying - Enter PEM pass phrase: 
-----BEGIN ENCRYPTED PRIVATE KEY----- 
MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIAOXpzckBb28CAggA 
MBQGCCqGSIb3DQMHBAjPq9ibr445xQSCBMi5IlOk5F28kQPB5D97afiUb5d3It46 
... 
ejwYfHTj6bm+dEOUk68zNrWwKqwuJx5AZv3U8sm1cicVmh9W0HpL5tSmMMpDS1ey 
Uos= 
-----END ENCRYPTED PRIVATE KEY----- 

есть ли способ сохранить идентичность SSH в PKCS12 или JKS хранилище?

+0

Я нашел этот связанный вопрос, но я не хочу хранить его как строку пароля, которая кажется забавной. https://stackoverflow.com/questions/6243446/how-to-store-a-simple-key-string-inside-java-keystore#6243755 – Rolf

+0

Я не совсем уверен здесь, но я думаю, что хранилища java (либо в PKCS12 или JKS) предназначены для использования в SSL-соединениях. Связь SSL использовала нечто более совершенное, чем открытый ключ, называемый сертификатом, для аутентификации объектов.Сертификат вставляет Distinguish Name и другие вещи для инициализации SSL-связи между двумя объектами. Я думаю, что существует путаница между SSL и SSH, и я уверен, что возможно, что информация, хранящаяся в хранилище ключей, может использоваться для связи SSH. –

+0

Вы пытаетесь использовать существующий закрытый ключ, или это нормально для создания нового? –

ответ

5

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

id_rsa

 
-----BEGIN RSA PRIVATE KEY----- 
MIICWgIBAAKBgQCh3czej+KeEraesxts3xP6kx+cO/Fu8ROc/k4hSl7fO9jFZ6Lm 
OsGlzsRsi8VDg9n/fh6iFng/Umgnfd4J0IiLQihSRYnvyOsqqXbIJ8mBtydqO4s+ 
CjZLLDRSEMx3dw6GhFOcQ7xYYOeUMNY8QFidPn2LjURfMxG9XWOrCww8rwIBJQKB 
gGA+sSpjZCajV9P7yx4jxrCqgX99lnlREpSy4lj7ybUqgOQUG6t84dg1wOaYS8dH 
erOXGSIbMr3d+L2JHD0v4ntcKqzJm6Nf1FE27V0hvpzZl3fNax4NI/cIXM78zBx4 
lBblr5QMYnTSd5eADIcDy7TZHuScRPkPViQ2x9QPayQ9AkEA67lfOXFEJ8iTYHdu 
ykvj0Xqcs/peDX5nYXCEJ2XECxgxfKYVbQPazO5ACgp1VsgFMCsd4rDSwahOAgkE 
rGfgCwJBAK/KFkSqMCLga8m19uqOftTQ+GhFc0O1lchWQ0A99+b9Rcs0yAe10GCN 
SbgrEmMuXEQS1emT6ZHM7KIh2P7kiG0CQQDSPYxH/TzJiWDZf0cjIRdMIT+ncJkS 
9DKw2flTkh2NWsRaap1858MleowkoYs/j81Gov76nbUNlhwPpy2uhiivAkByBor8 
G11+aA6QrWHkQMD4vuZReSgr62gTPt+DndE74o4i8c3bfNowyllU3asP5rhjgdbc 
svheksMBYhA2ohNNAkAiKQdv08UAG77piJi09OFIEcetTiq/wy9Zeb6fmEuMFzsT 
2aR6x0d43OXqAgcKFgFuzqdXgxqhP/n9/eIqXdVA 
-----END RSA PRIVATE KEY----- 

Есть две вещи:

1) Создать сертификат, чтобы обернуть ключ и подвергать общественности ключ как сертификат, так что keytool понимает это.

openssl x509 -signkey id_rsa -req -in example.req 

2) Создайте самозаверяющий сертификат из вашего нового запроса.

openssl x509 -signkey id_rsa -req -in example.req -out example.cer 

Затем combine the certificate and private key, а импорт в keytool.

cat example.cer id_rsa > example.full 
keytool -import -keystore example.jks -file example.full 

Это позволит получить ключи оттуда. Использование частных и открытых ключей и взаимодействие с библиотекой SSH/SFTP по вашему выбору оставляют в качестве упражнения.

+0

Если я прочитал это правильно, это создаст новый сертификат с новым открытым ключом или на самом деле содержит исходные байты id_rsa.pub? – Rolf

+0

Открытый ключ всегда выводится из закрытого ключа, по крайней мере, в RSA. Но да, байты там, просто упакованы с различными метаданными форматирования. Например, вы бы использовали формат от id_rsa.pub для добавления в authorized_keys. – maxwellb