Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】OPENSSL_ALGO_SHA256定数の使い方

OPENSSL_ALGO_SHA256定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

OPENSSL_ALGO_SHA256定数は、PHPのOpenSSL拡張機能において、SHA-256ハッシュアルゴリズムを指定するために用いられる定数です。定数とは、プログラム実行中に値が変わらない、特定の意味を持つ固定値のことです。

SHA-256は、Secure Hash Algorithm 256-bitの略で、入力されたあらゆる長さのデータから、常に固定長の256ビット(32バイト)の「ハッシュ値」と呼ばれるデータを生成する、一方向の暗号学的ハッシュ関数の一種です。このハッシュ値は、元のデータが少しでも変更されると全く異なる値になるという特性を持つため、データの「指紋」や「要約」として利用されます。

主な用途としては、データの改ざん検出や整合性の検証、デジタル署名の生成と検証などが挙げられます。例えば、PHPのopenssl_sign()関数やopenssl_verify()関数を使用する際に、このOPENSSL_ALGO_SHA256定数を引数として渡すことで、デジタル署名にSHA-256アルゴリズムを用いることを明示的に指定できます。これにより、署名されたデータの信頼性を保証し、不正な改ざんが行われていないかを確認することが可能になります。

この定数を使用することで、アルゴリズム名を直接文字列で記述する際に発生しやすいタイプミスを防ぎ、コードの可読性を高め、より安全で保守性の高いプログラムを作成することができます。システムにおけるデータのセキュリティと完全性を確保するための、基盤となる重要な要素の一つです。

構文(syntax)

1OPENSSL_ALGO_SHA256;

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

この定数は、SHA256 ハッシュアルゴリズムを表す整数値です。具体的には、OPENSSL_ALGO_SHA256 は 3 という整数値に定義されています。

サンプルコード

PHPで自己署名証明書を生成する

