Java 如何将SSH标识文件密钥对添加到JKS密钥库
我正在构建的Java应用程序的任务之一是连接到远程SFTP服务器。为此,我拥有远程计算机的证书和本地身份(Java 如何将SSH标识文件密钥对添加到JKS密钥库,java,ssl,ssh,identity,keystore,Java,Ssl,Ssh,Identity,Keystore,我正在构建的Java应用程序的任务之一是连接到远程SFTP服务器。为此,我拥有远程计算机的证书和本地身份(id\u rsa和id\u rsa.pub在.ssh文件夹中)。这很好用 我希望将证书和标识放在一个受密码保护的java密钥库中,以便进行更简单、更安全的配置。我的证书可以这样做,但在JKS或PKCS12密钥库中存储SSH标识时遇到问题(任何一个都可以) 为了隔离问题,我尝试了以下步骤: 我使用ssh-keygen-b2048在te本地目录中创建两个身份文件id\u rsa\u demo和i
id\u rsa
和id\u rsa.pub
在.ssh
文件夹中)。这很好用
我希望将证书和标识放在一个受密码保护的java密钥库中,以便进行更简单、更安全的配置。我的证书可以这样做,但在JKS或PKCS12密钥库中存储SSH标识时遇到问题(任何一个都可以)
为了隔离问题,我尝试了以下步骤:
我使用ssh-keygen-b2048
在te本地目录中创建两个身份文件id\u rsa\u demo
和id\u rsa\u demo.pub
。据我所知,这些是标识的私钥和公钥,因此我尝试将它们合并到identity.p12
文件中:
openssl pkcs12 -export \
-inkey "id_rsa_demo" \
-in "id_rsa_demo.pub" \
-out "identity.p12" \
-password "pass:topsecret" \
-name "demoalias"
这导致错误无法加载证书
。我四处搜索,似乎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-----
openssl pkcs12-info-in-identity.p12
输入导入密码:
MAC迭代2048
MAC验证正常
PKCS7数据
带护罩的钥匙袋:PBewithsha1和3钥匙三重定位CBC,迭代2048
行李属性
friendlyName:demoalias
关键属性:
输入PEM密码短语:
验证-输入PEM密码短语:
-----开始加密私钥-----
MIIFDJBABGKQHKIG9W0BBQ0WMZABBKQHKIG9W0BBQWWDGQIAOXPZCKBB28CAGGA
MBQGCCqGSIb3DQMHBAjPq9ibr445xQSCBMi5IlOk5F28kQPB5D97afiUb5d3It46
...
ejwYfHTj6bm+DEOUK68ZNRWKQWUJX5AZV3U8SM1CICVMH9W0HPL5TSMMMPDS1EY
Uos=
-----结束加密私钥-----
有没有办法将SSH标识存储到PKCS12或JKS密钥库中?假设您有一个如下所示的私钥: id_rsa 2) 根据新请求创建自签名证书
openssl x509 -signkey id_rsa -req -in example.req -out example.cer
然后,输入到keytool
cat example.cer id_rsa > example.full
keytool -import -keystore example.jks -file example.full
这会把钥匙放进去的。利用私钥和公钥并与您选择的SSH/SFTP库交互只是一个练习。我发现了这个相关问题,但我不想将其存储为密码字符串,这感觉很有趣。这里我不是很确定,但我认为java的密钥库(PKCS12或JKS格式)是用于SSL通信的。SSL通信使用比公钥(称为证书)更完整的东西来验证实体。该证书嵌入了一个区分名称和其他内容来初始化两个实体之间的SSL通信。我认为SSL和SSH之间存在混淆,我确信存储在密钥库中的信息可能用于SSH通信。您是在尝试使用现有私钥,还是可以生成一个新的私钥?如果我读对了,这将使用新的公钥创建一个新证书,或者它实际上包含id_rsa.pub的原始字节吗?公钥总是可以从私钥中推断出来,至少在rsa中是这样。但是是的,字节在那里,只是用不同的格式元数据打包。例如,您仍然可以使用id_rsa.pub中的格式添加到授权的_密钥。
openssl x509 -signkey id_rsa -req -in example.req -out example.cer
cat example.cer id_rsa > example.full
keytool -import -keystore example.jks -file example.full