エラーメッセージ
unable to load certificate
OpenSSL 1.1.x の文言です。OpenSSL 3.0 は「Could not read certificate from cert.pem」に続けて、先頭が大文字の U の「Unable to load certificate」を出力します。OpenSSL 3.5 以降は「Could not find certificate from cert.pem」に加えて、STORE routines のスタック行を出力します(3.0.2 と 3.6.4 で再現)。文言はバージョンによって異なりますが、失敗の内容は同じです。
このエラーの意味
openssl x509(または証明書を読み込む別のコマンド)は、ファイルから証明書を解析できませんでした。入力が別の PEM オブジェクト(鍵、CSR)であるか、バイナリのエンコーディングが違うか、そもそも X.509 構造ではないテキストであるかのいずれかです。コマンドはフィールドを読む段階まで進んでいません。証明書ファイルにはエンコーディングに関係なく .crt や .cer という名前が付けられるため、ここではファイル名から何もわかりません。手がかりになるのはバイト列だけです。
発生する理由
ファイルの中身が証明書ではなく鍵や CSR
よくあるBEGIN PRIVATE KEY、BEGIN PUBLIC KEY、BEGIN CERTIFICATE REQUEST のブロックは証明書ではありません。特に CSR は、証明書と頻繁に取り違えられます。CSR は CA に送るもので、証明書はその結果として返ってくるものです。
-inform der を指定していない DER 証明書
よくあるWindows 環境の .cer/.crt ファイルは、多くの場合バイナリの DER です。OpenSSL 1.1 の openssl x509 はデフォルトで PEM を想定するため、アーマーを見つけられずに失敗します。OpenSSL 3 は DER を自動的に判別します。
PKCS#7 / PKCS#12 のバンドル
ときどき.p7b や .pfx/.p12 のファイルは、証明書そのものではなく、証明書を格納したコンテナーです。x509 で中身を読む前に、専用のコマンドで展開する必要があります。
修正方法
- 1.
種類を特定してから変換する
ラベルまたは先頭のバイトを確認し、必要に応じて DER を PEM に変換してください。
bash head -1 cert.file # BEGIN what? openssl x509 -inform der -in cert.der -out cert.pem # DER → PEM - 2.
コンテナー形式を展開する
PKCS#7 や PKCS#12 のバンドルから証明書を取り出し、通常の PEM にしてください。
bash openssl pkcs7 -print_certs -in bundle.p7b -out certs.pem openssl pkcs12 -in bundle.pfx -clcerts -nokeys -out cert.pem - 3.
CSR には req コマンドを使う
ファイルが署名要求の場合は、req で内容を確認してください。また、証明書になるには、まだ CA による署名が必要であることも忘れないでください。
bash openssl req -in request.csr -noout -text