PHP Conference Japan 2024

OpenSSL

添加注释

用户贡献的注释 2 条注释

bdh dot hall at gmail dot com
15 年前
我当时很难找到关于使用私钥/公钥系统进行异步加密/解密的帮助,而我必须为创建使用循环计费的信用卡模块而使用它。

对于这种情况,使用普通的、“同步”或双向加密简直是愚蠢的,因此整个 mcrypt 库将无济于事。

但事实证明,OpenSSL 非常易于使用……然而,它的文档如此稀少,以至于看起来它会非常困难。

因此,我与您分享我一天的破解成果 - 希望您觉得它有用!



<?php

if (isset($_SERVER['HTTPS']) )
{
echo
"安全连接: 此页面正在通过安全连接访问。<br><br>";
}
else
{
echo
"非安全连接: 此页面正在通过非安全连接访问。<br><br>";
}

// 创建密钥对
$res=openssl_pkey_new();

// 获取私钥
openssl_pkey_export($res, $privatekey);

// 获取公钥
$publickey=openssl_pkey_get_details($res);
$publickey=$publickey["key"];

echo
"私钥:<BR>$privatekey<br><br>公钥:<BR>$publickey<BR><BR>";

$cleartext = '1234 5678 9012 3456';

echo
"明文:<br>$cleartext<BR><BR>";

openssl_public_encrypt($cleartext, $crypttext, $publickey);

echo
"密文:<br>$crypttext<BR><BR>";

openssl_private_decrypt($crypttext, $decrypted, $privatekey);

echo
"解密后的文本:<BR>$decrypted<br><br>";
?>

非常感谢文档中其他贡献者,使这个过程不那么痛苦。

请注意,您需要使用这些函数生成密钥一次 - 将您的私钥离线保存以进行解密,并将您的公钥放在您的脚本/配置文件中。如果您的数据泄露,您无需担心加密数据或公钥,只有私钥和明文才是真正重要的。

祝您好运!
koen dot thomeer at pubmed dot be
16 年前
要使用 OCSP 检查客户端证书的状态,可以使用此脚本

<?php
// 用户变量:
$dir = '/path/to/temp/'; // Apache 可以访问的目录 (chmod 777)。
$RootCA = '/path/to/Root.cer'; // 指向 PEM 格式的根 CA。
$OCSPUrl = 'http://ocsp.url'; // 指向 OCSP URL
// 脚本:
$a = rand(1000,99999); // 如果您期望在一秒钟内有更多页面点击,则需要此项!
file_put_contents($dir.$a.'cert_i.pem', $_SERVER['SSL_CLIENT_CERT_CHAIN_0']); // 发行者证书。
file_put_contents($dir.$a.'cert_c.pem', $_SERVER['SSL_CLIENT_CERT']); // 客户端(认证)证书。
$output = shell_exec('openssl ocsp -CAfile '.$RootCA.' -issuer '.$dir.$a.'cert_i.pem -cert '.$dir.$a.'cert_c.pem -url '.$OCSPUrl);
$output2 = preg_split('/[\r\n]/', $output);
$output3 = preg_split('/: /', $output2[0]);
$ocsp = $output3[1];
echo
"OCSP 状态: ".$ocsp; // 将会是 "良好"、"已吊销" 或 "未知"
unlink($dir.$a.'cert_i.pem');
unlink($dir.$a.'cert_c.pem');
?>

它可以得到改进,但这只是一个开始!

通常,您可以从客户端证书中提取 ocsp url。此外,OCSP 请求仅包含发行者名称的哈希值、发行者密钥的哈希值和客户端证书的序列号。所有三个都可以直接从客户端证书中提取。
To Top