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
-pbkdf2 を付けないと OpenSSL の旧来の弱い鍵導出(単一 MD5)が使われ、総当たりに弱くなる。暗号化・復号の両方で必ず同じオプションを揃えること。
安全なパスワードや鍵を生成するには?
結論:
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の鍵を本番サーバに置きっぱなしにする