web-dev-qa-db-ja.com

SSL証明書のインポートエラー:X.509証明書ではありません

この投稿 に従ってSSL証明書を更新しようとしています。

私は証明書の初心者なので、 このガイド に従いました。しかし、私が入るとき

keytool -keystore mycacerts -storepass changeit -importcert -file "C:\Users\Noks\Desktop\cacerts.pem" -v

エラーが表示されます:

keytool error: Java.lang.Exception: Input not an X.509 certificate
Java.lang.Exception: Input not an X.509 certificate
        at Sun.security.tools.KeyTool.addTrustedCert(KeyTool.Java:1913)
        at Sun.security.tools.KeyTool.doCommands(KeyTool.Java:818)
        at Sun.security.tools.KeyTool.run(KeyTool.Java:172)
        at Sun.security.tools.KeyTool.main(KeyTool.Java:166)

どうすれば修正できますか?

33
nikel

Cacerts.pemファイルは単一の証明書を保持していますか?それはPEMなので、それを見てください、それはで始まる必要があります

-----BEGIN CERTIFICATE-----

で終わる

-----END CERTIFICATE-----

最後に、破損していないことを確認するには、opensslを入手して、詳細を出力します

openssl x509 -in cacerts.pem -text

34
Bruno Grieder

多くのCAは、PKCS7形式の証明書を提供します。

Oracleドキュメント によると、keytoolコマンドはPKCS#7を処理できますが、失敗する場合があります

Keytoolコマンドは、X.509 v1、v2、v3証明書、およびそのタイプの証明書で構成されるPKCS#7形式の証明書チェーンをインポートできます。インポートするデータは、インターネットRFC 1421標準で定義されているバイナリエンコード形式または印刷可能なエンコード形式(Base64エンコードとも呼ばれる)で提供する必要があります。後者の場合、エンコーディングは、先頭が----- BEGINで始まる文字列で区切られ、末尾が----- ENDで始まる文字列で区切られている必要があります。

PKCS7ファイルをインポートできない場合は、PKCS7からX.509に変換してみてください。

openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
30
superlazy

これは古いスレッドのように見えますが、ここで私の経験を追加します。私も証明書をインストールしようとしましたが、そのエラーが発生しました。次に、txtエディターでcerファイルを開きましたが、各行の終わりに余分なスペース(文字)があることに気付きました。これらの行を削除すると、証明書をインポートできました。

これが他の誰かにとって何か価値があることを願っています。

5
XDanny322

また、誰かに役立つ場合に備えて、ここに私の経験を追加します。

職場では、一般的に次の2つのコマンドを使用して、IntelliJ IDEAを有効にして、内部Mavenリポジトリなどのさまざまなサーバーと通信します。

[Elevated]C:\Program Files\JetBrains\IntelliJ IDEA {version}\jre64>bin\keytool 
    -printcert -rfc -sslserver maven.services.{our-company}.com:443 > public.crt

[Elevated]C:\Program Files\JetBrains\IntelliJ IDEA {version}\jre64>bin\keytool
    -import -storepass changeit -noprompt -trustcacerts -alias services.{our-company}.com 
    -keystore lib\security\cacerts -file public.crt

さて、時々起こることは、ファイアウォールがそれを妨げる、ユーザーがVPNを開始するのを忘れたなど、一時的な接続の問題のために、keytool -printcertコマンドが外部と通信できないことです。これが起こるのは人生の事実です。これは実際には問題ではありません。

問題は、愚かなツールがそのようなエラーに遭遇したとき、標準エラーデバイスにエラーメッセージを出力せず、標準出力デバイスに出力することです!

そのため、最終的には次のようになります。

  • 最初のコマンドを実行しても、エラーメッセージは表示されないため、失敗したことはわかりません。ただし、キーの代わりにpublic.crtファイルにkeytool error: Java.lang.Exception: No certificate from the SSL serverというエラーメッセージが含まれるようになりました。
  • 2番目のコマンドを実行すると、public.crtのキーの代わりにエラーメッセージが見つかるため、keytool error: Java.lang.Exception: Input not an X.509 certificateと言って失敗します。

一番下の行は:keytool -printcert ... > public.crtの後にpublic.crtの内容を常にダンプして、keytool -import ... -file public.crtの実行に進む前に、エラーメッセージではなく実際にキーであることを確認します

1
Mike Nakis

私は3つのことを変更し、それが機能します:

  1. スペースの列があり、それらを削除しました
  2. 改行をWindows CRLFからLinux LFに変更しました
  3. 最後の空行を削除しました。
0
LingYan Meng