秘密鍵のファイルから公開鍵を取り出したいときは、openssl pkey -puboutを使う。
$ openssl pkey -in ec.pem -pubout
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEV2t4f8S5TFHmrxvxLQtoHyijNKqF
QuigIbqIza2sCnfoHRVPm4WNXCUpSvDgafsaZ3zvN8WgJVpi8VYAHbXYwg==
-----END PUBLIC KEY-----
ファイルに保存するには-outを指定する。
$ openssl pkey -in ec.pem -pubout -out ec.pub
pkeyはRSA、EC、Ed25519など、鍵の種類によらず同じコマンドで扱える。秘密鍵の作り方は別の記事で説明している。
参考: 【openssl】秘密鍵を作成する (genpkey)
実行例はUbuntu 24.04のOpenSSL 3.0.13のもの。
鍵の中身を表示する
-text -nooutを付けると、鍵の内容を人間が読める形式で表示する。-nooutはPEM本文の出力を抑止する。
$ openssl pkey -in ec.pem -noout -text
Private-Key: (256 bit)
priv:
d1:d9:cf:ba:d0:9a:b0:2a:59:0c:00:e8:ad:82:79:
39:99:e5:ac:a4:15:d0:82:91:31:f3:07:d7:42:0d:
5d:4a
pub:
04:57:6b:78:7f:c4:b9:4c:51:e6:af:1b:f1:2d:0b:
...
ASN1 OID: prime256v1
NIST CURVE: P-256
鍵の種類や鍵長だけを確認したい場合は、先頭の行を見る。RSAの場合は鍵長が表示される。
$ openssl pkey -in rsa.pem -noout -text | head -1
Private-Key: (2048 bit, 2 primes)
秘密鍵の値(priv:やRSAのprivateExponent)は、画面に出るため、画面共有やログへの貼り付けに注意する。公開鍵の情報だけを表示したい場合は-text_pubを使う。
$ openssl pkey -in ec.pem -noout -text_pub
Public-Key: (256 bit)
pub:
04:57:6b:78:7f:c4:b9:4c:51:e6:af:1b:f1:2d:0b:
...
ASN1 OID: prime256v1
NIST CURVE: P-256
公開鍵ファイルを読み込む
公開鍵のファイルを入力にする場合は、-pubinを付ける。
$ openssl pkey -pubin -in ec.pub -noout -text
Public-Key: (256 bit)
...
-pubinを付けずに公開鍵のファイルを読み込むと、秘密鍵と解釈されてエラーになる。
$ openssl pkey -in ec.pub -noout -text
Could not read key from ec.pub
エラーメッセージはバージョンで異なる。OpenSSL 3.5や3.6ではCould not find private key of key from ec.pubと表示される。
逆に、秘密鍵のファイルへ-pubinを付けても、エラーになる。
$ openssl pkey -in ec.pem -pubin -noout -text
Could not read key of Public Key from ec.pem
証明書から公開鍵を取り出す
証明書に含まれる公開鍵は、openssl x509 -pubkeyで取り出す。
$ openssl x509 -in cert.pem -pubkey -noout
-----BEGIN PUBLIC KEY-----
...
パスフレーズを付ける・外す
付ける
暗号名を指定して出力すると、パスフレーズで保護された秘密鍵になる。
$ openssl pkey -in ec.pem -aes-256-cbc -out ec-enc.pem
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
$ head -1 ec-enc.pem
-----BEGIN ENCRYPTED PRIVATE KEY-----
外す
暗号化された秘密鍵を暗号名なしで出力すると、パスフレーズなしの秘密鍵になる。
$ openssl pkey -in ec-enc.pem -out ec-dec.pem
Enter pass phrase for ec-enc.pem:
$ head -1 ec-dec.pem
-----BEGIN PRIVATE KEY-----
パスフレーズなしの鍵は、ファイルが漏れるとそのまま悪用される。パーミッションを600にして保管する。
非対話で指定する
スクリプトから実行する場合は、-passin(読み込む鍵のパスフレーズ)と-passout(出力する鍵のパスフレーズ)で指定する。指定方法はpass:、env:、file:で、openssl encの-passと共通である。
$ openssl pkey -in ec.pem -aes-256-cbc -passout env:KEY_PW -out ec-enc.pem
$ openssl pkey -in ec-enc.pem -passin env:KEY_PW -out ec-dec.pem
パスフレーズが違う場合は、読み込みに失敗する。
$ openssl pkey -in ec-enc.pem -passin pass:bad -noout
Could not read key from ec-enc.pem
参考: 【openssl】ファイルをパスワードで暗号化・復号する (enc)
PEMとDERを変換する
-outform DERを付けると、バイナリのDER形式で出力する。
$ openssl pkey -in ec.pem -outform DER -out ec.der
$ od -An -tx1 ec.der | head -1
30 77 02 01 01 04 20 d1 d9 cf ba d0 9a b0 2a 59
DER形式の鍵を読み込むときは、-inform DERを付ける。PEMに戻す場合は、-outformを省略する。
$ openssl pkey -inform DER -in ec.der -out ec-restored.pem
公開鍵をDERで出力するには、-puboutと-outform DERを組み合わせる。
$ openssl pkey -in ec.pem -pubout -outform DER -out ec.pub.der
従来形式とPKCS#8形式を変換する
pkeyは、秘密鍵をPKCS#8形式(BEGIN PRIVATE KEY)で出力する。古い形式(BEGIN RSA PRIVATE KEY)の鍵を読み込んで出力すると、PKCS#8形式に変換できる。
$ head -1 old.pem
-----BEGIN RSA PRIVATE KEY-----
$ openssl pkey -in old.pem | head -1
-----BEGIN PRIVATE KEY-----
従来形式で出力したい場合は、-traditionalを付ける。
$ openssl pkey -in rsa.pem -traditional | head -1
-----BEGIN RSA PRIVATE KEY-----
$ openssl pkey -in ec.pem -traditional | head -1
-----BEGIN EC PRIVATE KEY-----
鍵が正しいか検証する
-checkを付けると、鍵の整合性を検証する。
$ openssl pkey -in rsa.pem -check -noout
Key is valid
バージョンによる違い
OpenSSL 3.5や3.6でも、ここまでの例は同じように動く。
macOS標準の/usr/bin/openssl(LibreSSL 3.3.6)のpkeyは、-pubout、-text、-pubin、-text_pub、暗号名の指定に対応している。-traditionalには対応しておらず、Unknown cipher traditionalというエラーになる。
