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.1w | unable to load certificate、続けて PEM routines:get_name:no start line |
| 3.0.13・3.0.22 | Could not read certificate from cert.pem、続けて Unable to load certificate |
| 3.1.8 | Could not read certificate from cert.pem |
| 3.3.7・3.5.7 | Could 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----- | CSR | openssl 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.pemopenssl 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よくある原因
- 証明書ではないファイルを渡している。
秘密鍵や CSR を-inに渡すと、このエラーになる。 - PKCS#7(
.p7b)や PFX(.pfx)のファイルを渡している。
PKCS#7 は、中に証明書が入っていてもopenssl x509では読めなかった。
PFX は 1.1.1w では読めず、3.0.22 と 3.3.7 ではパスワードを尋ねられて、-passinを渡すと読めた。 - PEM の形が壊れている。
-----BEGINか-----ENDの行が欠けたファイル、改行が空白に変わったファイル、改行が文字列の\nになったファイルは読めなかった。
環境変数や JSON に入れた証明書をそのまま書き出すと、この形になる。 - ファイルが空である。
取得に失敗したコマンドの出力をリダイレクトすると、0 バイトのファイルができる。 - 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 になった。