【问题标题】:Generate SSH keypair form PHP从 PHP 生成 SSH 密钥对
【发布时间】:2011-07-11 09:44:27
【问题描述】:

我想从 php 生成 ssh 密钥对,谁能指导我怎么做?我已经尝试过 shell_exec,但 shell 会提出问题,因此该命令不起作用。我想指定生成后放置密钥的文件名和路径。

【问题讨论】:

    标签: php ssh


    【解决方案1】:

    这是基于Converting an OpenSSL generated RSA public key to OpenSSH format (PHP)。谢谢shevron

    <?php
    $rsaKey = openssl_pkey_new(array( 
                  'private_key_bits' => 1024, 
                  'private_key_type' => OPENSSL_KEYTYPE_RSA));
    
    $privKey = openssl_pkey_get_private($rsaKey); 
    openssl_pkey_export($privKey, $pem); //Private Key
    $pubKey = sshEncodePublicKey($rsaKey); //Public Key
    
    $umask = umask(0066); 
    file_put_contents('/tmp/test.rsa', $pem); //save private key into file
    file_put_contents('/tmp/test.rsa.pub', $pubKey); //save public key into file
    
    print "Private Key:\n $pem \n\n";
    echo "Public key:\n$pubKey\n\n";
    
    function sshEncodePublicKey($privKey) {
        $keyInfo = openssl_pkey_get_details($privKey);
        $buffer  = pack("N", 7) . "ssh-rsa" .
        sshEncodeBuffer($keyInfo['rsa']['e']) . 
        sshEncodeBuffer($keyInfo['rsa']['n']);
        return "ssh-rsa " . base64_encode($buffer);
    }
    
    function sshEncodeBuffer($buffer) {
        $len = strlen($buffer);
        if (ord($buffer[0]) & 0x80) {
            $len++;
            $buffer = "\x00" . $buffer;
        }
        return pack("Na*", $len, $buffer);
    }
    ?>
    

    【讨论】:

    • 这非常有效。不过,我将 private_key_bits 增加到 4096。
    【解决方案2】:

    我会使用phpseclib, a pure PHP RSA implementation:

    <?php
    include('Crypt/RSA.php');
    
    $rsa = new Crypt_RSA();
    
    $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH);
    
    extract($rsa->createKey());
    echo "$publickey\r\n\r\n$privatekey";
    ?>
    

    样本输出:

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZw== phpseclib-generated-key
    
    -----BEGIN RSA PRIVATE KEY-----
    MIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp
    wmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5
    1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh
    3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2
    pIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX
    GukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il
    AkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF
    L0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k
    X6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl
    U9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ
    37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0=
    -----END RSA PRIVATE KEY-----
    

    来源:http://phpseclib.sourceforge.net/rsa/examples.html#openssh

    【讨论】:

      【解决方案3】:

      有人试过吗?

      ssh-keygen -q -N place_your_passphrase_here -t rsa -f ~/.ssh/id_rsa
      

      它对我有用

      【讨论】:

      • 太好了,这对我来说解决了“输入保存密钥的文件”问题,谢谢。
      【解决方案4】:

      查看ssh-keygen 的手册页,了解如何在没有任何提示的情况下执行它。

      http://linux.die.net/man/1/ssh-keygen

      【讨论】:

      • 似乎 -q 选项使 ssh-keygen 静音,但是我将如何指定文件名和目录??
      • 来自ThiefMaster提供的链接:“ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]”或者使用proc_open()来处理交互式I/O跨度>
      • 让它工作......使用这个命令 ssh-keygen -f /path/to/file -N ''
      【解决方案5】:

      此代码仅使用内置的 PHP openssl 函数。

      它以便携式 PEM 格式生成密钥,适用于大多数第 3 方软件。

      <?php
      
      function generateRsaKeyPair(array $config = []): array
      {
        $config = array_merge([
          'digest_alg' => 'sha512',
          'private_key_bits' => 2048,
          'private_key_type' => OPENSSL_KEYTYPE_RSA,
        ], $config);
      
        // Create the keypair
        $key = openssl_pkey_new($config);
        if (!$key) {
          throw new RuntimeException('Unable to generate RSA key pair');
        }
      
        // Get private key
        openssl_pkey_export($key, $private);
        if (!$private) {
          throw new RuntimeException('Unable to extract private key');
        }
      
        // Get public key
        $public = openssl_pkey_get_details($key)['key'] ?? null;
        if (!$public) {
          throw new RuntimeException('Unable to extract public key');
        }
      
        // Free key from memory
        openssl_pkey_free($key);
      
        // Return both keys
        return compact('public', 'private');
      }
      

      【讨论】:

      • 我正在尝试使用内置的 Openssl 函数来生成 ED25519 密钥对,但目前不支持,或者?
      猜你喜欢
      • 2019-06-11
      • 2017-04-30
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2023-03-29
      • 2020-08-06
      • 2021-09-10
      • 2011-01-28
      相关资源
      最近更新 更多