CSR を作成する

# openssl_csr_new

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

openssl_csr_new — CSR を作成する

### 説明

function openssl_csr_new(
array `$distinguished_names`,
#[\SensitiveParameter]?OpenSSLAsymmetricKey `&$private_key`,
?array `$options` = `null`,
?array `$extra_attributes` = `null`
): OpenSSLCertificateSigningRequest|bool

openssl_csr_new() は、新しい CSR を `distinguished_names` の情報に基づいて作成します。

> 注意: この関数を正しく動作させるには、正しい形式の openssl.cnf をインストールしておく必要があります。 詳細な情報は、インストールについてのセクション を参照ください。

### パラメータ

`distinguished_names`

  証明書に含まれる識別名 (Distinguished Name; DN)、または subject フィールド。 `distinguished_names` は、 キーが識別名 (DN) の属性名で、値が文字列 (単一の値の場合) ないし 配列 (複数の値を指定する必要がある場合) であるような連想配列です。

`private_key`

  `private_key` には、事前に openssl_pkey_new() （あるいはその他の openssl_pkey 系の関数）で作成した秘密鍵を設定します。 `null` も指定できます。`null` を指定した場合、 新しい秘密鍵が `options` の指定に基づいて生成され、指定された変数に代入されます。 これに対応する公開鍵が、CSR への署名に使用されます。

`options`

  デフォルトでは、システムの `openssl.conf` の設定に したがってリクエストが初期化されます。`options` のキー `config_section_section` を設定することで、この デフォルト項目を変更することが可能です。また、キー `config` に別の openssl 設定ファイルを指定することで別の設定を使用することも可能です。 もし `options` に以下の表のキーが存在すれば、それらは `openssl.conf` の対応する項目と同じ働きをします。

  設定の上書き
  `options` のキー | 型 | `openssl.conf` で同等の意味を持つ項目 | 説明
  --- | --- | --- | ---
  digest_alg | string | default_md | ダイジェストメソッド、または署名のハッシュ。 通常は openssl_get_md_methods() 関数のリストのうちのひとつです。
  x509_extensions | string | x509_extensions | x509 証明書を作成する際に使用する拡張モジュールを選択します
  req_extensions | string | req_extensions | CSR を作成する際に使用する拡張モジュールを選択します
  private_key_bits | int | default_bits | 秘密鍵を作成する際に使用するビット数を指定します
  private_key_type | int | none | 作成する秘密鍵の型を指定します。以下の定数 `OPENSSL_KEYTYPE_DSA`, `OPENSSL_KEYTYPE_DH` `OPENSSL_KEYTYPE_RSA` あるいは `OPENSSL_KEYTYPE_EC` からひとつ選択します。 デフォルト値は `OPENSSL_KEYTYPE_RSA` です。
  encrypt_key | bool | encrypt_key | （パスフレーズとともに）エクスポートされるキーを暗号化するか?
  encrypt_key_cipher | int | none | 暗号定数のうちの一つ。
  curve_name | string | none | openssl_get_curve_names() のうちの一つ。
  config | string | N/A | 代替の openssl.conf ファイルのパス

`extra_attributes`

  `extra_attributes` は、CSR へ 追加の属性を設定するために使用します。これは連想配列で、 キーを OID に変換して CSR の属性として適用されます。

### 戻り値

成功した場合、CSR を返します。 CSR の作成に成功したものの、署名に失敗した場合は `true` を返します。 失敗した場合に `false` を返します。

### 変更履歴

バージョン | 説明
--- | ---
8.4.0 | `distinguished_names` の連想配列は、配列を値としてサポートするようになりました。 これにより、単一の属性に対して複数の値を指定できるようになりました。
8.4.0 | `extra_attributes` 引数は、CSR の属性を正しく設定するようになりました。 これまでは、subject の識別名を誤って変更してしまっていました。
8.0.0 | 成功した場合に、この関数は OpenSSLCertificateSigningRequest クラスのインスタンスを返すようになりました。 これより前のバージョンでは、 `OpenSSL X.509 CSR` 型のリソースが返されていました。
8.0.0 | `private_key` は、 OpenSSLAsymmetricKey クラスのインスタンスを受け入れるようになりました。 これより前のバージョンでは、 `OpenSSL key` 型のリソースを受け入れていました。
7.1.0 | `options` が、新たに `curve_name` をサポートしました。

### 例

例1 自己署名証明書の作成

    <?php
    // SSLサーバー証明書では、commonName はセキュアにするドメインです。
    // S/MIME 電子メール証明書では、 commonName は電子メールアドレスのオーナーです。
    // location と identification フィールドは、セキュアにするドメイン
    // または電子メールのオーナーを参照します。
    $dn = array(
        "countryName" => "GB",
        "stateOrProvinceName" => "Somerset",
        "localityName" => "Glastonbury",
        "organizationName" => "The Brain Room Limited",
        "organizationalUnitName" => "PHP Documentation Team",
        "commonName" => "Wez Furlong",
        "emailAddress" => "wez@example.com"
    );

    // 新しい 秘密鍵(と公開鍵の) キーペアを生成します
    $privkey = openssl_pkey_new(array(
        "private_key_bits" => 2048,
        "private_key_type" => OPENSSL_KEYTYPE_RSA,
    ));

    // CSR を生成します
    $csr = openssl_csr_new($dn, $privkey, array('digest_alg' => 'sha256'));

    // 自己署名の証明書を生成します。365日有効です
    $x509 = openssl_csr_sign($csr, null, $privkey, $days=365, array('digest_alg' => 'sha256'));

    // 秘密鍵、CSR と自己署名証明書をあとで使うために保存します。
    openssl_csr_export($csr, $csrout) and var_dump($csrout);
    openssl_x509_export($x509, $certout) and var_dump($certout);
    openssl_pkey_export($privkey, $pkeyout, "mypassword") and var_dump($pkeyout);

    // 起きたエラーを表示します。
    while (($e = openssl_error_string()) !== false) {
        echo $e . "\n";
    }
    ?>

例2 自己署名の ECC 証明書を作成する (PHP 7.1.0 以降)

    <?php
    $subject = array(
        "commonName" => "docs.php.net",
    );

    // 新しい 秘密鍵(と公開鍵の) キーペアを生成します
    $private_key = openssl_pkey_new(array(
        "private_key_type" => OPENSSL_KEYTYPE_EC,
        "curve_name" => 'prime256v1',
    ));

    // CSR を生成します
    $csr = openssl_csr_new($subject, $private_key, array('digest_alg' => 'sha384'));

    // 自己署名のEC証明書を生成します。
    $x509 = openssl_csr_sign($csr, null, $private_key, $days=365, array('digest_alg' => 'sha384'));
    openssl_x509_export_to_file($x509, 'ecc-cert.pem');
    openssl_pkey_export_to_file($private_key, 'ecc-private.key');
    ?>

### 参考

- openssl_csr_sign() - CSR に他の証明書（あるいは自分自身）で署名して証明書を作成する

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open