CXII. OpenSSL 関数

導入

このモジュールは、署名の生成および認証、そして、データのシール (暗号化)およびオープン(復号化)を行うために、 OpenSSL の関数を使用します。 OpenSSL は多くの機能を提供しますが、これらはまだこのモジュールでは サポートされていません。これらのいくつかは将来的に追加される可能性が あります。

要件

OpenSSL 関数を使用するためには、OpenSSL パッケージがインストール されていることを要します。 PHP のバージョン 4.0.5 から 4.3.1 までは、OpenSSL >= 0.9.5 で動作します。他のバージョン(PHP <=4.0.4 および >= 4.3.2) では OpenSSL >= 0.9.6 を必要とします。

警告

最新のバージョンの OpenSSL を使用するようにしてください。 さもないと、Web サーバへの攻撃に対しての脆弱性をかかえてしまいます。

インストール手順

PHP の OpenSSL サポートを使用するには、--with-openssl[=DIR] を指定して PHP を コンパイルする必要があります。

Win32 ユーザへの注意: この拡張モジュールを動作させるには、 Windows システムの PATH が通った場所に DLL ファイルが存在する必要があります。 FAQ の "Windows で PHP のディレクトリを PATH に追加するにはどうすればいいのですか?" で、その方法を説明しています。 DLL ファイルを PHP のフォルダから Windows のシステムディレクトリにコピーしても動作します (システムディレクトリは、デフォルトで PATH に含まれるからです) が、これは推奨しません。 この拡張モジュールを使用するには、以下のファイルが PATH の通った場所にある必要があります。 libeay32.dll

Win32 ユーザへの注意: 加えてキー生成およびサイン認証関数を使用する計画がある場合、 システムに 有効な openssl.cnf をインストールする 必要があります。PHP 4.3.0 以降、Win32 バイナリ配布版の openssl フォルダに サンプル設定ファイルが含まれています。 PHP 4.2.0 以降を使用しておりこのファイルがない場合、 OpenSSLのホームページから入手するか PHP 4.3.0 のリリース版をダウンロードし、それらに含まれる 設定ファイルを使用することができます。

PHP は、 以下のロジックにより openssl.cnf を探します。

  • 環境変数 OPENSSL_CONF が設定された場合、 設定ファイルの(ファイル名を含む)パスとして使用されます。

  • 環境変数 SSLEAY_CONF が設定された場合、 設定ファイルの(ファイル名を含む)パスとして使用されます。

  • ファイル openssl.cnf はデフォルトの認証エリアに あることが仮定され、openssl DLL がコンパイルされた時間で設定されます。 通常、デフォルトのファイル名が c:\usr\local\ssl\openssl.cnf であることを 意味します。

インストール時に、設定ファイルを c:\usr\local\ssl\openssl.cnf または 他の場所にインストールし、(例えば仮想ホスト毎に)環境変数に設定ファ イルの場所を指定するかを選ぶ必要があります。 設定ファイルを必要とする関数の configargs に より、デフォルトのパスを上書きすることが可能であることに注意してください。

実行時設定

設定ディレクティブは定義されていません。

キー/証明書パラメータ

OpenSSL 関数のうち、キーまたは証明書パラメータを必要とするものは ごく一部です。PHP 4.0.5 より以前では、openssl_get_xxx 関数により り返されたキーまたは証明書リソースを使用する必要がありました。 これより後のバージョンでは、次の方法のどれかを使用することが 可能となる予定です。

  • 証明書

    1. openssl_x509_read() から返された X.509 リソース。

    2. file://path/to/cert.pem 形式の文字列。 このファイルは、PEM エンコードされた証明書である必要があります。

    3. PEMエンコードされた証明書の内容を含む文字列。

  • 公開鍵/秘密鍵

    1. openssl_get_publickey() あるいは openssl_get_privatekey() から返された キーリソース。

    2. 公開鍵のみ: X.509リソース。

    3. file://path/to/file.pem 形式の文字列。- このファイルは、PEM エンコードされた証明書/秘密鍵である 必要があります(両方を含むことも可能です)。

    4. PEM エンコードされた証明書/キーの内容を含む文字列

    5. 秘密鍵については array($key, $passphrase) という構文を使用することも可能です。 ただし、$key は file:// または上記のテキスト表現形式を使用 して指定したキー、$passphrase はその秘密鍵に関するパスワードを 有する文字列を表します。

