【问题标题】:How to add SSH identity file keypair to JKS keystore如何将 SSH 身份文件密钥对添加到 JKS 密钥库
【发布时间】:2015-10-01 20:52:02
【问题描述】:

我正在构建的 Java 应用程序的任务之一是连接到远程 SFTP 服务器。为此,我拥有远程机器的证书和本地身份(.ssh 文件夹中的id_rsaid_rsa.pub)。这工作正常。

我想将证书和身份放在受密码保护的 java 密钥库中,以便更轻松、更安全地进行配置。我有这个证书工作,但我在将 SSH 身份存储在 JKS 或 PKCS12 密钥库中时遇到问题(任何一个都可以)。

为了隔离问题,我尝试了以下步骤:

我使用ssh-keygen -b 2048 在本地目录中创建两个身份文件id_rsa_demoid_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 密钥库中?

【问题讨论】:

  • 我发现了这个相关的问题,但我不想将它存储为密码字符串,这感觉很有趣。 stackoverflow.com/questions/6243446/…
  • 我不太确定,但我认为 java 的密钥库(PKCS12 或 JKS 格式)旨在用于 SSL 通信。 SSL 通信使用比称为证书的公钥更完整的东西来验证实体。该证书嵌入了可分辨名称和其他内容,以初始化 2 个实体之间的 SSL 通信。我认为 SSL 和 SSH 之间存在混淆,我确信存储在密钥库中的信息可能会用于 SSH 通信。
  • 您是在尝试使用现有的私钥,还是可以生成一个新的?

标签: java ssl ssh identity keystore


【解决方案1】:

假设您有一个如下所示的私钥:

id_rsa

-----开始 RSA 私钥----- 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 -----结束 RSA 私钥-----

做两件事:

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 库进行交互留作练习。

【讨论】:

  • 如果我没看错,这会创建一个带有新公钥的新证书,还是它实际上包含 id_rsa.pub 的原始字节?
  • 公钥总是可以从私钥中推断出来的,至少在 RSA 中是这样。但是,是的,字节在那里,只是包含不同的格式元数据。例如,您仍然可以使用 id_rsa.pub 中的格式添加到 authorized_keys。
猜你喜欢
  • 1970-01-01
  • 2014-11-20
  • 2021-02-23
  • 2018-03-15
  • 2019-03-14
  • 2012-08-05
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多