Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将SSH标识文件密钥对添加到JKS密钥库_Java_Ssl_Ssh_Identity_Keystore - Fatal编程技术网

Java 如何将SSH标识文件密钥对添加到JKS密钥库

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

我正在构建的Java应用程序的任务之一是连接到远程SFTP服务器。为此,我拥有远程计算机的证书和本地身份(
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