1<?php
2
3/**
4 * 自己署名SSL証明書を生成する関数
5 *
6 * この関数は、Webサーバーなどで使用できる自己署名SSL証明書と対応する秘密鍵を生成します。
7 * OPENSSL_ALGO_SHA256 定数を使用して、証明書に署名する際のハッシュアルゴリズムとしてSHA256を指定します。
8 * これは、証明書のセキュリティと整合性を保証するための暗号技術の一部であり、
9 * システム間の安全な通信基盤を構築する上で重要です。
10 *
11 * @param string $commonName 証明書のコモンネーム(通常はWebサイトのドメイン名、例: 'www.example.com')
12 * @param int $validityDays 証明書の有効期間(日数)
13 * @return array|false 成功した場合は、生成された証明書と秘密鍵のPEM形式文字列を含む配列。
14 *                     失敗した場合は false を返します。
15 */
16function generateSelfSignedCertificate(string $commonName = 'localhost', int $validityDays = 365)
17{
18    // 1. 秘密鍵の生成
19    // openssl_pkey_new() は、新しい公開鍵/秘密鍵のペアを生成します。
20    // 'private_key_bits' で鍵のビット長(セキュリティ強度)を、
21    // 'private_key_type' で鍵のタイプ(RSAが一般的)を指定します。
22    $privateKey = openssl_pkey_new([
23        "private_key_bits" => 2048, // 2048ビットは現代的なセキュリティ要件に適しています
24        "private_key_type" => OPENSSL_KEYTYPE_RSA,
25    ]);
26
27    if (!$privateKey) {
28        echo "エラー: 秘密鍵の生成に失敗しました。\n";
29        return false;
30    }
31
32    // 2. CSR (Certificate Signing Request: 証明書署名要求) の生成
33    // openssl_csr_new() は、証明書を発行するための情報(国、組織名、コモンネームなど)を記述したCSRを生成します。
34    // CSR自体も秘密鍵で署名されます。
35    $csrConfig = [
36        "countryName"           => "JP",
37        "stateOrProvinceName"   => "Tokyo",
38        "localityName"          => "Shinjuku",
39        "organizationName"      => "Example Co., Ltd.",
40        "organizationalUnitName" => "IT Department",
41        "commonName"            => $commonName,
42        "emailAddress"          => "webmaster@example.com",
43    ];
44    $csr = openssl_csr_new($csrConfig, $privateKey, [
45        'digest_alg' => 'sha256' // CSR自体のハッシュアルゴリズム
46    ]);
47
48    if (!$csr) {
49        echo "エラー: CSRの生成に失敗しました。\n";
50        openssl_pkey_free($privateKey); // 秘密鍵リソースを解放
51        return false;
52    }
53
54    // 3. 自己署名証明書の生成
55    // openssl_csr_sign() は、CSRと秘密鍵を使用して最終的な証明書を生成します。
56    // 第5引数で、この証明書に署名する際のハッシュアルゴリズムを指定します。
57    // ここで OPENSSL_ALGO_SHA256 を使用し、SHA256アルゴリズムで署名を行うことで、
58    // 業界標準のセキュリティレベルを確保します。
59    // 自己署名証明書の場合、$caCert には null を、 $caKey には $privateKey を渡します。
60    $certificate = openssl_csr_sign($csr, null, $privateKey, $validityDays, OPENSSL_ALGO_SHA256);
61
62    if (!$certificate) {
63        echo "エラー: 自己署名証明書の生成に失敗しました。\n";
64        openssl_csr_free($csr);     // CSRリソースを解放
65        openssl_pkey_free($privateKey); // 秘密鍵リソースを解放
66        return false;
67    }
68
69    // 生成された証明書と秘密鍵をPEM形式の文字列として取得
70    openssl_x509_export($certificate, $certificateOutput);
71    openssl_pkey_export($privateKey, $privateKeyOutput);
72
73    // OpenSSLリソースを解放
74    openssl_x509_free($certificate);
75    openssl_csr_free($csr);
76    openssl_pkey_free($privateKey);
77
78    return [
79        'certificate' => $certificateOutput,
80        'privateKey'  => $privateKeyOutput,
81    ];
82}
83
84// --- 関数の実行例 ---
85// 'localhost' というコモンネームで、有効期間7日の自己署名証明書を生成します。
86$result = generateSelfSignedCertificate('localhost', 7);
87
88if ($result) {
89    echo "自己署名証明書が正常に生成されました。\n\n";
90
91    echo "--- 証明書 (PEM形式) ---\n";
92    echo $result['certificate'];
93    echo "\n--- 秘密鍵 (PEM形式) ---\n";
94    echo $result['privateKey'];
95
96    // 生成された証明書と秘密鍵は、ファイルに保存してWebサーバー(Apache, Nginxなど)のHTTPS設定に利用できます。
97    // 例えば、'server.crt' と 'server.key' というファイル名で保存します。
98    // file_put_contents('server.crt', $result['certificate']);
99    // file_put_contents('server.key', $result['privateKey']);
100    // echo "\n証明書と秘密鍵を 'server.crt' および 'server.key' に保存しました。\n";
101} else {
102    echo "自己署名証明書の生成に失敗しました。\n";
103}

このPHPコードは、Webサーバーなどで利用できる自己署名SSL証明書と、それに対応する秘密鍵を生成するものです。PHP 8のOPENSSL_ALGO_SHA256定数は、暗号化処理において非常に重要な役割を果たします。具体的には、openssl_csr_sign()関数で最終的な証明書を生成する際、証明書に署名するためのハッシュアルゴリズムとしてSHA256を指定するために使用されます。これにより、生成される証明書のセキュリティとデータ整合性が現代の基準に合わせて保証されます。

generateSelfSignedCertificate関数は、$commonName引数で証明書のコモンネーム(通常はWebサイトのドメイン名)を、$validityDays引数で証明書の有効期間を日数で指定します。この関数が正常に実行されると、生成されたPEM形式の証明書と秘密鍵の文字列を含む配列が戻り値として返されます。もし証明書の生成過程で何らかの問題が発生した場合は、falseが返されます。この機能は、システム間の安全な通信基盤を構築する上で不可欠な暗号技術をPHPで実現する一例です。

