讲师中心 微信公众号
AI工具推荐 视频效率加速

PHP怎么生成OpenSSL密钥对_PHP生成OpenSSL密钥对技巧【技巧】

星萱小哥_1799

星萱小哥_1799

发布时间:2026-02-05 11:43:02

|

262人浏览过

|

来源于php中文网

原创

openssl_pkey_new() 是 PHP 原生生成 RSA 密钥对最直接方式,需显式设置 private_key_bits≥2048(推荐 4096)和 private_key_type=OPENSSL_KEYTYPE_RSA,再通过 openssl_pkey_export() 和 openssl_pkey_get_details() 分别导出 PEM 格式私钥与公钥。

php怎么生成openssl密钥对_php生成openssl密钥对技巧【技巧】

用 openssl_pkey_new() 生成密钥对最直接

PHP 原生支持 OpenSSL 密钥生成,openssl_pkey_new() 是最常用、最可控的方式。它返回一个资源(resource),后续可导出私钥和公钥。

关键点在于传入配置参数:不指定配置时默认生成 1024 位 RSA 密钥(已不安全),必须显式设置 private_key_bits 和 private_key_type:

  • private_key_bits 至少设为 2048,推荐 4096
  • private_key_type 显式设为 OPENSSL_KEYTYPE_RSA(PHP 8.0+ 默认仍是 RSA,但显式声明更稳妥)
  • 若需 ECC 密钥,改用 OPENSSL_KEYTYPE_EC 并配合 curve_name(如 secp384r1)

示例:

$config = [
    'private_key_bits' => 4096,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
];
$resource = openssl_pkey_new($config);
if (!$resource) {
    throw new RuntimeException('密钥生成失败:' . openssl_error_string());
}

导出 PEM 格式密钥时注意密码和格式

生成的资源不能直接使用,需用 openssl_pkey_export() 和 openssl_pkey_get_details() 分别导出私钥(含可选密码)和提取公钥。

立即学习“PHP免费学习笔记(深入)”;

常见疏漏:

page-agent 浏览器控制(CDP)
page-agent 浏览器控制(CDP)

使用 page-agent CLI(CDP)控制浏览器;CLI只能通过 GitHub Release 的 .tgz 安装,npm 官方包暂未发布。

下载
  • openssl_pkey_export() 第二个参数是引用变量,不是返回值;第三个参数是密码(null 表示无密码,空字符串 '' 会被当作真实密码处理)
  • 公钥不能从私钥字符串“截取”,必须用 openssl_pkey_get_details() 获取 key 字段,否则可能导出错误格式(如 ASN.1 DER 而非 PEM)
  • PEM 公钥以 -----BEGIN PUBLIC KEY----- 开头,不是 -----BEGIN RSA PUBLIC KEY-----(后者是 PKCS#1,兼容性差)

导出片段:

$privateKey = '';
openssl_pkey_export($resource, $privateKey, null, $config);

$details = openssl_pkey_get_details($resource);
$publicKey = $details['key']; // 这才是标准 PEM 公钥

命令行 openssl genrsa 与 PHP 的差异要清楚

有人倾向用 exec('openssl genrsa ...'),这在某些共享主机上可能是唯一选择,但有明显限制:

  • 无法在内存中完成全流程,私钥会落地到文件,增加泄露风险
  • 密码保护用的是 -aes256 等参数,PHP 侧无法直接解密——openssl_pkey_get_private() 不支持从带密码的 PKCS#1 私钥(即 genrsa 默认输出)中加载,必须先转成 PKCS#8:openssl pkcs8 -topk8 -in key.pem -out key_pkcs8.pem -v2 aes256
  • PHP 8.0+ 对 openssl_pkey_get_private() 加载加密私钥的支持仍有限,容易报 failed to load private key

结论:除非环境强制限制,否则优先用 PHP 原生函数,控制力更强、路径更清晰。

私钥权限和存储是实际部署中最容易翻车的地方

生成后的私钥字符串本质是敏感凭据,PHP 层面做完导出只是第一步:

  • 写入文件时,务必用 chmod 600 设置权限(PHP 中可用 chmod($file, 0600)),尤其在 CLI 或 Web 服务共用账户时
  • 避免把私钥硬编码进配置文件或数据库;如需持久化,应由部署流程注入,或使用密钥管理服务(如 HashiCorp Vault)动态获取
  • Web 环境下切勿通过 HTTP 响应输出私钥内容,即使是一次性调试——浏览器缓存、代理日志、CDN 都可能留存

真正麻烦的从来不是“怎么生成”,而是“生成之后怎么不把它搞丢、不让人拿到”。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.12.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1778

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2804

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6144

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5869

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7494

2024.03.22

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn