できない.dev

OpenSSL「unable to load certificate」の原因と直し方

unable to load certificate は、head -n 1 でファイルの中身を確かめ、PEM の証明書に直せば読める。
秘密鍵や CSR を渡した、改行が壊れた、PKCS#7 のままといった場合に出る。
文言は版で変わる。

公開:

要約

unable to load certificate は、openssl x509(新しいタブで開く) に渡したファイルから証明書を読み取れないと出る。まず head -n 1 でファイルの先頭を見る。
多くは、証明書ではないファイルを渡しているか、PEM の形が壊れている。

同じ失敗でも、文言は版で変わる。
空のファイルを openssl x509 -in cert.pem -noout -subject に渡すと、次のように出た。

OpenSSL表示
1.1.1wunable to load certificate、続けて PEM routines:get_name:no start line
3.0.13・3.0.22Could not read certificate from cert.pem、続けて Unable to load certificate
3.1.8Could not read certificate from cert.pem
3.3.7・3.5.7Could not find certificate from cert.pem

3.x では、ファイルの中身によって STORE routines や No supported data to decode の行が続くこともある。
どの版でも終了コードは 1 である。

ファイルそのものが無いときは別の文言になる。
3.x は Could not open file or uri for loading certificate from、1.1.1w は Can't open で始まる行を出す。

解決策

1. 先頭の行で中身を見分ける

head -n 1 cert.pem
先頭の行中身すること
-----BEGIN CERTIFICATE-----証明書手順 3 で形を確かめる
-----BEGIN PRIVATE KEY-----秘密鍵証明書のファイルを渡す
-----BEGIN CERTIFICATE REQUEST-----CSRopenssl req -in で読む
-----BEGIN PKCS7-----PKCS#7手順 2 で取り出す
読めないバイト列DER か PFX手順 2 か手順 4 へ

-----BEGIN CERTIFICATE----- より前に文字列があっても読める。Bag Attributes で始まるファイルや、秘密鍵と証明書を連結したファイルは、1.1.1w でも 3.5.7 でも証明書を読めた。

2. PKCS#7 や PFX から取り出す

openssl pkcs7 -in chain.p7b -print_certs -out cert.pem
openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.pem

openssl pkcs12 は PFX のパスワードを尋ねる。

3. 壊れた改行を戻す

改行が文字列の \n になっているなら、sed で本物の改行に戻す。

sed 's/\\n/\n/g' broken.pem > cert.pem

全体が 1 行につながっているなら、ヘッダーとフッターの前後に改行を入れる。
本文の Base64 は 1 行のままでも読める。

sed -e 's/-----BEGIN CERTIFICATE-----/&\n/' \
    -e 's/-----END CERTIFICATE-----/\n&\n/' flat.pem > cert.pem

-----END の行が欠けているファイルは、発行元から取り直す。

4. DER を読む

openssl x509 -inform DER -in cert.der -noout -subject
openssl x509 -inform DER -in cert.der -out cert.pem

直ったかどうかは、同じコマンドで subject= の行が出るかで分かる。

openssl x509 -in cert.pem -noout -subject

よくある原因

  1. 証明書ではないファイルを渡している。
    秘密鍵や CSR を -in に渡すと、このエラーになる。
  2. PKCS#7(.p7b)や PFX(.pfx)のファイルを渡している。
    PKCS#7 は、中に証明書が入っていても openssl x509 では読めなかった。
    PFX は 1.1.1w では読めず、3.0.22 と 3.3.7 ではパスワードを尋ねられて、-passin を渡すと読めた。
  3. PEM の形が壊れている。-----BEGIN か -----END の行が欠けたファイル、改行が空白に変わったファイル、改行が文字列の \n になったファイルは読めなかった。
    環境変数や JSON に入れた証明書をそのまま書き出すと、この形になる。
  4. ファイルが空である。
    取得に失敗したコマンドの出力をリダイレクトすると、0 バイトのファイルができる。
  5. OpenSSL 1.1.1 で DER のファイルを読ませている。
    1.1.1w は no start line で止まり、3.0.13 以降は -inform DER なしでも読めた。

CRLF の改行は、試したすべての版で読めた。
BOM 付きのファイルは 3.0 以降で読め、1.1.1w では no start line になった。