当前位置: 首页 > 知识库问答 >
问题:

在PHP中生成RSA私有SSH密钥

徐嘉勋
2023-03-14

我用PHP OpenSSL生成了一个SSH密钥:

$rsaKey = openssl_pkey_new(array( 
    'private_key_bits' => 4096,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
));
$privKey = openssl_pkey_get_private($rsaKey); 
openssl_pkey_export($privKey, $pem);

这导致$pem如下所示:

-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQC8ggt6rVHYnqNP
...
e95+EXbPc6THyWt9pgwOsJltpylIYG4=
-----END PRIVATE KEY-----

但是我无法使用此密钥进行身份验证。在使用它之前,我必须使用以下命令转换它:

openssl rsa -in xxx.key -outform pem > xxx.key2

转换的结果如下:

-----BEGIN RSA PRIVATE KEY-----
MIIJKQIBAAKCAgEAvIILeq1R2J6jT+xjlK5NrOqFZTOJ4PByvgPQNbb2Kp7c3W15
...
o1t2KBkaSoR+JyOPOZakq5BLv8lgD3vefhF2z3Okx8lrfaYMDrCZbacpSGBu
-----END RSA PRIVATE KEY-----

两者都是PEM格式,但第二个是RSA私钥。使用第二个,PHP可以登录。所以我需要一个以RSA PRIVATE KEY开头的密钥,而不仅仅是PRIVATE KEY。如何使用PHP和OpenSSL PHP实现创建它?

共有1个答案

宰子琪
2023-03-14

这是两种不同的键类型。您正在寻找PKC#1,但获得PKC#8。

这似乎与PHP使用的OpenSSL版本有关。自1.0以来的版本创建了一个PKCS#8文件,而PHP开发人员对此不做任何事情。使用此命令从命令行执行此操作时,也会出现相同的问题:

openssl req -new -keyout mykey.key -out mycertreq.csr -nodes -sha1 -newkey rsa:2048

您可以尝试使用名为phpseclib的外部库,尽管我自己还没有尝试过:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH);
$result = $rsa->createKey();
echo $result["privatekey"];
?>
 类似资料:
  • 问题内容: 我有以下代码: 密钥如下所示: 并且有效: 但出现以下错误: 不是有效的RSA私钥文件 这是在MacOS,Python 2.7,Paramiko 2.4.2上 我究竟做错了什么? 问题答案: 对于OpenSSH 7.8或更高版本,您必须欺骗它。运行到据称变化的密码,但重新使用旧的。使用,如果你想避免的提示,如在脚本,但要注意使你的密码对其他用户可见的。作为副作用,这将以“旧”(兼容Op

  • 我正在尝试创建一个公钥以允许我推送到Git,但我的. ssh文件夹尚未创建。 以下是我运行的命令: $ssh-keygen-t rsa-Cemaill@me.com 生成公共/私有rsa密钥对 输入保存密钥的文件(/h/.ssh/id\u rsa): 这就是H:驱动器配置、数据、配置文件、配置文件中的全部内容。V2 我认为有一个问题,因为当我得到提示输入文件,其中保存密钥(/h//. ssh/id

  • 问题内容: 我想生成512位RSA密钥对,然后将我的公共密钥编码为字符串。我该如何实现? 问题答案: 输出为十六进制字符串 输出为字节值

  • 我知道可以使用此链接为OpenSSL中的自签名证书生成一个公钥和一个私钥。但是对于给定的公钥,我有没有可能算出对应的私钥呢?我一直在使用1024位的RSA公钥。

  • 我使用命令“ssh-keygen-t rsa”创建了一个没有密码的公钥,我打算将其用于github,但我错误地发送了公钥和私钥...... 这到底意味着什么?

  • 我正在Erlang中创建一个应用程序,给定一个RSA私钥,它可以返回RSA公钥和与该priv密钥相关联的x509公钥。 ----只是一个更新---- 在花了一些时间了解x509并阅读了Erlang public_key文档后,我找到了一个解决方案: 如果我可以通过简单地获取模数和publicExponent,从“RSaprivateKey”生成“RSapublicKey”,那么生成这两个键的代码如