php实现ssl加密
PHP 实现 SSL 加密的方法
使用 OpenSSL 扩展
PHP 内置的 OpenSSL 扩展可以用于 SSL 加密和解密。确保 php.ini 中已启用 OpenSSL 扩展(取消注释 extension=openssl)。
生成密钥对:
$config = array(
"digest_alg" => "sha512",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
$res = openssl_pkey_new($config);
openssl_pkey_export($res, $privateKey);
$publicKey = openssl_pkey_get_details($res)["key"];
加密数据:
$data = "敏感数据";
openssl_public_encrypt($data, $encrypted, $publicKey);
$encryptedBase64 = base64_encode($encrypted); // 便于传输
解密数据:
openssl_private_decrypt(base64_decode($encryptedBase64), $decrypted, $privateKey);
使用 cURL 发起 HTTPS 请求
通过 cURL 与支持 SSL 的服务器通信时,默认会验证证书。如需跳过验证(仅测试环境使用):
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/api");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁用证书验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 禁用主机名验证
$response = curl_exec($ch);
curl_close($ch);
生产环境中应启用验证并指定 CA 证书路径:
curl_setopt($ch, CURLOPT_CAINFO, "/path/to/cacert.pem");
配置 Web 服务器 SSL
在 Apache 或 Nginx 中部署 SSL 证书后,PHP 应用自动通过 HTTPS 运行。检查当前协议:
if ($_SERVER['HTTPS'] !== 'on') {
header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
exit();
}
数据库连接加密
MySQLi 或 PDO 连接时启用 SSL:
$mysqli = new mysqli(
'host',
'user',
'password',
'database',
null,
'/path/to/client-key.pem',
'/path/to/client-cert.pem',
'/path/to/ca-cert.pem'
);
PDO 示例:
$pdo = new PDO(
'mysql:host=host;dbname=database',
'user',
'password',
array(
PDO::MYSQL_ATTR_SSL_KEY => '/path/to/client-key.pem',
PDO::MYSQL_ATTR_SSL_CERT => '/path/to/client-cert.pem',
PDO::MYSQL_ATTR_SSL_CA => '/path/to/ca-cert.pem'
)
);
注意事项
- 生产环境必须使用有效证书,避免自签名证书。
- 定期更新私钥和证书,遵循密钥轮换策略。
- 敏感操作(如支付)强制使用 HTTPS,通过 HSTS 头增强安全性:
header("Strict-Transport-Security: max-age=63072000; includeSubDomains; preload");