このコードで生成される自己署名証明書は、信頼できる認証局によって署名されたものではないため、本番環境での利用は推奨されません。ブラウザやクライアントから信頼されず、セキュリティ警告が表示されるため、開発やテスト用途に限定して利用してください。生成された秘密鍵は非常に重要であり、漏洩するとセキュリティ上の問題に直結するため、厳重な管理と適切なファイルパーミッション設定が不可欠です。OPENSSL_ALGO_SHA256は現在推奨されるハッシュアルゴリズムの一つですが、セキュリティ要件は常に変化するため、最新情報を確認し、適切なアルゴリズムを選定することが重要です。また、エラー発生時の詳細なログ記録や、OpenSSLリソースの解放忘れにも注意してください。コモンネームは対象ドメインと一致させる必要があります。

PHP OpenSSLでSHA256署名する

1<?php
2
3/**
4 * PHPのOpenSSL拡張を使用してデジタル署名の生成と検証のプロセスを示します。
5 * OPENSSL_ALGO_SHA256定数を用いて、署名アルゴリズムにSHA256を指定する方法を実演します。
6 * システムエンジニアを目指す初心者にも分かりやすいように、各ステップで何が行われているかを説明します。
7 *
8 * @return string デジタル署名と検証のプロセスおよび結果を示す整形された文字列。
9 */
10function demonstrateOpenSSLDigitialSignature(): string
11{
12    // 1. 鍵ペア生成のための設定
13    // RSAアルゴリズムを使用し、2048ビットの鍵長、ダイジェストアルゴリズムとしてSHA256を指定します。
14    // この設定は鍵ペアの生成にのみ影響し、後の署名・検証では直接OPENSSL_ALGO_SHA256を使用します。
15    $keyGenerationConfig = [
16        "digest_alg"       => "sha256", // 鍵生成時のデフォルトダイジェストアルゴリズム
17        "private_key_bits" => 2048,     // 秘密鍵のビット数
18        "private_key_type" => OPENSSL_KEYTYPE_RSA, // 鍵の種類をRSAに指定
19    ];
20
21    // 2. 新しい秘密鍵とそれに対応する公開鍵を生成
22    // openssl_pkey_new()は、設定に基づいて新しい鍵ペアを生成し、OpenSSLAsymmetricKeyオブジェクトを返します。
23    // PHP 8ではリソースではなくオブジェクトが返されます。
24    $privateKeyObject = openssl_pkey_new($keyGenerationConfig);
25    if ($privateKeyObject === false) {
26        return "エラー: 鍵ペアの生成に失敗しました。\n" . openssl_error_string();
27    }
28
29    // 3. 秘密鍵をPEM形式の文字列としてエクスポート
30    // openssl_sign関数はPEM形式の秘密鍵文字列を必要とするため、生成した鍵オブジェクトからエクスポートします。
31    $pemPrivateKey = '';
32    openssl_pkey_export($privateKeyObject, $pemPrivateKey);
33
34    // 4. 公開鍵をPEM形式の文字列として抽出
35    // openssl_verify関数はPEM形式の公開鍵文字列を必要とします。
36    // 鍵オブジェクトから詳細情報を取得し、その中から公開鍵の文字列を取り出します。
37    $publicKeyDetails = openssl_pkey_get_details($privateKeyObject);
38    $pemPublicKey = $publicKeyDetails['key'];
39
40    // 5. 署名するオリジナルのデータ(メッセージ)を用意
41    $originalData = "PHP OpenSSL拡張のデジタル署名テストメッセージです。";
42    $signature = ''; // 署名結果(バイナリデータ)を格納する変数
43
44    // 6. データを秘密鍵でデジタル署名
45    // openssl_sign関数を使用し、元データ、秘密鍵、そして重要な **OPENSSL_ALGO_SHA256** 定数を
46    // 署名アルゴリズムとして指定します。この定数により、SHA256ハッシュ関数が内部で使われます。
47    $signSuccess = openssl_sign($originalData, $signature, $pemPrivateKey, OPENSSL_ALGO_SHA256);
48
49    if ($signSuccess === false) {
50        return "エラー: デジタル署名の生成に失敗しました。\n" . openssl_error_string();
51    }
52
53    // 7. 生成された署名を公開鍵で検証
54    // openssl_verify関数を使用し、元データ、生成された署名、公開鍵、そしてここでも
55    // **OPENSSL_ALGO_SHA256** 定数を検証アルゴリズムとして指定します。
56    // 戻り値は 1(成功)、0(失敗)、-1(エラー)です。
57    $verifyResult = openssl_verify($originalData, $signature, $pemPublicKey, OPENSSL_ALGO_SHA256);
58
59    // 8. 結果を整形して出力
60    $output = "--- PHP OpenSSL拡張によるデジタル署名と検証の例 ---\n\n";
61    $output .= "元のデータ: \"{$originalData}\"\n";
62    // 署名はバイナリデータなので、表示のためにBase64エンコードします。
63    $output .= "生成された署名 (Base64エンコード): " . base64_encode($signature) . "\n\n";
64
65    if ($verifyResult === 1) {
66        $output .= "検証結果: 成功!署名は有効であり、データが改ざんされていないことを確認できました。\n";
67    } elseif ($verifyResult === 0) {
68        $output .= "検証結果: 失敗。署名が無効であるか、データが改ざんされている可能性があります。\n";
69    } else { // -1
70        $output .= "検証結果: 検証中にエラーが発生しました。\n" . openssl_error_string();
71    }
72
73    // PHP 8ではOpenSSLAsymmetricKeyオブジェクトはガベージコレクションによって自動的に解放されるため、
74    // openssl_pkey_free()のような明示的な解放は不要です。
75
76    return $output;
77}
78
79// 定義した関数を実行し、結果を標準出力に表示します。
80echo demonstrateOpenSSLDigitialSignature();

