openssl コマンド入門 - 証明書・ハッシュ・暗号化の実務操作

openssl コマンド入門 - 証明書・ハッシュ・暗号化の実務操作

この記事で解決できること

  • openssl自己署名証明書 / CSR を作る型が分かる
  • ファイルの SHA-256 ハッシュAES 暗号化 を即実行できる
  • 公開サーバの 証明書の有効期限 をワンライナーで確認できる

結論(実務でよく使う 5 つ)

  • バージョン確認 → openssl version
  • ハッシュ → openssl dgst -sha256 file
  • 証明書作成 → openssl req -x509 -newkey rsa:2048 ...
  • 証明書確認 → openssl s_client -connect host:443
  • 暗号化 → openssl enc -aes-256-cbc -pbkdf2 ...

前提(対象環境)

  • OS:Ubuntu / 一般的な Linux
  • OpenSSL 1.1.1 以降(openssl version で確認)
  • 古い 1.0.x では -pbkdf2 が使えないため注意

openssl コマンドとは?

結論: openssl は TLS/SSL と暗号化機能を CLI から扱う万能ツール。証明書・ハッシュ・暗号化・乱数生成を 1 コマンドで完結できる。

openssl は OpenSSL ライブラリのフロントエンドで、サブコマンド方式で動く。openssl <サブコマンド> <オプション> の形が基本。

$ openssl version
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

主なサブコマンドは次の通り。

サブコマンド 役割
dgst ハッシュ計算
enc 共通鍵暗号化
genpkey 秘密鍵生成
req CSR / 自己署名証明書
x509 証明書の表示・変換
s_client TLS 接続デバッグ
rand 乱数生成

どうやってハッシュを計算するのか?

結論: openssl dgst -sha256 file でファイルの SHA-256 を計算する。配布物の改ざん検知や整合性確認に使う。

ファイルのハッシュ

$ openssl dgst -sha256 ubuntu.iso
SHA256(ubuntu.iso)= 9bc6b8f6...(64桁の16進数)

sha1 / sha512 などアルゴリズムを差し替えれば他のダイジェストも取れる。

文字列のハッシュ

$ echo -n "hello" | openssl dgst -sha256

echo -n-n を忘れると末尾の改行までハッシュ対象になり、値が変わる。文字列ハッシュでは必ず -n を付ける。

証明書はどう作るのか?

結論: 開発・検証用なら openssl req -x509 で秘密鍵と自己署名証明書を一度に作れる。本番は CSR を作って認証局に署名してもらう。

自己署名証明書(開発・検証用)

$ openssl req -x509 -newkey rsa:2048 \
    -keyout key.pem -out cert.pem \
    -days 365 -nodes \
    -subj "/CN=localhost"

オプションの意味:

  • -x509:CSR ではなく自己署名証明書を出力
  • -newkey rsa:2048:2048bit の RSA 鍵を新規生成
  • -keyout / -out:秘密鍵 / 証明書の出力先
  • -days 365:有効期間
  • -nodes:秘密鍵をパスフレーズなしで保存("no DES")
  • -subj:対話入力を省略して Subject を指定

-nodes はパスフレーズ保護を外す。鍵ファイルのパーミッションは chmod 600 key.pem で必ず本人のみに制限する。

本番向け:CSR を作る

認証局に署名してもらう場合は、秘密鍵と CSR(証明書署名要求)を作る。

$ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out key.pem
$ openssl req -new -key key.pem -out request.csr -subj "/CN=example.com"

生成した CSR の中身は次で確認できる。

$ openssl req -in request.csr -noout -text

サーバ証明書の有効期限はどう確認するのか?

結論: openssl s_client で公開サーバに接続し、x509 -noout -dates に渡すと有効期限をワンライナーで取得できる。

ローカルの証明書を見る

$ openssl x509 -in cert.pem -noout -text

有効期限だけ見たいなら -dates

$ openssl x509 -in cert.pem -noout -dates
notBefore=Jun  5 00:00:00 2026 GMT
notAfter=Jun  5 00:00:00 2027 GMT

公開サーバの証明書を確認する

$ echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
    | openssl x509 -noout -dates

-servername は SNI(Server Name Indication)を指定する。同一 IP で複数ドメインを配信する環境では付けないと別の証明書が返る。

ファイルを暗号化するには?

結論: openssl enc -aes-256-cbc -pbkdf2 で共通鍵(パスワード)暗号化できる。復号は同じ指定に -d を足すだけ。

暗号化

$ openssl enc -aes-256-cbc -pbkdf2 -salt -in secret.txt -out secret.enc

実行するとパスワードを聞かれる。オプションの意味:

  • -aes-256-cbc:AES-256(CBC モード)
  • -pbkdf2:鍵導出を PBKDF2 にする(必須級)
  • -salt:ソルトを付与(デフォルト有効、明示推奨)

復号

$ openssl enc -aes-256-cbc -pbkdf2 -d -in secret.enc -out secret.txt

安全なパスワードや鍵を生成するには?

結論: openssl rand で暗号学的に安全な乱数を生成する。-base64 でパスワード、-hex でトークンとして使える。

$ openssl rand -base64 24
Xa9b2C... (32文字程度のランダム文字列)
$ openssl rand -hex 32

16 進 64 桁のトークンが得られる。API キーやセッションシークレットの生成に使える。

まとめ:コピペ用テンプレート

結論: 用途別の openssl ワンライナーを手元に置けば、証明書・ハッシュ・暗号化の作業を迷わず実行できる。

コピペ用:openssl 実務テンプレ

# バージョン確認
openssl version

# SHA-256 ハッシュ
openssl dgst -sha256 file

# 自己署名証明書(開発用、1年)
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=localhost"

# 公開サーバ証明書の有効期限
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

# AES-256 暗号化 / 復号
openssl enc -aes-256-cbc -pbkdf2 -salt -in in.txt -out out.enc
openssl enc -aes-256-cbc -pbkdf2 -d -in out.enc -out in.txt

# 安全なパスワード生成
openssl rand -base64 24

やってはいけないこと

  • -pbkdf2 無しで enc を使う(弱い鍵導出)
  • 秘密鍵を chmod 600 せず放置する
  • -nodes の鍵を本番サーバに置きっぱなしにする

次に読む