• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • openssl_csr_sign()

    (PHP 4 >= 4.2.0, PHP 5, PHP 7)

    用另一个证书签署 CSR(或者本身)并且生成一个证书

    说明

    openssl_csr_sign(mixed $csr, mixed $cacert, mixed $priv_key,int $days[,array $configargs[,int $serial= 0]]): resource

    openssl_csr_sign()从给定的 CSR 生成一个x509证书资源

    Note:必须安装有效的openssl.cnf以保证此函数正确运行。参考有关安装的说明以获得更多信息。

    参数

    $csr

    由openssl_csr_new()函数生成的CSR.也可以是由类似file://path/to/csr格式指定的指向PEM编码的CSR路径,或者是一个由openssl_csr_export()函数生成的字符串。

    $cacert

    生成的证书将由$cacert签名。如果$cacertNULL,生成的证书将是自签名证书。

    $priv_key

    $priv_key$cacert证书对应的私钥。

    $days

    $days指定生成的证书在几天内有效的时间长度。

    $configargs

    你可以通过$configargs确定CSR签名。查看openssl_csr_new()方法获取$configargs的更多相关信息。

    $serial

    可选的发行证书编号。如果没有指定默认值为0.

    返回值

    成功,返回一个 x509 证书资源,失败则返回FALSE.

    范例

    openssl_csr_sign() example - signing a CSR(how to implement your own CA)

    <?php
    // Let's assume that this script is set to receive a CSR that has
    // been pasted into a textarea from another page
    $csrdata = $_POST["CSR"];
    // We will sign the request using our own "certificate authority"
    // certificate.  You can use any certificate to sign another, but
    // the process is worthless unless the signing certificate is trusted
    // by the software/users that will deal with the newly signed certificate
    // We need our CA cert and its private key
    $cacert = "file://path/to/ca.crt";
    $privkey = array("file://path/to/ca.key", "your_ca_key_passphrase");
    $usercert = openssl_csr_sign($csrdata, $cacert, $privkey, 365, array('digest_alg'=>'sha256') );
    // Now display the generated certificate so that the user can
    // copy and paste it into their local configuration (such as a file
    // to hold the certificate for their SSL server)
    openssl_x509_export($usercert, $certout);
    echo $certout;
    // Show any errors that occurred here
    while (($e = openssl_error_string()) !== false) {
        echo $e . "\n";
    }
    ?>
    
    config_section_section is incorrect. The correct keyword to use is "config_section_name".
    Here is an sample how to create valid X.509 Public and Private Key (cert/key).
    When not using self signed the 4.2.1 segault. You need the CVS code at least for openssl.
    <?
    Header("Content-Type: text/plain");
    $CA_CERT = "CA.cert.pem";
    $CA_KEY = "CA.key.pem";
    $req_key = openssl_pkey_new();
    if(openssl_pkey_export ($req_key, $out_key)) {
        $dn = array(
            "countryName"      => "DE",
            "stateOrProvinceName"  => "Frankfurt",
            "organizationName"    => "smcc.net",
            "organizationalUnitName" => "E-Mail",
            "commonName"       => "Testcert"
            );
        $req_csr = openssl_csr_new ($dn, $req_key);
        $req_cert = openssl_csr_sign($req_csr, "file://$CA_CERT", "file://$CA_KEY", 365);
        if(openssl_x509_export ($req_cert, $out_cert)) {
            echo "$out_key\n";
            echo "$out_cert\n";
            }
        else  echo "Failed Cert\n";
        }
    else      echo "FailedKey\n";
    ?>
    
    To generate a self-signed certificate, pass NULL as the signing certificate (2nd parameter). For example:
    $req_key = openssl_pkey_new();
    $dn = array(
      "countryName" => "US",
      "stateOrProvinceName" => "Colorado",
      "organizationName" => "yPass.net",
      "organizationalUnitName" => "yPass.net",
      "commonName" => "yPass.net Root Certificate"
    );
    $req_csr = openssl_csr_new($dn, $req_key);
    $req_cert = openssl_csr_sign($req_csr, NULL, $req_key, 365);
    You can use file_get_contents() to directly pass the content instead of giving file paths.
    Also, if you get an error "sec_error_reused_issuer_and_serial", put a serial into the last parameter:
    <?php
    $privkey = array(file_get_contents('ca.key'),"your_ca_key_passphrase");
    $usercert = openssl_csr_sign($csrdata, file_get_contents('ca.crt'),$privkey,365,NULL,'06');
    openssl_x509_export($usercert,$certout);
    file_put_contents('serverCASigned.crt',$certout);
    ?>
    In that above example the serial was "06".