このPHPサンプルコードは、OpenSSL拡張機能を利用したデータのデジタル署名の生成と検証のプロセスを具体的に示しています。特に注目すべきはOPENSSL_ALGO_SHA256定数で、これは署名に使用するハッシュアルゴリズムとしてSHA256を指定するための整数値です。この定数自体は引数を取らず、戻り値として特定の整数型(int)の値を返します。

コードではまず、RSA方式で鍵ペア(秘密鍵と公開鍵)を生成します。次に、準備された元データに対して、openssl_sign関数と生成した秘密鍵、そしてOPENSSL_ALGO_SHA256定数を組み合わせることで、SHA256アルゴリズムに基づいたデジタル署名を生成します。この署名はデータの正当性を示す「指紋」のようなものです。

その後、openssl_verify関数を使い、元データ、生成された署名、そして公開鍵とOPENSSL_ALGO_SHA256定数を用いて署名の検証を行います。この検証が成功すれば、データが署名後に一切改ざんされていないこと、そして署名が本物であることが確認できます。OPENSSL_ALGO_SHA256は、署名時と検証時で一貫した暗号化方式を指定し、デジタル署名によるデータの信頼性と完全性を確保するために重要な役割を果たしています。

OPENSSL_ALGO_SHA256は、署名と検証を行う際にSHA256ハッシュアルゴリズムを使用することを明確に指定する定数です。署名生成時と検証時で必ず同じアルゴリズムを指定することが重要です。このコードで生成される秘密鍵は、署名の正当性を保証する非常に重要な情報ですので、実際のシステムでは厳重な管理と安全な保存方法を徹底してください。OpenSSL関連の関数が失敗した場合、falseや-1を返し、openssl_error_string()で詳細なエラーメッセージを取得できますので、必ずエラーチェックを行い、適切に処理してください。デジタル署名は、データの改ざん検知と、その署名が特定の秘密鍵の所有者によって作成されたことの証明に役立ちます。

関連コンテンツ

関連IT用語

関連プログラミング言語