- 技術 💻
opensslコマンドの使い方|目的別一覧と実行結果・エラー対処【3系】
opensslコマンドは、鍵の生成、証明書の作成・確認・変換、TLS接続の確認、ハッシュや暗号化までを1つでこなすツールで、openssl サブコマンド オプション の形で使います。 サーバー証明書の期限確認や、HTTPS がつながらない原因の切り分けで特によく使われます。
この記事では、目的別の早見表と、すべてのコマンドの実行結果を OpenSSL 3.0.13 で確認して掲載しました。ローカルに HTTPS サーバーを立てて s_client で証明書チェーン・TLS バージョン・SNI を確かめ、3系で変わった点(genrsa → genpkey、PKCS#12 の -legacy など)とよくあるエラーを実際に再現して対処までまとめています。
openssl コマンドの早見表(目的別)
やりたいことから探してください。 ファイル名は例です。
| やりたいこと | コマンド |
|---|---|
| バージョン確認 | openssl version -a |
| RSA鍵を作る | openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out rsa.key |
| ECDSA(P-256)鍵を作る | openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ec.key |
| Ed25519鍵を作る | openssl genpkey -algorithm ED25519 -out ed.key |
| 公開鍵を取り出す | openssl pkey -in ec.key -pubout -out ec.pub |
| CSRを作る(SANつき) | openssl req -new -key ec.key -out app.csr -subj "/CN=..." -addext "subjectAltName=DNS:..." |
| 自己署名証明書を作る | openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 -noenc -keyout k -out c -days 365 -subj ... -addext ... |
| 証明書の中身を見る | openssl x509 -in c.crt -noout -text |
| 有効期限だけ見る | openssl x509 -in c.crt -noout -enddate |
| 期限がN秒以内に切れるか | openssl x509 -in c.crt -noout -checkend 2592000(終了コード0/1) |
| 証明書と鍵が対応するか | x509 -pubkey と pkey -pubout のハッシュを比べる |
| PEM → DER | openssl x509 -in c.crt -outform DER -out c.der |
| PEM → PKCS#12(.pfx/.p12) | openssl pkcs12 -export -in c.crt -inkey k.key -out c.p12 |
| PKCS#12 → PEM | openssl pkcs12 -in c.p12 -noenc -out all.pem |
| 古いPKCS#12を読む | openssl pkcs12 -in old.p12 -legacy ... |
| CAで署名する | openssl x509 -req -in s.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile s.ext -out s.crt |
| 証明書チェーンを検証 | openssl verify -CAfile ca.crt s.crt |
| サーバーの証明書を確認 | openssl s_client -connect host:443 -servername host |
| サーバー証明書の期限を確認 | openssl s_client -connect host:443 -servername host </dev/null 2>/dev/null | openssl x509 -noout -enddate |
| TLSバージョンを指定 | s_client ... -tls1_2 / -tls1_3 |
| テスト用TLSサーバー | openssl s_server -accept 8443 -cert c.crt -key k.key -www |
| ハッシュ値 | openssl dgst -sha256 file |
| 署名・検証 | openssl dgst -sha256 -sign k.key / -verify pub.pem -signature sig |
| ランダム文字列 | openssl rand -base64 32 / openssl rand -hex 16 |
| ファイル暗号化・復号 | openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -in f -out f.enc / -d |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「opensslコマンドの使い方|目的別一覧と実行結果・エラー対処【3系】」
まずバージョンを確認する(3.0・3.5・4.0の違い)
1.1.1と3系では既定値やエラー文が違うので、まずバージョンを確認します。
openssl version
OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)
この記事の実行結果は Ubuntu 24.04 の OpenSSL 3.0.13 で取得しました。公式の発表によると、2026年9月時点のサポート状況は次のとおりです。
| 系列 | 公式サポート | 主なポイント |
|---|---|---|
| 3.0(LTS) | 2026年9月7日で公式サポート終了 | OS側で修正が続く場合あり |
| 3.5(LTS) | 2030年4月8日まで | 現在の長期サポート版。ML-KEM など耐量子暗号に対応 |
| 4.0 | 2027年5月14日まで | 2026年4月リリース。ENGINE と SSLv3 の削除、Encrypted Client Hello 対応 |
この記事のコマンドは 3.0〜3.5 共通のものが中心です。 4.0 では -engine オプションが使えなくなっています。
鍵を作る(genpkey で RSA・ECDSA・Ed25519)
3系では鍵の生成に genpkey を使います。 genrsa は 3.0 で非推奨(deprecated)になりました(公式マニュアルに「This command has been deprecated」と記載)。
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -quiet -out rsa.key
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ec.key
openssl genpkey -algorithm ED25519 -out ed.key
ls -l *.key
cat ed.key
-rw------- 1 root root 241 Sep 29 18:26 ec.key
-rw------- 1 root root 119 Sep 29 18:26 ed.key
-rw------- 1 root root 2484 Sep 29 18:26 rsa.key
-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIJSEEODumfPJMHGa1WfPFPU7NcGlWgIvwSijlp+GBB3s
-----END PRIVATE KEY-----
鍵ファイルは権限 600 で作られました。 -quiet は RSA 生成中の .+++ という進捗表示を消します。
| 鍵の種類 | 作り方 | 向いている用途 |
|---|---|---|
| RSA 3072bit | -algorithm RSA -pkeyopt rsa_keygen_bits:3072 |
古いクライアントも含めた互換性重視 |
| ECDSA P-256 | -algorithm EC -pkeyopt ec_paramgen_curve:P-256 |
Webサーバー証明書の標準的な選択 |
| Ed25519 | -algorithm ED25519 |
署名・新しいシステム(ブラウザ向け証明書では一般的でない) |
鍵にパスフレーズを付けるときは暗号名と -pass を指定します。
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -quiet -aes-256-cbc -pass pass:changeit -out rsa_enc.key
head -1 rsa_enc.key
-----BEGIN ENCRYPTED PRIVATE KEY-----
pass:文字列は履歴に残るため、実運用では-pass file:パスやenv:変数名を使います。
genrsa も3.0で動き、出力は PKCS#8 形式(BEGIN PRIVATE KEY)です。PKCS#1 形式(BEGIN RSA PRIVATE KEY)が必要なら genrsa -traditional で出力できました。
公開鍵を取り出す・鍵の中身を見る
openssl pkey -in ec.key -pubout -out ec.pub
cat ec.pub
openssl pkey -in ec.key -text -noout | head -2
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENnvlzExjQmlZNKpRR/SfDSs3cGi7
XkxW9AqEcsviiS4JGuGw9doNMDUYaWRhPp4z9pDtBQ4TrycKwdZm6LwvrQ==
-----END PUBLIC KEY-----
Private-Key: (256 bit)
priv:
pkey は鍵の種類を問わない共通コマンドです。 openssl rsa -in ec.key は Not an RSA key になります。
CSR(証明書署名要求)を作る
CSR は認証局(CA)に証明書を発行してもらうための申請ファイルです。 3系では -addext で SAN(Subject Alternative Name:証明書が有効なホスト名の一覧)を1行で指定できます。
openssl req -new -key ec.key -out app.csr \
-subj "/C=JP/O=Example Inc/CN=app.example.test" \
-addext "subjectAltName=DNS:app.example.test,DNS:www.example.test"
openssl req -in app.csr -noout -verify
openssl req -in app.csr -noout -text | grep -A1 "Subject:|Alternative"
Certificate request self-signature verify OK
Subject: C = JP, O = Example Inc, CN = app.example.test
Subject Public Key Info:
--
X509v3 Subject Alternative Name:
DNS:app.example.test, DNS:www.example.test
ブラウザは CN ではなく SAN でホスト名を照合するので、CN の名前も SAN に入れます。
自己署名証明書を作る(開発用)
鍵と自己署名証明書は req -x509 -newkey の1コマンドで作れます。 -noenc(鍵を暗号化しない)は 3.0 で -nodes から改名されました(-nodes も可)。
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 -noenc \
-keyout self.key -out self.crt -days 365 \
-subj "/CN=localhost" -addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
作った証明書の拡張部分(x509 -text より抜粋):
Issuer: CN = localhost
Validity
Not Before: Sep 29 09:32:22 2026 GMT
Not After : Sep 29 09:32:22 2027 GMT
Subject: CN = localhost
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Subject Alternative Name:
DNS:localhost, IP Address:127.0.0.1
自己署名証明書はブラウザや curl からは信頼されません。 複数のホスト名を使うなら、後述のプライベートCAで署名すると扱いやすくなります。
証明書の中身・有効期限を確認する(x509)
証明書の確認は openssl x509 -in ファイル -noout に、見たい項目のオプションを付けます。
openssl x509 -in self.crt -noout -subject -issuer -dates -serial
openssl x509 -in self.crt -noout -ext subjectAltName
openssl x509 -in self.crt -noout -fingerprint -sha256
subject=CN = localhost
issuer=CN = localhost
notBefore=Sep 29 09:32:22 2026 GMT
notAfter=Sep 29 09:32:22 2027 GMT
serial=1D6390858601A7D5173C58229C1D9436EDA328FE
X509v3 Subject Alternative Name:
DNS:localhost, IP Address:127.0.0.1
sha256 Fingerprint=68:B4:B7:3D:C7:F2:00:9A:C7:2E:73:A2:90:CC:73:EA:C6:B2:2A:41:58:98:78:B3:1D:5B:85:60:E3:4C:4F:8F
-checkend 秒数 は、その秒数以内に期限が切れるかを終了コードで返します。 監視に便利です。
openssl x509 -in self.crt -noout -checkend 2592000; echo "exit=$?" # 30日
openssl x509 -in self.crt -noout -checkend 34560000; echo "exit=$?" # 400日
Certificate will not expire
exit=0
Certificate will expire
exit=1
証明書と秘密鍵が対応しているか確認する
証明書の公開鍵と、秘密鍵から取り出した公開鍵のハッシュが同じなら対応しています。 RSA・EC・Ed25519 のどれでも使える方法です。
openssl x509 -in self.crt -noout -pubkey | openssl sha256
openssl pkey -in self.key -pubout | openssl sha256
openssl pkey -in ec.key -pubout | openssl sha256 # 別の鍵
SHA2-256(stdin)= ea06b17e3dadf3adc374a36ebad07ebd112980cb2fc97d6d428b3bea851c3150
SHA2-256(stdin)= ea06b17e3dadf3adc374a36ebad07ebd112980cb2fc97d6d428b3bea851c3150
SHA2-256(stdin)= 117dad495c07e814fe514c24a671b8d18161816b767360c66114f73dd4e56b10
組み合わせを間違えたままサーバーを起動すると、次のエラーになります(s_server で再現)。
error setting private key
...:error:05800074:x509 certificate routines:X509_check_private_key:key values mismatch:...
形式を変換する(PEM・DER・PKCS#12)
PEM はテキスト形式、DER はそのバイナリ版、PKCS#12(.p12/.pfx)は証明書と鍵をパスワード付きでまとめた形式です。
| 形式 | 主な利用先 |
|---|---|
| PEM(.pem .crt .key) | nginx、Apache、多くのLinuxツール |
| DER(.der .cer) | Java の一部、Windows、組み込み機器 |
| PKCS#12(.p12 .pfx) | Windows / IIS、Java のキーストア |
# PEM → DER
openssl x509 -in self.crt -outform DER -out self.der
# DER → 確認
openssl x509 -in self.der -inform DER -noout -subject
# PEM(証明書+鍵)→ PKCS#12
openssl pkcs12 -export -in self.crt -inkey self.key -out self.p12 -name "localhost" -passout pass:changeit
openssl pkcs12 -in self.p12 -info -noout -passin pass:changeit
subject=CN = localhost
MAC: sha256, Iteration 2048
MAC length: 32, salt length: 8
PKCS7 Encrypted data: PBES2, PBKDF2, AES-256-CBC, Iteration 2048, PRF hmacWithSHA256
Certificate bag
PKCS7 Data
Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 2048, PRF hmacWithSHA256
3系の PKCS#12 は既定で AES-256-CBC と SHA-256 です。
# PKCS#12 → PEM(証明書と鍵を1ファイル/別々に)
openssl pkcs12 -in self.p12 -noenc -passin pass:changeit -out from_p12.pem
openssl pkcs12 -in self.p12 -clcerts -nokeys -passin pass:changeit -out only.crt
openssl pkcs12 -in self.p12 -nocerts -noenc -passin pass:changeit -out only.key
古い形式の PKCS#12 と -legacy
1.1.1 以前や古いツールで作った PKCS#12(RC2-40 などで暗号化)は、3系ではそのまま読めません。 3系で -legacy を付けて作った古い形式のファイルを読むと、次のエラーになりました。
openssl pkcs12 -in legacy.p12 -info -noout -passin pass:changeit
MAC: sha1, Iteration 2048
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Error outputting keys and certificates
...:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:...:Algorithm (RC2-40-CBC : 0), Properties ()
-legacy を付けると、古い暗号を含む legacy プロバイダーを読み込んで処理できます。
openssl pkcs12 -in legacy.p12 -info -noout -legacy -passin pass:changeit
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
新しい形式を読めない古い環境へ渡すときは、作成時に方式を指定します。 -legacy は RC2-40 になるため、3DES を指定する例です(pbeWithSHA1And3-KeyTripleDES-CBC になることを確認)。
openssl pkcs12 -export -in self.crt -inkey self.key -out compat.p12 -passout pass:changeit \
-certpbe PBE-SHA1-3DES -keypbe PBE-SHA1-3DES -macalg sha1
プライベートCAで署名して検証する
開発環境では自分用のルートCAで署名すると、CA を1つ信頼させるだけで複数のホストを検証できます。
# 1. ルートCA(10年)
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 -noenc \
-keyout ca.key -out ca.crt -days 3650 -subj "/CN=Example Test Root CA"
# 2. サーバー鍵とCSR
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out server.key
openssl req -new -key server.key -out server.csr -subj "/CN=app.example.test"
# 3. サーバー証明書用の拡張
cat > server.ext <<'EOF'
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature
extendedKeyUsage = serverAuth
subjectAltName = DNS:app.example.test, DNS:localhost, IP:127.0.0.1
EOF
# 4. CAで署名(90日)
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-days 90 -extfile server.ext -out server.crt
openssl x509 -in server.crt -noout -ext basicConstraints,extendedKeyUsage,subjectAltName
Certificate request self-signature ok
subject=CN = app.example.test
X509v3 Basic Constraints:
CA:FALSE
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Subject Alternative Name:
DNS:app.example.test, DNS:localhost, IP Address:127.0.0.1
x509 -req は CSR の SAN を既定では引き継がないので -extfile で指定します。 3.0 以降は -copy_extensions copy でも引き継げます(確認済み)。
verify でチェーン・期限・ホスト名を検証
openssl verify -CAfile ca.crt server.crt
openssl verify server.crt
openssl verify -CAfile ca.crt -verify_hostname other.example.test server.crt
openssl verify -CAfile ca.crt -attime $(date -d '+100 days' +%s) server.crt
server.crt: OK
CN = app.example.test
error 20 at 0 depth lookup: unable to get local issuer certificate
error server.crt: verification failed
CN = app.example.test
error 62 at 0 depth lookup: hostname mismatch
error server.crt: verification failed
CN = app.example.test
error 10 at 0 depth lookup: certificate has expired
error server.crt: verification failed
-attime で未来の時刻を指定すると、期限切れを前もって確認できます。 失敗時の終了コードは 2 です。
ローカルのHTTPSサーバーを s_client で確認する
s_server でテスト用の TLS サーバーを立て、s_client で確かめます。 SNI(接続時にホスト名を伝える仕組み)で証明書を出し分ける設定です。
# 既定は自己署名(localhost)、SNIが app.example.test のときはCA署名の証明書を返す
openssl s_server -accept 8443 -cert self.crt -key self.key \
-servername app.example.test -cert2 server.crt -key2 server.key -www &
-brief で、プロトコル・暗号・検証結果だけを表示します。
openssl s_client -connect 127.0.0.1:8443 -servername app.example.test -CAfile ca.crt -brief </dev/null
CONNECTION ESTABLISHED
Protocol version: TLSv1.3
Ciphersuite: TLS_AES_256_GCM_SHA384
Peer certificate: CN = app.example.test
Hash used: SHA256
Signature type: ECDSA
Verification: OK
Server Temp Key: X25519, 253 bits
DONE
-brief なしでは証明書チェーン(抜粋)も表示されます。
depth=1 CN = Example Test Root CA
depth=0 CN = app.example.test
Certificate chain
0 s:CN = app.example.test
i:CN = Example Test Root CA
Verify return code: 0 (ok)
SNI・TLSバージョン・検証エラーを確かめる
| 確認内容 | コマンド(抜粋) | 実行結果 |
|---|---|---|
| SNI を変える | -servername localhost |
Peer certificate: CN = localhost、Verification error: self-signed certificate |
| CA を渡さない | -CAfile なし |
Verify return code: 21 (unable to verify the first certificate) |
| TLS 1.2 を指定 | -tls1_2 |
Protocol version: TLSv1.2、ECDHE-ECDSA-AES256-GCM-SHA384 |
| TLS 1.1 を指定 | -tls1_1 |
error:0A0000BF:SSL routines:tls_setup_handshake:no protocols available |
| ホスト名が違う | -verify_hostname other.example.test -verify_return_error |
verify error:num=62:hostname mismatch と certificate verify failed |
s_client は検証に失敗しても既定では接続を続けます。 止めたいときは -verify_return_error を付けます。TLS 1.1 は 3.0 の既定のセキュリティレベルでは使えませんでした。
公開サーバーの証明書の期限は、s_client と x509 をつなげて確認できます。
openssl s_client -connect 127.0.0.1:8443 -servername app.example.test </dev/null 2>/dev/null \
| openssl x509 -noout -subject -enddate
subject=CN = app.example.test
notAfter=Dec 28 09:32:55 2026 GMT
curl 8.5.0 では --cacert ca.crt ありで 200、なしで curl: (60) SSL certificate problem: unable to get local issuer certificate でした。アプリで証明書エラーが出たら、まず s_client で同じ条件を再現すると切り分けが速くなります。
ハッシュ・署名・ランダム値(dgst・rand)
printf 'hello openssl\n' > note.txt
openssl dgst -sha256 note.txt
openssl dgst -sha256 -r note.txt # sha256sum と同じ形式
openssl rand -base64 32
openssl rand -hex 16
SHA2-256(note.txt)= 32a4652ec63b896e60e82bdecbcfe97394037243cb2c8e63d7dd79b0a7d4f383
32a4652ec63b896e60e82bdecbcfe97394037243cb2c8e63d7dd79b0a7d4f383 *note.txt
uIx7Un4Cx4/9XtTAthlhWkcqtVGfvKSpE9gxpunbJn4=
b76a7348f4357f914a1501b4bdabb149
sha256sum と同じ値になることも確認しました。rand -base64 32 は 32 バイトの乱数で、秘密値の生成に使えます(値は毎回変わります)。
署名と検証は dgst -sign / -verify です。
openssl dgst -sha256 -sign ec.key -out note.sig note.txt
openssl dgst -sha256 -verify ec.pub -signature note.sig note.txt
echo tampered >> note.txt
openssl dgst -sha256 -verify ec.pub -signature note.sig note.txt; echo "exit=$?"
Verified OK
Verification failure
exit=1
Ed25519 の署名は pkeyutl -sign -rawin / -verify -rawin を使います(検証成功を確認済み)。
ファイルを暗号化・復号する(enc)
enc でパスワードからファイルを暗号化するときは、-pbkdf2 と -iter を必ず付けます。 付けないと、3系は警告を出します。
openssl enc -aes-256-cbc -in memo.txt -out memo.old.enc -pass pass:changeit
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 600000 -in memo.txt -out memo.enc -pass pass:changeit
openssl enc -d -aes-256-cbc -pbkdf2 -iter 600000 -in memo.enc -pass pass:changeit
openssl enc -d -aes-256-cbc -pbkdf2 -iter 600000 -in memo.enc -pass pass:wrong
secret memo
bad decrypt
...:error:1C800064:Provider routines:ossl_cipher_unpadblock:bad decrypt:...
復号時も同じ -pbkdf2 -iter を指定します。 付け忘れると正しいパスワードでも bad decrypt になりました。また -aes-256-gcm のような認証付き暗号は enc: AEAD ciphers not supported となり、enc では使えません。改ざん検知まで必要なら、age や GnuPG など用途に合ったツールも検討します。
3系で非推奨・変更になったもの
| 以前の書き方 | 3系での扱い | 代わりの書き方 |
|---|---|---|
openssl genrsa |
非推奨(動作はする。出力は PKCS#8) | openssl genpkey -algorithm RSA |
-nodes |
-noenc に改名(-nodes も可) |
-noenc |
enc を -pbkdf2 なしで |
警告が出る | -pbkdf2 -iter 600000 |
| MD5・SHA-1 の証明書署名 | TLS では既定で拒否 | SHA-256 以上で再発行 |
| RC2・DES・MD4 など古い暗号 | legacy プロバイダーへ移動 | 読むときだけ -legacy |
| PKCS#12 の既定暗号 | RC2/3DES → AES-256-CBC | 古い環境向けは -certpbe などで指定 |
MD5 や SHA-1 のハッシュ計算自体は openssl dgst -md5 で今も実行できます(MD5(note.txt)= db0d8f9d... と表示)。一方、SHA-1 で署名した証明書をサーバーに設定すると、TLS の既定のセキュリティレベルで拒否されます。
$ openssl s_server -accept 8444 -cert server_sha1.crt -key server.key -www
error setting certificate
...:error:0A00018E:SSL routines:SSL_CTX_use_certificate:ca md too weak:...
openssl verify はこの証明書を OK と判定したため、verify が通っても TLS で使えないことがある点に注意します。
よくあるエラーと対処
エラー文のキーワードで原因を見分けます。
| エラー(3.0で再現) | 状況 | 対処 |
|---|---|---|
Could not read key from ... と bad decrypt / maybe wrong password |
暗号化された鍵のパスフレーズ違い | 正しい -passin を指定 |
Could not read certificate / Unable to load certificate |
PEM を -inform DER で読んだ、CSR を x509 で読んだ |
-inform と中身(head -1)を確認 |
no start line ... Expecting: CERTIFICATE REQUEST |
CSR を期待する所に証明書 | 期待される種類のファイルを渡す |
asn1_check_tlen:wrong tag |
PEM 証明書を pkcs12 として読んだなど、形式違い | 形式を確認し、変換してから渡す |
unsupported ... RC2-40-CBC |
古い PKCS#12 | -legacy を付ける |
key values mismatch |
証明書と鍵の組み合わせ違い | 公開鍵のハッシュを比較 |
unable to get local issuer certificate(error 20) |
発行元CA・中間証明書がない | -CAfile を指定、サーバーは中間証明書も送る |
certificate verify failed |
検証失敗(ホスト名・期限・CA) | s_client の verify error:num= の番号で原因を特定 |
hostname mismatch(error 62) |
SAN に接続名がない | SAN に追加して再発行 |
certificate has expired(error 10) |
期限切れ | 更新。-checkend で事前検知 |
ca md too weak |
SHA-1 などで署名された証明書 | SHA-256 以上で再発行 |
1.1.1 の unable to load Private Key は、3.0 では Could not read key from ファイル名 という表示になりました。
よくある質問
Q. RSA と ECDSA、どちらの鍵を作ればよいですか? A. Web サーバー証明書なら ECDSA P-256 が一般的で、鍵が小さく処理も軽くなります。古いクライアントとの互換性が必要なら RSA を選びます。
Q. 証明書の有効期限を定期的にチェックするには?
A. ファイルなら openssl x509 -noout -checkend 秒数、公開中のサーバーなら s_client の出力を x509 -noout -enddate や -checkend に渡し、終了コードで判定します。cron などで実行すると監視に使えます。
Q. .pfx ファイルを nginx で使うには?
A. openssl pkcs12 -in file.pfx -clcerts -nokeys -out server.crt と openssl pkcs12 -in file.pfx -nocerts -noenc -out server.key で PEM に分けます。中間証明書も含まれる場合は -cacerts -nokeys で取り出し、サーバー証明書の後ろにつなげます。
まとめ
- 最初に
openssl versionで系列を確認。 3系は既定値やエラー文が1.1.1と異なります。 - 鍵は
genpkey、鍵の操作はpkeyが3系の基本です(genrsaは非推奨)。 - CSR と自己署名証明書は
reqと-addext subjectAltName、確認はx509 -nooutと-checkendで行います。 - 形式変換は
x509 -outform DERとpkcs12。 古い PKCS#12 は-legacyで読めます。 - プライベートCAで署名し、
verifyとs_client -briefでチェーン・SNI・TLSバージョンを確認すると、証明書の問題を手元で再現できます。 encは-pbkdf2 -iterを必ず付け、復号でも同じ指定をします。- エラーは
verify error:num=の番号とキーワードで原因を特定し、表の対処を当てはめます。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「opensslコマンドの使い方|目的別一覧と実行結果・エラー対処【3系】」
株式会社RJCでは、証明書やTLSの仕組みを手を動かして確かめる学びを、プロジェクトの中で仲間と共有しています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。