PHP OpenSSL是一款在PHP环境下使用的加密工具库,它提供了一系列的加密函数和公共密钥操作,常用于对数据进行加密、签名等安全处理。在实际应用中,使用OpenSSL生成证书是极为常见的操作之一,下面就让我们一起通过举例,来了解PHP OpenSSL生成证书的方法和使用。
一、证书生成概述
生成证书的过程主要是通过密钥对来完成,其流程如下:
1. 生成私钥
2. 生成公钥
3. 使用私钥签名数据
4. 验证签名(使用公钥和签名结果)
下面我们就以上述流程为例,来详细了解证书生成的过程。
二、生成私钥
在 OpenSSL 中,使用 genpkey 命令生成私钥,命令如下:
//创建私钥文件 $private_key = openssl_pkey_new(); //获取私钥内容 openssl_pkey_export($private_key, $privateKeyStr, null, CONFIG_RSA_PRIVATE_KEY_PASS); //生成p12证书密码 openssl_pkcs12_export($cert,cert.p12, $private_key, CONFIG_RSA_PRIVATE_KEY_PASS, array('friendly_name'=>'kooljee'));以上代码的含义是在PHP环境下使用OpenSSL的pkey_new函数,生成新的私钥,并将生成的私钥内容赋值给$privateKeyStr变量。这里的第四个参数$CONFIG_RSA_PRIVATE_KEY_PASS,是配置文件中的私钥密码,多数情况下开发人员需要进行配置。 三、生成公钥 在 OpenSSL 中,使用 req 命令生成证书文件,其中就包含了公钥。命令如下:
"req -new -x509 -days 36500 -key " . $private_Key_file . " -out $public_key_file -subj \"/C=CN/L=Shenzhen/O=kooljee Company/CN=www.kooljee.com\"";以上代码是通过PHP的exec命令,执行OpenSSL的req命令,其中 -x509 参数指明生成的是 X.509 格式的证书。$private_Key_file变量是指向私钥文件的路径,$public_Key_file变量是指向公钥文件的路径。很容易发现,此处生成的公钥文件路径即为证书路径。即,我们生成的证书是包含了公私钥对的,也可以称之为证书链。证书链的详细内容,我们将在下一节中进行讲解。 四、使用私钥签名数据 在实际应用中,签名的对象可以是数据、文件,等等。这里我们以数据签名为例。签名过程通过 hash 和 openssl_sign 函数来实现,具体代码如下:
$content = 'Content to be signed'; $signKeyPass = CONFIG_RSA_PRIVATE_KEY_PASS; $privateKey = openssl_pkey_get_private(file_get_contents($private_Key_file), $signKeyPass); openssl_sign($content, $signature, $privateKey, OPENSSL_ALGO_SHA256); openssl_free_key($privateKey);以上代码的含义是,使用具体数字内容进行签名,其中内容为$content。签名算法为SHA256(也可以使用更多的签名算法,比如SHA1、MD5等),签名结果存放在名为$signature的变量中。函数 openssl_pkey_get_private 通过私钥文件读取私钥,函数 openssl_free_key 则释放申请的私钥资源。 五、验证签名 上一节中我们通过私钥生成了签名,那么如何验证该签名是否真实有效呢?答案便是:公钥验证。具体验证代码如下:
$publicKey = openssl_pkey_get_public(file_get_content($public_key_file)); $verify = openssl_verify($content, $signature, $publicKey, OPENSSL_ALGO_SHA256); openssl_free_key($publicKey); if ($verify == -1) { //签名错误 echo 'Verify Error'; } else if ($verify == 1) { //签名正确 echo 'Verify Success'; } else { //签名不正确 echo 'Verify Failed'; }以上代码通过公钥和签名结果,完成了签名的验证过程。其中函数 openssl_pkey_get_public 同样是通过公钥文件读取公钥,函数 openssl_verify 则是执行验证过程。验证通过后,$verify 变量的值为 1,否则为非 1。我们也可以根据 $verify 变量的值,来判断签名验证是否成功。 作为 PHP 程序员,PHP OpenSSL 是值得一学习的工具库之一。本文根据实际需求,内容主要围绕生成证书展开,其中代码和解释有效地解决了不少开发者关于证书生成、密钥存储和签名验证等问题。相信大家阅读完毕后,对于证书生成和签名的使用有了更深入的理解,也能更加熟练地在开发过程中运用 OpenSSL 工具库,提高代码的安全性和可靠性。