Jenkins/Hudsonで自分の電子メールを設定しようとしていますが、常にエラーが表示されます。
Java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be
non-empty
オンラインでエラーに関する大量の情報を見たことがありますが、動作するようになっていません。私はFedora Linux(OpenJDKではなく)でSunのJDKを使っています。
これが私が試したいくつかのことです。私はこの post からのアドバイスに従ってみましたが、Windowsからの認証をJenkinsをホストしている私のFedoraボックスにコピーしてもうまくいきませんでした。 Gmailを私のSMTPサーバーとして設定しようとしているので、 このガイド に従ってみましたが、うまくいきませんでした。また、これらのcacertファイルを手動でダウンロードして移動し、 このガイド のコマンドのバリエーションを使用して自分のJavaフォルダに移動しようとしました。
私は現在立ち往生しているので、私はどんな提案にもオープンです。私はそれがWindows Hudsonサーバーから動くようになったが、私はLinuxに苦しんでいる。
この奇妙なメッセージは、指定したトラストストアが以下のものであることを意味します。
下記の@ AdamPlumbの 回答も参照してください 。
Ubuntu 18.04では、このエラーには別の原因があります(JEP 229、jks
キーストアのデフォルト形式からpkcs12
への切り替え形式、および新しいファイルのデフォルトを使用したDebian cacertsファイルの生成)および 回避策 :
# Ubuntu 18.04 and various Docker images such as openjdk:9-jdk throw exceptions when
# Java applications use SSL and HTTPS, because Java 9 changed a file format, if you
# create that file from scratch, like Debian / Ubuntu do.
#
# Before applying, run your application with the Java command line parameter
# Java -Djavax.net.ssl.trustStorePassword=changeit ...
# to verify that this workaround is relevant to your particular issue.
#
# The parameter by itself can be used as a workaround, as well.
# 0. First make yourself root with 'Sudo bash'.
# 1. Save an empty JKS file with the default 'changeit' password for Java cacerts.
# Use 'printf' instead of 'echo' for Dockerfile RUN compatibility.
/usr/bin/printf '\xfe\xed\xfe\xed\x00\x00\x00\x02\x00\x00\x00\x00\xe2\x68\x6e\x45\xfb\x43\xdf\xa4\xd9\x92\xdd\x41\xce\xb6\xb2\x1c\x63\x30\xd7\x92' > /etc/ssl/certs/Java/cacerts
# 2. Re-add all the CA certs into the previously empty file.
/var/lib/dpkg/info/ca-certificates-Java.postinst configure
https://git.mikael.io/mikaelhg/broken-docker-jdk9-cacerts
ステータス(2018-08-07)、このバグはUbuntu Bionic LTS 18.04.1およびUbuntu Cosmic 18.10で修正されました。
???? buntu 1770553:[SRU]バックポートca-certificates-Java from cosmic(20180413ubuntu1)
???? buntu 1769013:ca-certificates-Java 20180413(メイン)をDebian不安定版(メイン)からマージしてください
???? buntu 1739631:JDK 9の新規インストールでは、生成されたPKCS12 cacertsキーストアファイルを使用できません
???? docker-library 145:9-jdkイメージにSSLの問題があります
???? JDK-8044445:JEP 229:デフォルトでPKCS12キーストアを作成
???? JEP 229:デフォルトでPKCS12キーストアを作成
この回避策を実行しても問題が解決しない場合は、修正したJavaディストリビューションを実際に実行していることを確認してください。
$ which Java
/usr/bin/Java
Javaの代替を 'auto'に設定できます:
$ Sudo update-Java-alternatives -a
update-alternatives: error: no alternatives for mozilla-javaplugin.so
実行しているJavaバージョンを再確認できます。
$ Java --version
openjdk 10.0.1 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)
代替の回避策もありますが、それらには独自の副作用があり、将来のメンテナンスがさらに必要になります。
次に最適な回避策は、行を追加することです
javax.net.ssl.trustStorePassword=changeit
ファイルに
/etc/Java-9-openjdk/management/management.properties
/etc/Java-11-openjdk/management/management.properties
存在するもの。
3番目に問題の少ない回避策は、次の値を変更することです。
keystore.type=pkcs12
に
keystore.type=jks
ファイル内
/etc/Java-9-openjdk/security/Java.security
/etc/Java-11-openjdk/security/Java.security
いずれかが存在する場合は、cacerts
ファイルを削除し、前述の方法で再生成します。
これは私にとってUbuntuの問題を修正しました:
Sudo /var/lib/dpkg/info/ca-certificates-Java.postinst configure
(ここにあります: https://bugs.launchpad.net/ubuntu/+source/ca-certificates-Java /+bug/1396760 )
ca-certificates-Java
はOracle JDK/JREの依存関係ではないため、これは明示的にインストールする必要があります。
Ubuntu 18.04では、根本的な原因はopenjdk-11-jdk(これがデフォルトです)とそれに依存する他のパッケージとの競合です。これはすでにDebianで修正されており、まもなくUbuntuに含まれる予定です。その間の最も簡単な回避策はあなたのJavaをバージョン8に降格させることです。ca-certificates-Java
を使用する他の解決策ははるかに複雑です。
まず競合するパッケージを削除します。
Sudo apt-get remove --purge openjdk* Java-common default-jdk
Sudo apt-get autoremove --purge
次の方法で、すべての関連パッケージが正常に削除されたかどうかを確認します。
Sudo update-alternatives --config Java
config に利用できるJavaがない、そうでなければこの回避策 は失敗します 。
次に必要なパッケージを再インストールします。
Sudo apt-get install openjdk-8-jdk
EJPは基本的にこの質問に答えました(そして私はこれが受け入れられた答えを持っていることを理解しています)が、私はちょうどこのEdge-caseの落とし穴を扱った。
SSLのみのアクセス用に以前に設定したホスト型 Jira サーバーでInvalidAlgorithmParameterExceptionエラーが発生しました。問題は、鍵ストアをPKCS#12形式でセットアップしたのですが、私のトラストストアはJKS形式だったことです。
私の場合は、server.xmlファイルを編集してkeystoreTypeをPKCSに指定しましたが、truststoreTypeを指定しなかったため、デフォルトのkeystoreTypeはすべてになります。 JKSとしてtruststoreTypeを明示的に指定することで解決しました。
私はブログの投稿からこの解決策に出くわしたOS XでOpenJDK 7を実行しているときのtrustAnchors問題の修正:
OS XでOpenJDK 7を実行しているときのtrustAnchorsの問題を修正しました。OSXでOpenJDK 7を実行していて、この例外を見た場合
Unexpected error: Java.security.InvalidAlgorithmParameterException: the trustAnchors
parameter must be non-empty
簡単な修正があります。 AppleのJDK 1.6が使用しているのと同じcacertsファイルにリンクするだけです。
cd $(/usr/libexec/Java_home -v 1.7)/jre/lib/security
ln -fsh /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts
あなたがインストールしたすべてのOpenJDKバージョンに対してこれを行う必要があります。 -v 1.7
を修正したいバージョンに変更するだけです。 /usr/libexec/Java_home -V
を実行して、インストールしたすべてのJREとJDKを確認してください。
おそらくOpenJDKの人たちがこれをインストールスクリプトに追加することができます。
Ubuntu 12.10 (Quantal Quetzal)以降では、証明書は ca-certificates-Java パッケージに入っています。どのJDKを使用しているかにかかわらず、-Djavax.net.ssl.trustStore=/etc/ssl/certs/Java/cacerts
を使用するとそれらが選択されます。
私は、 OS X v10.9 (Mavericks)にアップグレードした後、JDK 1.7を使用して、OS Xでこの問題に遭遇しました。私にとってうまくいった修正は、 http://support.Apple.com/kb/DL1572 で入手可能な、AppleバージョンのJavaを単に再インストールすることでした。
私は走った
Sudo update-ca-certificates -f
証明書ファイルを作成します。
Sudo /var/lib/dpkg/info/ca-certificates-Java.postinst configure
私はビジネスに戻りました、ありがとう。それはインストールに含まれていないのは残念ですが、私は最後にそこに着いた。
エラーは、システムがパラメーターjavax.net.ssl.trustStore
で指定されたパスにトラストストアを見つけることができないことを示しています。
Windowsでは、cacerts
ファイルをjre/lib/security
からEclipseのインストールディレクトリ(Eclipse.ini
ファイルと同じ場所)にコピーし、Eclipse.ini
に以下の設定を追加しました。
-Djavax.net.ssl.trustStore=cacerts
-Djavax.net.ssl.trustStorePassword=changeit
-Djavax.net.ssl.trustStoreType=JKS
Cacertsへのパスに問題がある(%Java_home%環境変数がなんらかの形で上書きされている)ので、この簡単な解決策を使いました。
アイデアはトラストストアファイルへの有効なパスを提供することです - 理想的にはそれは相対的なものを使うことでしょう。絶対パスを使用することもできます。
ストアの種類がJKSであることを確認するには、次のコマンドを実行します。
keytool -list -keystore cacerts
Keystore type: JKS
Keystore provider: Sun
OS X v10.9 (Mavericks)にアップグレードした後、私はたくさんのセキュリティ問題を抱えていました。
trustAnchors
パラメータは空でない必要があります私はこのJavaアップデートを適用し、それがすべての私の問題を修正しました: http://support.Apple.com/kb/DL1572?viewlocale=ja_JP
Ca-certificates-Javaパッケージを削除して再度インストールするとうまくいきました( Ubuntu MATE / 17.10(Artful Aardvark))。
Sudo dpkg --purge --force-depends ca-certificates-Java
Sudo apt-get install ca-certificates-Java
Jdstrand: バグ983302のコメント1、Re:ca-certificates-JavaがOneiric OcelotにJava cacertsをインストールできない 。
私にとっては、トラストストアにtrustedCertEntryがないことが原因でした。
テストするには、
keytool -list -keystore keystore.jks
それは私を与えます:
Keystore type: JKS
Keystore provider: Sun
Your keystore contains 1 entry
cert-alias, 31-Jul-2017, PrivateKeyEntry
私のPrivateKeyEntryにCAが含まれていても これは個別にインポートする必要があります :
keytool -import -alias root-ca1 -file rootca.crt -keystore keystore.jks
証明書をインポートし、keytool -list -keystore keystore.jks
を再実行すると次のようになります。
Your keystore contains 2 entries
cert-alias, 31-Jul-2017, PrivateKeyEntry,
Certificate fingerprint (SHA1):
<fingerprint>
root-ca1, 04-Aug-2017, trustedCertEntry,
Certificate fingerprint (SHA1):
<fingerprint>
現在はtrustedCertEntryがあり、Tomcatは正常に起動します。
私は Talend Open Studio で代替JVMを使用しているということで、このようなことを期待していました(現時点ではサポートはJDK 1.7までしか存在しません)。私はセキュリティ上の目的で8を使用しています...とにかく
証明書ストアを更新します。
Sudo update-ca-certificates -f
それから
初期化パラメータに新しい値を追加します
Sudo gedit $(path to your architecture specific ini i.e. TOS_DI...ini)
Djavax.net.ssl.trustStore=/etc/ssl/certs/Java/cacerts
私にとっては、2番目のエントリーがうまくいきました。 Talend Open Studio/TEnt + JVMのバージョンに応じて、パラメータ名は異なりますが、同じキーストアファイルを探します。
JDK9とMavenを使ったUbuntuでこれを経験するなら、あなたはこのJVMオプションを追加することができます - 最初にパスが存在するかどうかチェックしてください:
-Djavax.net.ssl.trustStore=/etc/ssl/certs/Java/cacerts
ファイルが見つからない場合は、次のようにしてca-certificates-Javaをインストールします。
Sudo apt install ca-certificates-Java
Ubuntu 16.04 LTS(Xenial Xerus)から Ubuntu 18.04 LTS(Bionic Beaver)にアップグレードした後、 Maven 3を使用しようとしたときにこの問題が発生しました。
/ usr/lib/jvm/Java-8-Oracle/jre/lib/securityを確認したところ、私のcacertsファイルは/etc/ssl/certs/Java/cacerts
を指すシンボリックリンクであることがわかりました。
疑わしいcacerts.original
という名前のファイルもありました。
私はcacerts.original
をcacerts
に改名しました、そしてそれは問題を解決しました。
Linux上のJava 9.0.1でこのエラーメッセージが表示されました。これはJDKの既知のバグによるもので、cacertsファイルが.tar.gzバイナリパッケージ( http://jdk.Java.net/9/ からダウンロード)で空になっています。
JDK 9.0.1リリースノートの「既知の問題」の段落を参照してください。「TLSはOpenJDK 9ではデフォルトでは機能しません」と表示されます。
Debian/Ubuntu(そしておそらく他の派生物)では、簡単な回避策はcacertsファイルを "ca-certificates-Java"パッケージからのものに置き換えることです:
Sudo apt install ca-certificates-Java
cp /etc/ssl/certs/Java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts
Red Hat Linux/CentOSでは、 "ca-certificates"パッケージから同じことができます。
Sudo yum install ca-certificates
cp /etc/pki/Java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts
私の場合は、クライアントアプリケーションで使用されているJKSファイルが破損していました。新しい証明書を作成し、その中に宛先サーバーのSSL証明書をインポートしました。次に、クライアントアプリケーションの新しいJKSファイルをトラストストアとして使用しました。
System.setProperty("javax.net.ssl.trustStore",path_to_your_cacerts_file);
私は(KeyStore Explorer)ツールを使って新しいJKSを作成します。このリンクからダウンロードすることができます、 KeyStore Explorer 。
Spring Boot 1.4.1(またはそれ以降)にアップグレードした後にも、この依存関係の一部として Tomcat 8.5.5がもたらされるため、このエラーが発生することもあります。
問題はTomcatがトラストストアを処理する方法によるものです。 Spring Bootの設定でトラストストアの場所をキーストアと同じ場所に指定した場合は、アプリケーションの起動時にtrustAnchors parameter must be non-empty
メッセージが表示される可能性があります。
server.ssl.key-store=classpath:server.jks
server.ssl.trust-store=classpath:server.jks
必要であるとわかっていない限り、server.ssl.trust-store
設定を削除するだけです。その場合は、以下のリンクを参照してください。
次の問題には、問題に関する詳細が含まれています。
私はまた、古いJava 6が使われていてHTTPS URLにアクセスしようとしていたときに、OS X v10.9(Mavericks)をアップデートした後にOS Xでこれに遭遇しました。修正はPeter Kriensの逆でした。 cacerts
を1.7スペースから1.6バージョンでリンクされている場所にコピーする必要があります。
(as root)
umask 022
mkdir -p /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security
cp $(/usr/libexec/Java_home -v 1.7)/jre/lib/security/cacerts \
/System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security
Windows 10とopenjdkでは、空のcacertsファイルをバイナリと一緒に配布していました。バグはここで説明されています: https://github.com/AdoptOpenJDK/openjdk-build/issues/555
adoptOpenJdk8\jre\lib\security\cacerts
のような古いインスタレーションからファイルをc:\Program Files\Java\jdk1.8.0_192\jre\lib\security\cacerts
にコピーすることができます。
AdoptOpenJDKバギーバージョンは https://github.com/AdoptOpenJDK/openjdk8-releases/releases/download/jdk8u172-b11/OpenJDK8_x64_Win_jdk8u172-b11.Zip です。
System.setProperty("javax.net.ssl.trustStore", "C:\\Users\\user-id\\Desktop\\Tomcat\\cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "passwd");
上記の2行をコードに追加する必要があります。トラストストアが見つかりません。
私はAndroid SDK sdkmanagerでこの問題に遭遇しました。私にとってこの解決策はうまくいった:
'cacert'ファイルは小さいものでした(22B)。私はppa:webupd8team/JavaからOracle-Java8-installerをインストールしました(このマニュアルによると https://docs.nativescript.org/start/ns-setup-linux )。
私がインターネットで見つけた解決策はどれもうまくいきませんでしたが、 Peter Kriensの答え の修正版が仕事をしているようです。
まず、/usr/libexec/Java_home
を実行して、Javaフォルダーを見つけます。私にとっては、1.6.0.jdk
バージョンでした。次に、そのlib/security
サブフォルダー(私にとっては/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security
)に移動します。
次に、cacerts
ファイルが既にある場合は削除し、Sudo find / -name "cacerts"
を使用してシステム上で検索します。 Xcodeのバージョンやインストールした他のアプリケーションだけでなく、選択した/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts
にも複数のアイテムが見つかりました。
そのファイルを使用して、(以前のJavaフォルダー内で)Sudo ln -fsh "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts"
にシンボリックリンクを作成すると、動作するはずです。
私は両方を持っています-Java Appleの2017-001ダウンロードから( https://support.Apple.com/kb/dl1572 -正しい証明書がどこから来たと思いますか) Oracleの Mac OS X v10.12 (Sierra)にインストールされています。
ppa:openjdk-r/ppaのopenjdk 11を使ったubuntu 14.04ではこれは私のために働きました:
java.securityでキーストアの種類をに変更します
keystore.type=jks
その後:
Sudo dpkg --purge --force-depends ca-certificates-Java
Sudo apt-get install ca-certificates-Java
それがうまくいったかどうかをチェックするとき、古いJavaがまだ実行されているデーモンを使用していないことを確認してください(例えば、gradleのための--no-daemon
オプション)。
このバグはすべてをうまく説明しており、何が起こっているのかを理解するのに役立ちます https://bugs.launchpad.net/ubuntu/+ source/ca-certificates-Java/+ bug/1739631
Ubuntu 14.04 (Trusty Tahr)でテストするためにAndroidの特定のスイートを実行している間、私はこの問題に直面しました。 shaheenが示唆しているように、2つのことが私にとって役に立ちました。
Sudo update-ca-certificates -f
Sudo /var/lib/dpkg/info/ca-certificates-Java.postinst configure
もう1つの理由は、実際には有効なエラーです。いくつかの悪意のあるWi-Fiホットスポットは、証明書と 中間者攻撃 あなたがなにを知っているか(あなたは逃げろ!)を台無しにするでしょう。
大規模な雇用主の中には、特に機密性の高いネットワークゾーンでこれと同じトリックを実行するため、暗号化されたすべてのトラフィックを監視できる場合があります(エンドユーザーの観点からは好ましくありませんが、これには理由があります)。
Ubuntuの場合:
Sudo aptインストールca-certificates-Java
または
Sudo apt-get ca-certificates-Javaをインストールしてください
私のためにそれをソートしました。
#PKCS12形式のIBM Websphere JDKキーツールを使用してエクスポートされたトラストストアを使用し、Oracle JRE上のそのファイルを使用してSSLを介して通信しようとすると、このエラーが発生しました。
私の解決策は、IBM JRE上で実行するか、IBM Websphereキーツールを使用してトラストストアをJKSに変換することでしたので、Oracle JRE内で実行することができました。
IntelliJ IDEA 14にGradleプロジェクトをインポートしているときに、この問題に直面しました。プロジェクトディレクトリのラッパーの代わりにGradleのローカルコピーを使用していました。
実際にはあなただけが実行する必要があります:
Sudo chmod +x ./gradlew(your script)
Red Hat Linuxでは、証明書を/etc/pki/Java/cacerts
にインポートすることでこの問題を解決しました。
Ubuntu 18.04では、古いプロジェクトのメンテナンスにOpenJDK 1.7を使用する必要がありました。バイナリパッケージをダウンロードしました。しかし、スクリプトを実行すると、同じエラーが発生しました。
解決策は、ダウンロードしたJDKのcacerts
ファイルをjre/lib/security
フォルダーから削除し、それを/etc/ssl/certs/Java/
のシステムcacerts
ファイルへのシンボリックリンクとして作成することでした。
Sudo ln -s /etc/ssl/certs/Java/cacerts /path/to/downloaded/Java/jre/lib/security/cacerts
私は電子メールを送るとき同じエラーを得ました、しかしNOT常に。私の場合は、毎回新しい Session オブジェクトを取得するように1行のコードを変更しました。
MimeMessage message = new MimeMessage(Session.getDefaultInstance(props, authenticator));
に
MimeMessage message = new MimeMessage(Session.getInstance(props, authenticator));
それ以来、電子メールの送信は毎回機能します。
私が得たエラー:
javax.mail.MessagingException:ソケットをTLSに変換できませんでした。
ネストされた例外はjavax.net.ssl.SSLExceptionです。
Java.lang.RuntimeException:予期しないエラー:
Java.security.InvalidAlgorithmParameterException:trustAnchors
パラメーターは、以下の時点で空ではないはずです。
com.Sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.Java:1907)
com.Sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.Java:666)
javax.mail.Service.connect(Service.Java:317)
javax.mail.Service.connect(Service.Java:176)
javax.mail.Service.connect(Service.Java:125)
javax.mail.Transport.send0(Transport.Java:194)
javax.mail.Transport.send(Transport.Java:124)
このエラーの別の理由は、Ubuntuとは関係ありません。
Spring boot 2アプリで相互TLSを設定しようとしましたが、秘密キーエントリのみがあり、信頼できる証明書エントリがないトラストストアを使用した後にこの問題に遭遇しました。
これは私のSpring Boot TLS構成です
server.port=8443
server.ssl.key-alias=oba-tls
server.ssl.key-password=mypw
server.ssl.key-store-password=mypw
server.ssl.key-store=classpath:keys/tls-keystore.pfx
server.ssl.key-store-type=PKCS12
server.ssl.enabled=true
server.ssl.client-auth=need
server.ssl.trust-store=classpath:keys/truststore.pfx
server.ssl.trust-store-password=mypw
server.ssl.trust-store-type=PKCS12
server.ssl.ciphers=ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-SHA384
server.ssl.protocol=TLS
server.ssl.enabled-protocols=TLSv1.2
Truststore.pfxを生成するには、次のコマンドを使用して機能させる必要がありました。
openssl req -newkey rsa:2048 -nodes -keyout private.key -x509 -out cert.crt
keytool -importcert -alias oba-trust -file cert.crt -keystore truststore.jks
keytool -importkeystore -srckeystore truststore.jks -destkeystore truststore.pfx -srcstoretype JKS - deststoretype PKCS12 -deststorepass yourpassword
私は同じエラーがあり、問題はJDKの設定ではなく、「trust-store:」パラメータの下のapplication.propertiesファイルのjksファイルへの単純な間違ったパスであり、パスが正しいかどうかを再確認してください。
私にとっては、Jenkinsプラグイン「Email Extension Plugin」を最新バージョン(2.61)にアップグレードするだけで解決しました。
これら2つのプラグインはJenkinsの電子メール設定を担当します。