PHP生成证书cer(支持多域名单域名)

网络协议   2025-07-29 18:30   203   0  

配置证书参数

$dn = [
    "countryName"           => $organization['country'],               // 国家代码
    "stateOrProvinceName"   => $organization['state'],// 省份名称
    "localityName"          => $organization['city'],        // 城市名称
    "commonName"            => $this->domains[0],   // 通用名称 (通常是域名)
    "emailAddress"          => $organization['email']// 邮件地址
];
$csr = CertHandling::generateSSLKeys($dn,$this->domains);

生成csr

public static function generateSSLKeys($dn, $domains = [],$passphrase = null)
{
    // 生成配置选项
    $config = [
        "digest_alg" => "SHA256",
        "private_key_bits" => 2048, // 生成 2048 位的私钥
        "private_key_type" => OPENSSL_KEYTYPE_RSA, // 使用 RSA 算法
    ];
    // 生成私钥
    $privateKey = openssl_pkey_new($config);
    if (!$privateKey) {
        throw  new  BtException('Failed to generate private key: ' . openssl_error_string());
    }
    $publicKeyDetails = openssl_pkey_get_details($privateKey);
    // 提取私钥并导出
    openssl_pkey_export($privateKey, $privateKey, $passphrase);
    $publicKey = $publicKeyDetails['key'];
    // 处理 SAN(多个域名)
    $sanConfig = "";
    if (!empty($domains)) {
        foreach ($domains as $index => $domain) {
            $sanConfig .= "DNS.$index = $domain\n";
        }
    }
    // 创建 OpenSSL 配置文件(支持 SAN)
    $configFile = tempnam(sys_get_temp_dir(), 'openssl_');
    file_put_contents($configFile, <<<EOL
        [req]
        distinguished_name = req_distinguished_name
        req_extensions = v3_req
        [req_distinguished_name]
        [ v3_req ]
        subjectAltName = @alt_names
        [ alt_names ]
        $sanConfig
        EOL
    );
    //生成 CSR
    $csr = openssl_csr_new($dn, $privateKey, ["config" => $configFile]);
    unlink($configFile); // 删除临时文件
    if (!$csr) {
        throw new Exception('Failed to generate CSR: ' . openssl_error_string());
    }
    //导出 CSR
    openssl_csr_export($csr, $csrOut);
    // 返回私钥和 CSR
    return [
        "private_key" => $privateKey, // 私钥
        "public_key" => $publicKey,   // 公钥
        'csr' => $csrOut,
    ];
}


博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。