PHP - openssl_pkey_new() 函数



定义和用法

openssl_pkey_new() 函数将返回一个资源标识符,该标识符包含新的私钥和公钥对。

描述

openssl_pkey_new() 函数返回一个资源标识符。您可以使用 openssl_pkey_get_details() 函数获取生成的密钥的所有详细信息。密钥(公钥/私钥对)稍后将与其他 openssl 函数一起使用,例如 openssl_sign()、openssl_csr_new()(获取 CSR 证书),这有助于创建加密数字签名。

语法

openssl_pkey_new ([ array $configargs ] ) : resource

参数

序号 参数 描述
1

configargs

参数 configargs 是需要提供给函数以生成私钥/公钥对的配置详细信息。详细信息如下所示。

configargs

默认情况下,openssl_pkey_new() 使用 openssl.cnf 中存在的配置详细信息。但是,使用 configargs,您可以覆盖它们。配置详细信息如下:

configargs 中的键 类型 在 openssl.conf 中使用的键 描述
digest_alg 字符串 default_md 您可以从 openssl_get_md_methods() 获取的摘要方法。
x509_extensions 字符串 x509_extensions 创建 x509 证书时使用的扩展。
req_extensions 字符串 req_extensions 创建 CSR 时使用的扩展。
private_key_bits 整数 default_bits 指定生成私钥时要使用的位数。
private_key_type 整数 要创建的私钥类型。它可以是 OPENSSL_KEYTYPE_DSA、OPENSSL_KEYTYPE_DH、OPENSSL_KEYTYPE_RSA 或 OPENSSL_KEYTYPE_EC 之一。默认值为 OPENSSL_KEYTYPE_RSA。
encrypt_key 布尔值 encrypt_key 导出的密钥是否加密?
encrypt_key_cipher 整数 密码常量,例如 OPENSSL_CIPHER_RC2_40(整数)、OPENSSL_CIPHER_RC2_128(整数)、OPENSSL_CIPHER_RC2_64(整数)、OPENSSL_CIPHER_DES(整数)、OPENSSL_CIPHER_3DES(整数)等。
curve_name 字符串 此函数 openssl_get_curve_names() 返回的曲线名称之一。
config 字符串 N/A 您可以根据需要更改 openssl.conf 中的配置,并在此处提供其路径。

返回值

如果没有任何错误,PHP openssl_pkey_new() 函数将返回一个资源标识符。如果密钥生成失败,它将返回 false。

PHP 版本

此函数适用于 PHP 5.0.0 以上版本。

示例 1

openssl_pkey_new() 的工作原理

<?php
   // Generate a new private (and public) key pair
   $privkey = openssl_pkey_new(array(
      "digest_alg"=>'md5',
      "private_key_bits" => 2048,
      "private_key_type" => OPENSSL_KEYTYPE_RSA,
   ));
   var_dump($privkey);
?>

这将产生以下结果

resource(2) of type (OpenSSL key)

示例 2

openssl_pkey_new() 和 openssl_pkey_get_details 的工作原理

<?php
   // Generate a new private (and public) key pair
   $privkey = openssl_pkey_new(array(
      "digest_alg"=>'md5',
      "private_key_bits" => 2048,
      "private_key_type" => OPENSSL_KEYTYPE_RSA,
   ));
   $key_details = openssl_pkey_get_details($privkey);
   print_r($key_details);
?>

这将产生以下结果