証明書の認証

サイン/証明書を認証する関数をコールする際、 cainfo パラメータは、ファイルと認証済みの CA ファイルの場所を指定するファイルディレクトリ名を含む配列です。 ディレクトリが指定された場合、openssl コマンドが 使用できるような正しい形式にハッシュされたディレクトリである必要が あります。

定義済み定数

以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。

目的を調べるフラグ

X509_PURPOSE_SSL_CLIENT (integer)

X509_PURPOSE_SSL_SERVER (integer)

X509_PURPOSE_NS_SSL_SERVER (integer)

X509_PURPOSE_SMIME_SIGN (integer)

X509_PURPOSE_SMIME_ENCRYPT (integer)

X509_PURPOSE_CRL_SIGN (integer)

X509_PURPOSE_ANY (integer)

パディングフラグ

OPENSSL_PKCS1_PADDING (integer)

OPENSSL_SSLV23_PADDING (integer)

OPENSSL_NO_PADDING (integer)

OPENSSL_PKCS1_OAEP_PADDING (integer)

キーの型

OPENSSL_KEYTYPE_RSA (integer)

OPENSSL_KEYTYPE_DSA (integer)

OPENSSL_KEYTYPE_DH (integer)

PKCS7 フラグ/定数

S/MIME 関数はビットフィールドを使用して指定したフラグを使用します。 このビットフィールドには、以下の値を一つ以上含むことが可能です。

表 1. PKCS7 定数

定数説明
PKCS7_TEXT text/plain content type ヘッダを暗号化/署名されたメッセージに 追加します。復号化または認証を行う際には、このヘッダは出力から 取り除かれます。復号化または認証されたメッセージがMIME 型 text/plain でない場合、エラーとなります。
PKCS7_BINARY 通常は、入力されたメッセージは CR および LF を行端として使用した 「正規化」された形式に変換されます。こらは、S/MIME の規格に 基づくものです。このオプションが指定された場合、変換は行われません。 この機能は、MIME 形式でないバイナリデータを処理する際に 便利です。
PKCS7_NOINTERN メッセージを認証する際に、通常、メッセージに含まれる証明書が 証明書にサインする際に検索されます。 このオプションでは、 openssl_pkcs7_verify()extracerts パラメータで指定した証明書 のみが使用されます。しかし、指定された証明書を信頼されていな い CA として使用することも可能です。
PKCS7_NOVERIFY サインつきメッセージをサインした証明書の署名について 検証しません。
PKCS7_NOCHAIN サインを行った側の証明書の認証の連鎖を行いません。 この場合、サイン付きのメッセージにある証明書を未認証の CA として使用しません。
PKCS7_NOCERTS メッセージにサインする際、通常はサインをする人の証明書が挿入 されますが、このオプションを指定した場合はそうなりません。これに よりサイン付きのメッセージのサイズは小さくなりますが、認証 側が(例えば、openssl_pkcs7_verify()extracerts を用いて渡すことにより) サインをした人の証明書のコピーをローカルに用意する必要があります。
PKCS7_NOATTR 通常、メッセージがサインされる時、サインした時間やサポートされる 対象アルゴリズムを含む一連の属性が付加されます。このオプションを 指定した場合、それらの属性は付加されません。
PKCS7_DETACHED メッセージにサインをする際、MIME型 multipart/signed を指定して クリアテキストでサインを行います。これは、 openssl_pkcs7_sign() において フラグを指定しなかった場合の flags パラメータのデフォルトです。このオプションをオフにした場合、 メッセージは不透明なサインによりサインされます。これは、 メールリレイによる変換に対してより耐性がありますが、S/MIME を サポートしないメールエージェントでは読むことはできません。
PKCS7_NOSIGSメッセージにサインや認証を試みません。

