文档中心
PHP涔熻兘鑷埗SSL璇佷功锛熸墜鎶婃墜鏁欎綘鐢≒HP鐢熸垚鑷鍚嶈瘉涔?txt
时间 : 2025-09-27 16:29:41浏览量 : 3
什么是SSL证书?

SSL证书就像网站的"身份证",它让浏览器和服务器之间能建立加密连接。当你在浏览器地址栏看到那个小锁图标时,就说明这个网站使用了SSL证书。常见的商业SSL证书由权威机构颁发,但其实我们也可以用PHP自己制作一个"自签名"的证书。
为什么需要自制SSL证书?
1. 本地开发测试:开发HTTPS应用时,不想花钱买正式证书
2. 内部系统:公司内网系统只需内部信任
3. 学习原理:了解SSL/TLS底层工作机制
> 注意:自签名证书不适合生产环境使用,浏览器会显示"不安全"警告。正式网站还是应该购买正规CA颁发的证书。
PHP生成SSL证书的4个步骤
1. 准备工作
确保你的PHP环境安装了OpenSSL扩展:
```php
if (!extension_loaded('openssl')) {
die('OpenSSL扩展未安装!');
}
?>
```
2. 生成私钥
私钥就像保险箱的钥匙,必须严格保密:
$config = array(
"private_key_bits" => 2048, // RSA密钥长度
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
// 生成私钥
$privateKey = openssl_pkey_new($config);
// 将私钥保存到文件
openssl_pkey_export_to_file($privateKey, 'private.key');
3. 创建CSR(证书签名请求)
CSR包含你的网站信息,相当于"办证申请表":
$dn = array(
"countryName" => "CN", // 国家代码
"stateOrProvinceName" => "Beijing", // 省份
"localityName" => "Beijing", // 城市
"organizationName" => "My Company", // 组织名
"organizationalUnitName" => "IT Department", // 部门
"commonName" => "localhost", // 域名(重要!)
"emailAddress" => "[email?protected]" // 邮箱
// 生成CSR
$csr = openssl_csr_new($dn, $privateKey);
// CSR保存到文件
openssl_csr_export_to_file($csr, 'domain.csr');
4. 自签名生成证书
因为我们是自己签发,所以不需要CA机构:
$certificate = openssl_csr_sign(
$csr,
null, // CA证书(自签所以为null)
$privateKey,
365 // 有效期(天)
// CRT保存到文件
openssl_x509_export_to_file($certificate, 'domain.crt');
SSL实际应用示例
Nginx配置示例
```nginx
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /path/to/domain.crt;
ssl_certificate_key /path/to/private.key;
...其他配置...
Apache配置示例
```apacheconf
ServerName localhost
SSLEngine on
SSLCertificateFile "/path/to/domain.crt"
SSLCertificateKeyFile "/path/to/private.key"
PHP验证客户端证书示例
有时我们需要客户端也提供证书进行双向认证:
// Web服务器需要配置验证客户端证书
if (!empty($_SERVER['SSL_CLIENT_CERT'])) {
$clientCert = $_SERVER['SSL_CLIENT_CERT'];
} elseif (!empty($_SERVER['HTTP_SSL_CLIENT_CERT'])) {
$clientCert = $_SERVER['HTTP_SSL_CLIENT_CERT'];
if (isset($clientCert)) {
$certInfo = openssl_x509_parse($clientCert);
echo "客户端认证成功!用户来自:" . $certInfo['subject']['CN'];
} else {
header('HTTP/1.0 403 Forbidden');
die("需要提供有效的客户端证书");
SSL安全最佳实践
1. 密钥长度:至少2048位(RSA),推荐3072位以上更安全
2. 算法选择:避免使用SHA-1等老旧算法
3. 有效期:不宜过长(建议不超过1年)
4. 密钥保护:私钥文件权限设置为600
PHP OpenSSL函数速查表
|函数|用途|示例|
||||
|`openssl_pkey_new()`|生成新密钥对|`$key = openssl_pkey_new(["private_key_bits"=>2048])`|
|`openssl_csr_new()`|创建CSR请求|`$csr = openssl_csr_new($dn,$privKey)`|
|`openssl_csr_sign()`|签署CSR生成证书|`$cert=openssl_csr_sign($csr,null,$privKey,365)`|
|`openssl_x509_parse()`|解析X509证书信息|`print_r(openssl_x509_parse(file_get_contents('cert.crt')))`|
FAQ常见问题解答
Q: Windows下运行报错找不到OpenSSL?
A: Windows需要安装OpenSSL并设置系统PATH路径
Q: Chrome提示不安全怎么办?
A: Chrome默认不信任自签证书,可以手动导入到受信任根CA
Q: Let's Encrypt不是免费的吗?为什么还要自签?
A: Let's Encrypt适合公网域名,内网或无域名环境适合自签
Q: PHP生成的能用于IIS吗?
A: IIS需要.pfx格式,可以用OpenSSL转换:
openssl pkcs12 -export -out domain.pfx -inkey private.key -in domain.crt
TAG:php制作ssl证书,phpstudy配置ssl证书,如何制作ssl证书,php生成证书图片,生成ssl证书