Array (
   [bits] => 2048
   [key] => -----BEGIN PUBLIC KEY-----
   MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1IGWxnWzICSkjrOVrYkw
   9EKpIhcAYbhaymiwQY/ii9d7hnuGhpjjitDxzFftGafL6XOFKOhgbO2yrcpFxRKu
   AY3t5wyUcqUJV6CNwV2Hipk90psUcTmK3+pcCzcqCKr7sLWlHI48lse92xane8Sf
   CATNNbr9vmqUaTZ9FQqWihm3o/rNGuZTwMSKvcKsVguFpwrEDJaSLP1nt7RSHGc+
   PixQSXp3PtQCH+S0CM9jt1jD9NkYXuuAlNbrsPm1fl2zAGR5Vh15evz5765lZ2mH
   LIZScfsO/qgai3R6foaBlJM5tiSeiVZgnnQDKFBi5XK2GhzDnKggJe4tdY7awTFm
   CQIDAQAB
   -----END PUBLIC KEY-----

   [rsa] => Array (
      [n] => ԁ��u� $��0�B�"a�Z�h�A��{�{��W���s�(�`l��E�����r�	W��]��=қq9��\7*���<�ǽ��{ğ�5��j�i6}
      �����S�Ċ�¬V��
      ���,�g��Rg>>,PIzw>���c�X��^뀔��~]�dyVyz��egi�,�Rq����tz~��9�$��V`�t(Pb�r�Ü� %�-u��1f	
         [e] => 
         [d] => F"��3��4��!K�yF��R�lY�9�]Ξ��A��@�f��~�<�YPєG��=��TkTP�rl�Mԓ{�lŮ^��!��q�˂�7�|�f��lE+#�@.�GIH�tS�R.mbc�U~��7&w�ݥ�P.Fe�ϨU�@��m��X�ECsemjI$@/�$l��)�8�@���c�w�NRo��+!'�.��fvT7�=n")LQ�sdš�%zZ��G��{�{�1A^��v��E
         [p] => �>u)��1bǰK�r��pHE��k���LBE��y�'�3-�/��Pd��jeFV1����?�.O���:�bl2�z�U�{��{��*��A���<�}m4��J�Y�'�f@���
         [q] => ߦz\��96�=��V]"k��2w��>�r�袤�6�/�-Z�_��8!Y��I��L���_3Ym���.p�֏^��>�I:��oZ��"��=��8���뻢1��:�
         [dmp1] => z"�TW*��Ƴm�$�HQ�$0��sa��j� #�
         P�*�P��Q�G\42�a�26(�5�K�7zj��xj7��@e�$.6��b�Dq]]I}�L�m�d��54)@:���#
         [dmq1] => +��4}��\dc�R�K�Bw�\�E6�����%_�m$3蚞9�Fh�D�uz��$�8HPK�ˇԁ^�K�k�]e�g�>ºX�"<ƌ�`ė��&,9E��MS"��¥�)
         [iqmp] => !��߷�=�z�=ܰ7��V�6q�~���3V��t�P�$��O�kgv��3=W\ѝm���	�J���5^�K��a�t��~��U�.��!�l�v�#��z*���	���r
      )
      [type] => 0
   )

示例 3

从 openssl_pkey_new() 读取公钥

<?php
   echo "The hash of Welcome to Tutorialspoint is - ". hash('crc32b', 'Welcome to Tutorialspoint');
?>

这将产生以下结果

-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArAWYwKIaf3uN1bwww4R8 51ifDPGsreqr9cV3J1gSKC8kaAEsAQaZ/6gQlDBsUGs4nE8zKgOlcdOV/JApgAdz +CwoLJUgmEUkLDxOcWaCIUVuHAiyBGJaRKZ+MASy7wRG8hb+INd0/zoQRGXk3+jf Fj6rvSinVg49C4RAkRtkEdNnH0G5s6cedV6ec30DouRTuEQ/Fgizf0qaVtQbAURP n+/LT9V8c4LMaCyID7caTQOXAEjQqD4ooXGkOzmcsp03j2/F+T2mSIQRtI1gGJkZ oCMGX/xRxh5uemCcC4jcshn45Ikmb/S7WFqTCOC0e8l8CiTZ5Rr8EKFgtwliMds8 pQIDAQAB -----END PUBLIC KEY-----

示例 4

将 openssl_pkey_new() 中的公钥存储到文件中

<?php
   // Generate a new private (and public) key pair

   $privkey = openssl_pkey_new(array(
      "digest_alg"=>'md5',
      "private_key_bits" => 2048,
      "private_key_type" => OPENSSL_KEYTYPE_RSA,
   ));
   $keydetails = openssl_pkey_get_details($privkey);

   // To save the public key to a file 
   file_put_contents('mypublic.key', $keydetails['key']);
?>

文件 mypublic.key 的内容是

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3QxA7vWIz+F5t12/fl0H
vyavVy/ZNZFWGK6BID/koYeVA2wKdXx9De3gn0hs4sSrN3aV58ctuxDVx36rKvYd
AjKHfnfh7NmXnCEeUE4SgUUe0UUleoEMtsPP2Q8BC1HUjcC6SyJQKZG0bQqQlnAb
HL7ou2TNsjA/SiJbPD+0OpsLAcW1c/DeoM+TAkZo0JIlgxjcJ5ZlEbJ0Mxv6m9XK
k3bbMYHtKmZl+fzfPNcxCuK8Djnm5mYVR9KX1L86m1jz2kUQT/+wW84QRnZ7G+z8
4rQ77sZvWiIwwO2JmUvIsYeUxEP6/keZbDRuyO/2tWk/VxqQry4+Ktix/M2/iKWo
QQIDAQAB
-----END PUBLIC KEY-----
php_function_reference.htm
广告