注意: これらの定数は、4.0.6 で追加されました。

署名アルゴリズム

OPENSSL_ALGO_SHA1 (integer)

openssl_sign() および openssl_verify() のデフォルトアルゴリズムとして用いられます。

OPENSSL_ALGO_MD5 (integer)

OPENSSL_ALGO_MD4 (integer)

OPENSSL_ALGO_MD2 (integer)

注意: これらの定数は、5.0.0 で追加されました。

暗号化方式

OPENSSL_CIPHER_RC2_40 (integer)

OPENSSL_CIPHER_RC2_128 (integer)

OPENSSL_CIPHER_RC2_64 (integer)

OPENSSL_CIPHER_DES (integer)

OPENSSL_CIPHER_3DES (integer)

注意: これらの定数は、4.3.0 で追加されました。

バージョン定数

OPENSSL_VERSION_TEXT (string)

OPENSSL_VERSION_NUMBER (integer)

注意: これらの定数は、5.2.0 で追加されました。

目次
openssl_csr_export_to_file -- CSR をファイルにエクスポートする
openssl_csr_export -- CSR を文字列としてエクスポートする
openssl_csr_get_public_key -- CERT の公開鍵を返す
openssl_csr_get_subject -- CERT の subject を返す
openssl_csr_new -- CSR を作成する
openssl_csr_sign -- 他の CERT(あるいは自分自身)で証明書をサインする
openssl_error_string -- OpenSSL エラーメッセージを返す
openssl_free_key -- キーリソースを開放する
openssl_get_privatekey -- openssl_pkey_get_private() のエイリアス
openssl_get_publickey -- openssl_pkey_get_public() のエイリアス
openssl_open -- シール(暗号化)されたデータをオープン(復号)する
openssl_pkcs7_decrypt -- S/MIME 暗号化されたメッセージを復号化する
openssl_pkcs7_encrypt -- S/MIME メッセージを暗号化する
openssl_pkcs7_sign -- S/MIME メッセージにサインする
openssl_pkcs7_verify -- S/MIME でサインされたメッセージの署名を検証する
openssl_pkey_export_to_file --  エクスポート可能な形式で、キーをファイルに取得する
openssl_pkey_export --  エクスポート可能な形式で、キーを文字列に取得する
openssl_pkey_free -- 秘密鍵を開放する
openssl_pkey_get_details -- キーの詳細 (bits, pkey, type) の配列を返す
openssl_pkey_get_private -- 秘密鍵を取得する
openssl_pkey_get_public -- 証明書から公開鍵を抽出し、使用できるようにする
openssl_pkey_new -- 新規に秘密鍵を生成する
openssl_private_decrypt -- 秘密鍵でデータを復号化する
openssl_private_encrypt -- 秘密鍵でデータを暗号化する
openssl_public_decrypt -- 公開鍵でデータを復号化する
openssl_public_encrypt -- 公開鍵でデータを暗号化する
openssl_seal -- データをシール(暗号化)する
openssl_sign -- 署名を生成する
openssl_verify -- 署名を検証する
openssl_x509_check_private_key -- 秘密鍵が証明書に対応するかを確認する
openssl_x509_checkpurpose --  証明書が特定の目的に使用可能かどうか確認する
openssl_x509_export_to_file -- 証明書をファイルにエクスポートする
openssl_x509_export -- 証明書を文字列としてエクスポートする
openssl_x509_free -- 証明書リソースを開放する
openssl_x509_parse --  X509 証明書をパースし、配列として情報を返す
openssl_x509_read --  Parse an X.509 証明書をパースし、リソースIDを返す