Kesalahan - parameter trustAnchors harus kosong

492

Saya mencoba mengonfigurasi email saya di Jenkins / Hudson, dan saya terus-menerus menerima kesalahan:

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be
    non-empty

Saya telah melihat sejumlah besar informasi online tentang kesalahan tersebut, tetapi saya belum dapat pekerjaan apa pun. Saya menggunakan Sun's JDK di Fedora Linux (bukan OpenJDK).

Ini beberapa hal yang sudah saya coba. Saya mencoba mengikuti saran dari posting ini , tetapi menyalin cacerts dari Windows ke kotak Fedora saya hosting Jenkins tidak bekerja. Saya mencoba mengikuti panduan ini karena saya mencoba mengkonfigurasi Gmail sebagai server SMTP saya, tetapi tidak berhasil juga. Saya juga mencoba mengunduh dan memindahkan file-file cacert secara manual dan memindahkannya ke folder Java saya menggunakan variasi perintah pada panduan ini .

Saya terbuka untuk semua saran karena saya saat ini mandek. Saya mendapatkannya dari server Windows Hudson, tetapi saya kesulitan di Linux.

David Gill
sumber

Jawaban:

513

Pesan aneh ini berarti bahwa truststore yang Anda tentukan adalah:

  • kosong,
  • tidak ditemukan, atau
  • tidak dapat dibuka (karena izin akses misalnya).

Lihat juga jawaban @ AdamPlumb di bawah ini .

Untuk men-debug masalah ini (saya menulis tentang ini di sini ) dan memahami apa yang digunakan truststore, Anda dapat menambahkan properti javax.net.debug = semua dan kemudian menyaring log tentang truststore. Anda juga dapat bermain dengan javax.net.ssl.trustStore properti untuk menentukan truststore tertentu. Sebagai contoh :


    java -Djavax.net.debug=all -Djavax.net.ssl.trustStore=/Another/path/to/cacerts -jar test_get_https-0.0.1-SNAPSHOT-jar-with-dependencies.jar https://www.calca.com.py 2>&1| grep -i truststore
Marquis dari Lorne
sumber
1
Terima kasih EJP, saya melihat posting Anda di sini tetapi saya tidak yakin bagaimana memverifikasi truststore ada di sana. Saya juga membuka file server.xml saya, tetapi saya tidak yakin cara memverifikasi truststore. Apakah saya hanya memeriksa pref keystoreFile = "conf / .keystore" (keystoreFile tidak ada dalam file itu)?
David Gill
2
Jawabannya adalah bagaimana saya mengimpornya. Saya sepertinya telah melewatkan langkah penting. Lihat [Java Error InvalidAlgorithmParameterException] [1] [1]: jyotirbhandari.blogspot.com/2011/09/...
David Gill
2
Dikonfirmasi jawaban ini benar. Saya mendapatkan kesalahan di bawah Tomcat. Saya memiliki truststore saya ${CATALINA_HOME}\conftetapi CATALINA_HOMEtidak siap sehingga Tomcat mencari di bawah \conftruststore.
SingleShot
4
@BubblewareTechnology Tidak, kesalahan ada pada nama file, bukan pada bagaimana Anda mengimpor sertifikat ke dalam file. Blog Anda tidak benar. Anda juga sebaiknya tidak memodifikasi file JRE $ / cacerts. Ini akan mengubah upgrade Java berikutnya. Anda memerlukan proses yang menyalinnya, menambahkan sertifikat Anda sendiri ke salinannya, dan menggunakan salinan itu sebagai truststore. Ulangi setiap peningkatan Java. Dan Anda tidak perlu memberi tahu Jawa tentang perwaliannya sendiri, hanya tentang Jawa sendiri, jika berbeda.
Marquis of Lorne
3
Saya akan menambahkan twist: bahkan ketika truststore ada, dapat diakses, berada dalam format yang tepat, jika benar-benar KOSONG, itu kesalahan yang bisa Anda dapatkan dengan berbagai perpustakaan (termasuk Apache HttpClient).
Alan Franzoni
265

Di Ubuntu 18.04 , kesalahan ini memiliki penyebab berbeda (JEP 229, beralih dari jksformat default keystore ke pkcs12format, dan pembuatan file cacerts Debian menggunakan default untuk file baru) dan solusinya :

# 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

Status (2018-08-07) , bug telah diperbaiki di Ubuntu Bionic LTS 18.04.1 dan Ubuntu Cosmic 18.10.


🗹 Ubuntu 1770553: [SRU] backport ca-sertifikat-java dari cosmic (20180413ubuntu1)

🗹 Ubuntu 1769013: Silakan gabungkan ca-sertifikat-java 20180413 (utama) dari Debian tidak stabil (utama)

🗹 Ubuntu 1739631: Instalasi baru dengan JDK 9 tidak dapat menggunakan file keystore cacerts PKCS12 yang dihasilkan

🗹 docker-library 145: Gambar 9-jdk memiliki masalah SSL

🗹 Debian 894979: ca-sertifikat-java: tidak bekerja dengan OpenJDK 9, aplikasi gagal dengan InvalidAlgorithmParameterException: parameter trustAnchors harus non-kosong

🗹 JDK-8044445: JEP 229: Buat Keystores PKCS12 secara Default

🖺 JEP 229: Buat Keystores PKCS12 secara Default


Jika masalah berlanjut setelah penyelesaian ini, Anda mungkin ingin memastikan bahwa Anda benar-benar menjalankan distribusi Java yang baru saja Anda perbaiki.

$ which java
/usr/bin/java

Anda dapat mengatur alternatif Java ke 'otomatis' dengan:

$ sudo update-java-alternatives -a
update-alternatives: error: no alternatives for mozilla-javaplugin.so

Anda dapat memeriksa ulang versi Java yang Anda jalankan:

$ 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)

Ada solusi alternatif juga, tetapi mereka memiliki efek samping sendiri yang akan membutuhkan perawatan tambahan di masa depan, tanpa imbalan apa pun.

Solusi terbaik berikutnya adalah menambahkan baris

javax.net.ssl.trustStorePassword=changeit

ke file

/etc/java-9-openjdk/management/management.properties
/etc/java-11-openjdk/management/management.properties

mana yang ada.

Solusi ketiga yang paling tidak bermasalah adalah mengubah nilai

keystore.type=pkcs12

untuk

keystore.type=jks

dalam file

/etc/java-9-openjdk/security/java.security
/etc/java-11-openjdk/security/java.security

mana saja yang ada, dan kemudian hapus cacertsfile dan buat kembali dengan cara yang dijelaskan pada baris terakhir dari script pemecahan masalah di bagian atas posting.

Mikael Gueck
sumber
50
Pengguna Ubuntu 18, baca ini! ini akan menghemat banyak jam hidup Anda! Terima kasih!
vak
5
Jawaban ini membantu saya untuk memperbaiki kesalahan yang sama dengan pakar pada Ubuntu 18.04. Saya harus mengubah pemilik file / etc / ssl / certs / java / cacerts dari root ke saya sendiri untuk dapat menulisnya. Lalu aku mengembalikannya.
Yuri Gor
77
Saya menjalankan sudo rm / etc / ssl / certs / java / cacerts dan kemudian sudo update-ca-sertifikat -f dan ini memperbaiki masalah saya di kubuntu 18.04.
jsn
2
@ jsn, terima kasih atas solusinya, bekerja di linux mint 19 juga yang didasarkan pada ubuntu 18.04
Samrat
2
Solusi @ jsn juga bekerja untuk Debian Stretch + openjdk8
HRJ
105

Ini memperbaiki masalah saya di Ubuntu:

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure

(ditemukan di sini: https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1396760 )

ca-certificates-java bukan ketergantungan pada Oracle JDK / JRE jadi ini harus diinstal secara eksplisit.

Michael Condouris
sumber
2
Terima kasih, ini memperbaiki masalah saya ketika saya menemukannya di Ubuntu 15.04.
Macil
Bekerja pada Raspbian di Raspberry Pi
Defozo
1
Mengalami masalah ini dengan backports stabil Debian jesse dengan OpenJDK8 dan ini memperbaiki masalah. Sedang menggunakan ini saat membangun gambar Docker. :)
Tuxdude
9
Sayangnya, tidak berfungsi di Ubuntu MATE 18.04. Saya akan mencoba menginstal ulang Java.
Pranav A.
1
@codefx - Saya telah melakukan apa yang Anda sarankan dan tidak berfungsi - pada Ubuntu 18.x dengan Java 10 (default).
mzedeler
69

Pada Ubuntu 18.04 akar penyebabnya adalah konflik antara openjdk-11-jdk (yang merupakan standar) dan paket lain tergantung padanya. Ini sudah diperbaiki di Debian dan akan dimasukkan dalam Ubuntu segera. Sementara itu solusi paling sederhana adalah dengan menurunkan java Anda ke versi 8. Solusi lain menggunakan ca-certificates-javajauh lebih rumit.

Pertama-tama hapus paket yang bertentangan:

sudo apt-get remove --purge openjdk* java-common default-jdk
sudo apt-get autoremove --purge

Periksa apakah Anda berhasil menghapus semua paket terkait dengan:

sudo update-alternatives --config java

Sistem akan meminta Anda tidak ada Java yang tersedia untuk dikonfigurasi , jika tidak solusi ini gagal .

Kemudian instal ulang paket yang diperlukan:

sudo apt-get install openjdk-8-jdk
shvahabi
sumber
Deskripsi ini sebenarnya tidak benar, dan hanya memperbaiki masalah dalam arti yang sama seperti menginstal ulang Windows dapat memperbaiki masalah. Tidak perlu menghapus semua paket Java. Jika Anda ingin pergi dengan cara ini, Anda hanya perlu menginstal openjdk-8-jdkpaket, menghapus /etc/ssl/certs/java/cacertsfile, dan menjalankan sudo update-ca-certificates -fyang merupakan cara bundaran beralih dari pkcs12file cacerts diformat ke yang jksdiformat, seperti yang dijelaskan di tempat lain di utas ini.
Mikael Gueck
1
@MikaelGueck Walaupun nampaknya logika ada di pihak Anda, saya di sini untuk meyakinkan Anda bahwa saya sebelumnya telah melakukan apa yang dijelaskan dalam komentar Anda dan di sebagian besar pilihan suara lainnya, dan pada 18,04 ini adalah satu-satunya jawaban yang berhasil . Saya pikir downvote Anda harus berubah menjadi upvote, atau setidaknya menghilang, karena itu sangat tidak pantas.
Andrea Ligios
@AndreaLigios, Anda dapat membaca skrip sendiri, mereka cukup singkat. Mereka memiliki satu set jalur JAVA_HOME hardcoded dari 8 hingga 10, mereka mencoba satu per satu, mereka memanggil generator file Debian CA yang juga dapat Anda baca, yang menggunakan format file yang ada, karena kode penangan file keyfile JDK, yang Anda dapat membaca, memiliki mode fallback kompatibilitas. Jika komputer Anda menjalankan perangkat lunak sederhana ini secara berbeda, Anda mungkin memiliki masalah lain dengan itu. Apakah Anda memodifikasi alternatif java Anda, dan memanggil beberapa JVM lainnya, karena kemudian menghapus mungkin telah mengatur ulang alternatif?
Mikael Gueck
1
@MikaelGueck ya, di salah satu percobaan sebelumnya saya telah memodifikasi alternatif java saya, jadi mungkin itu. Saya orang pertama yang suka menggali kode sumber dan menemukan cara kerjanya, tapi hari ini bukan tujuan saya, itu hanya satu di antara 5-6 hambatan tak terduga yang berbeda yang saya miliki dalam perjalanan ke tujuan saya yang sebenarnya. Jawaban ini memungkinkan saya untuk menyelesaikan masalah dalam waktu kurang dari 2 menit! Berapa banyak waktu yang harus saya habiskan untuk melihat ke dalam skrip dan menemukan solusi yang lebih baik? Dan untuk apa, untuk menghemat beberapa megabyte? Ini drastis, tetapi berhasil (dan tidak peduli apa masalahnya), jadi terima kasih yang sebesar-besarnya kepada OP untuk mereka yang sibuk sekali
Andrea Ligios
1
Saya telah mencari solusi selama 2 hari, dan jawaban Anda memecahkan masalah saya, terima kasih. Saya baru saja pindah ke Kubuntu 18.04, ini berhasil.
guepardomar
55

EJP pada dasarnya menjawab pertanyaan (dan saya menyadari ini memiliki jawaban yang diterima), tetapi saya hanya berurusan dengan gotcha kasus tepi ini dan ingin mengabadikan solusi saya.

Saya memiliki InvalidAlgorithmParameterExceptionkesalahan pada Jira yang di-host server yang sebelumnya saya atur untuk akses khusus-SSL. Masalahnya adalah bahwa saya telah mengatur keystore saya dalam format PKCS # 12, tetapi truststore saya dalam format JKS.

Dalam kasus saya, saya telah mengedit server.xmlfile saya untuk menentukan keystoreType ke PKCS, tapi saya tidak menentukan truststoreType, jadi defaultnya adalah apa pun keystoreType. Menentukan truststoreType secara eksplisit ketika JKS menyelesaikannya untuk saya.

Adam Plumb
sumber
baik, saya membantu Anda mengabadikan solusi untuk Gotcha case-edge Anda. di situlah ia menjadi menarik.
n611x007
2
Ini persis masalah saya. Saya menggunakan Spring Boot 1.4.2.RELEASE, dan memiliki perangkat keras keystore dan peranti lunak truststore. Saya menentukan penyedia dan jenis untuk keystore, tetapi bukan truststore. Akibatnya, penyedia dan jenis yang salah digunakan oleh truststore. Menentukan mereka (SUN dan JKS) memecahkan masalah.
Kenco
12
bagaimana tepatnya Anda melakukan ini? (windows disini)
tatsu
2
Bertemu dengan ini dengan Android grandle saya hari ini, saya hampir mengerti apa yang Anda katakan tetapi Anda tidak mengatakan bagaimana menyelesaikannya. Jawaban yang tidak membantu
Lothar
52

Saya mengalami solusi ini dari posting blog Memperbaiki masalah trustAnchors ketika menjalankan OpenJDK 7 pada OS X :

Memperbaiki masalah trustAnchors saat menjalankan OpenJDK 7 pada OS X. Jika Anda menjalankan OpenJDK 7 pada OS X dan telah melihat pengecualian ini:

Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors
    parameter must be non-empty

Ada perbaikan sederhana. Cukup tautkan dalam file cacerts yang sama dengan yang digunakan JDK 1.6 Apple:

cd $(/usr/libexec/java_home -v 1.7)/jre/lib/security
ln -fsh /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts

Anda perlu melakukan ini untuk setiap versi OpenJDK yang telah Anda instal. Ubah saja -v 1.7ke versi yang ingin Anda perbaiki. Jalankan /usr/libexec/java_home -Vuntuk melihat semua JRE dan JDK yang telah Anda instal.

Mungkin orang-orang OpenJDK dapat menambahkan ini ke skrip instalasi mereka.

Peter Kriens
sumber
1
Perintah "ln" saya (pada OSX 10.6.8) tidak memiliki opsi "h"; apa yang harus dilakukan?
Andrew Swan
1
Ah, saya punya dua perintah "ln", satu di / usr / bin (default) dan satu di / bin; yang terakhir memiliki opsi "h" dan bekerja.
Andrew Swan
Saya memperbaiki instalasi 1.6 saya yang rusak yang menghubungkan ke cacerts dari instalasi sistem 1.8 dengan teknik ln ini. Terima kasih!
A21z
1
Untuk pembaca masa depan: tampaknya bahwa Anda juga membutuhkan file lain 3 yang berada di securityfolder ( blacklisted.certs, local_policy.jar, dan US_export_policy.jar) untuk Java untuk menjadi bahagia.
awksp
@ Peter Kriens, mengapa ditautkan ke cacertsdalam jredirektori?
BAE
45

Di Ubuntu 12.10 (Quantal Quetzal) atau lebih baru, sertifikat disimpan dalam paket ca-sertifikat-java . Menggunakan -Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacertsakan mengambilnya terlepas dari apa JDK yang Anda gunakan.

yvesr
sumber
54
Saya menemukan saya harus menjalankan update-ca-certificates -fsecara manual, untuk mengisi file cacerts
Portablejim
4
@Portablejim Terima kasih. Komentar Anda memecahkan masalah pertama yang saya buat membangun Apache Spark di Ubuntu 15.04beta.
Paul
1
Terima kasih @Portablejim, komentar Anda berhasil untuk saya di Ubuntu 15.04.
David Berg
Terima kasih. Ini memperbaiki masalah saya dengan PhpStrom + patched JDK. Saya menulis kunci ini ke file "phpstorm64.vmoptions".
Vijit
Tidak bekerja untuk saya di ubuntu 18.04 dan JDK 1.8.0_62
Devendra Singraul
34

Saya mengalami masalah ini pada OS X, menggunakan JDK 1.7, setelah memutakhirkan ke OS X v10.9 (Mavericks). Perbaikan yang berhasil bagi saya adalah menginstal ulang versi Apple Java, tersedia di http://support.apple.com/kb/DL1572 .

KiwiMartin
sumber
Saya mengalami ini dengan Java 6 yang digunakan oleh Grails di OSX. Saya juga menginstal Java 7 dari Oracle dan juga meningkatkannya ke Mavericks. Menginstal ulang Java 6 dari situs web Apple juga memperbaiki masalah bagi saya.
pm_labs
Mengalami hal ini ketika menginstal jdk 6 terbuka ke kotak cloud ubuntu. Senang melihat wajah yang akrab, BTW
Ben Hutchison
30

Saya berlari

sudo update-ca-certificates -f

untuk membuat file sertifikat, dan kemudian:

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure

Saya kembali dalam bisnis, terima kasih kawan. Sangat disayangkan itu tidak termasuk dalam instalasi, tapi aku sampai di sana pada akhirnya.

Johnny
sumber
Ketika saya menjalankan sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure**saya mendapatkansudo: /var/lib/dpkg/info/ca-certificates-java.postinst: command not found
Magick
Hanya sudo update-ca-certificates -fcukup pada jessie Debian dengan openjdk-8-jre-headlessdari jessie-backports, selama ca-certificates-javadiinstal. Saya pikir urutan masalah instalasi (JRE setelah ca-certificates-javadapat menyebabkan ini, karena yang terakhir tidak memiliki pemicu untuk Java 8 yang di-backport).
mirabilos
2
sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure tanpa bintang **
Yu Jiaao
update-ca-certificates -fadalah hal yang memperbaikinya. Saya tidak membutuhkan perintah ke-2
Mark Jeronimus
17

Kesalahan mengatakan bahwa sistem tidak dapat menemukan truststore di jalur yang disediakan dengan parameter javax.net.ssl.trustStore.

Di bawah Windows saya menyalin cacertsfile dari jre/lib/securityke direktori instalasi Eclipse (tempat yang sama dengan eclipse.inifile) dan menambahkan pengaturan berikut di eclipse.ini:

-Djavax.net.ssl.trustStore=cacerts
-Djavax.net.ssl.trustStorePassword=changeit
-Djavax.net.ssl.trustStoreType=JKS

Saya punya beberapa masalah dengan path ke cacerts (variabel% java_home% environment entah bagaimana ditimpa), jadi saya menggunakan solusi sepele ini.

Idenya adalah untuk menyediakan jalur yang valid ke file truststore - idealnya akan menggunakan yang relatif. Anda juga dapat menggunakan jalur absolut.

Untuk memastikan jenis toko adalah JKS, Anda akan menjalankan perintah berikut:

keytool -list -keystore cacerts

Keystore type: JKS
Keystore provider: SUN
Razvanone
sumber
2
Ini adalah satu-satunya jawaban yang benar-benar berhasil. Terima kasih @razvanone
Akshar Patel
1
Saya berhasil mengenai satu "gotcha" kecil: Tiga baris dalam file eclipse.ini harus berada pada tiga baris terpisah yang sebenarnya. Saya awalnya menempatkan mereka semua dalam satu baris dan gerhana tidak mengambilnya.
SiKing
16

Menghapus paket java-sertifikat-java dan menginstalnya lagi bekerja untuk saya ( Ubuntu MATE 17.10 (Artful Aardvark)).

sudo dpkg --purge --force-depends ca-certificates-java

sudo apt-get install ca-certificates-java

Terima kasih, jdstrand: Komentar 1 untuk bug 983302, Re: ca-sertifikat-java gagal menginstal Java cacerts di Oneiric Ocelot .

ericek111
sumber
11

Saya mengalami banyak masalah keamanan setelah memutakhirkan ke OS X v10.9 (Mavericks):

  • Masalah SSL dengan Amazon AWS
  • Rekan tidak diautentikasi dengan Maven dan Eclipse
  • trustAnchors parameter harus kosong

Saya menerapkan pembaruan Java ini dan memperbaiki semua masalah saya: http://support.apple.com/kb/DL1572?viewlocale=en_US

Freddy Boucher
sumber
5
Ugh. Java 6 sudah bertahun-tahun melewati ujung dukungan publik, dan pasti penuh dengan celah keamanan. Apple membuatnya tersedia untuk diunduh sehingga perangkat lunak lama yang tidak dapat dijalankan dengan Java 7/8 dapat terus dieksekusi, tetapi itu tidak boleh digunakan untuk membuat koneksi SSL ke layanan di internet publik, seperti 1. AWS, 2. Maven Pusat, 3. hal lain.
Zac Thompson
10

Saya mengharapkan hal-hal seperti ini, karena saya menggunakan JVM alternatif di Talend Open Studio saya (dukungan saat ini hanya ada sampai JDK 1.7). Saya menggunakan 8 untuk tujuan keamanan ... pokoknya

  • Perbarui toko sertifikat Anda:

    sudo update-ca-certificates -f

kemudian

  • tambahkan nilai baru dalam parameter inisialisasi Anda

    sudo gedit $(path to your architecture specific ini i.e. TOS_DI...ini)
    
    Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts

Bagi saya, entri kedua berhasil. Saya pikir, tergantung pada versi Talend Open Studio / TEnt + JVM, ia memiliki nama parameter yang berbeda, tetapi mencari file keystore yang sama.

steveoams
sumber
4
Dari mana Anda mendapatkan properti itu javax.net.ssl.trustAnchors? Itu tidak disebutkan dalam dokumentasi JSSE.
Marquis of Lorne
10

Bagi saya itu disebabkan oleh kurangnya sertifikat kepercayaan di truststore.

Untuk menguji, gunakan:

keytool -list -keystore keystore.jks

Ini memberi saya:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

cert-alias, 31-Jul-2017, PrivateKeyEntry

Meskipun PrivateKeyEntry saya mengandung CA, ia perlu diimpor secara terpisah :

keytool -import -alias root-ca1 -file rootca.crt -keystore keystore.jks

Itu mengimpor sertifikat, dan kemudian menjalankan kembali keytool -list -keystore keystore.jkssekarang memberikan:

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>

Sekarang ia memilikiCertEntry tepercaya, dan Tomcat akan mulai dengan sukses.

muttonUp
sumber
NB periksa tutorial baeldung dengan Makefile yang berguna sebagai jalan pintas untuk membuat keystore & truststore (proyek spring-security-x509) baeldung.com/x-509-authentication-in-spring-security
hello_earth
9

Beberapa rilis OpenJDK vendor menyebabkan ini dengan memiliki cacertsfile kosong didistribusikan dengan biner. Bug dijelaskan di sini: https://github.com/AdoptOpenJDK/openjdk-build/issues/555

Anda dapat menyalin ke adoptOpenJdk8\jre\lib\security\cacertsfile dari instalation lama sepertic:\Program Files\Java\jdk1.8.0_192\jre\lib\security\cacerts .

Versi buggy AdoptOpenJDK adalah https://github.com/AdoptOpenJDK/openjdk8-releases/releases/download/jdk8u172-b11/OpenJDK8_x64_Win_jdk8u172-b11.zip

raisercostin
sumber
Saya pikir ini juga berlaku bagi saya. Di AdoptOpenJDK 202 bug ini ada, dan di 222 berfungsi. Jadi perbarui jdk Anda jika memungkinkan.
Marty
6

Jika Anda mengalami ini di Ubuntu dengan JDK9 dan Maven, Anda dapat menambahkan opsi JVM ini - periksa dulu apakah ada jalur:

-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts

Jika file tidak ada, coba instal ca-sertifikat-java seperti yang dicatat orang:

sudo apt install ca-certificates-java
dmatej
sumber
Jika Anda menggunakan buruh pelabuhan maka Anda juga dapat mencoba gambar "maven: 3-jdk-9-slim" alih-alih "maven: 3-jdk-9"
Konstantin Pavlov
Terima kasih, ini bekerja untuk saya untuk openjdk-8-jdk di ubuntu 18.04
Aftab Naveed
4

Saya mendapat pesan kesalahan ini pada Java 9.0.1 di Linux. Itu karena bug yang diketahui dari JDK, di mana file cacerts kosong dalam paket biner .tar.gz (diunduh dari http://jdk.java.net/9/ ).

Lihat paragraf "masalah yang diketahui" pada JDK 9.0.1 Catatan Rilis , mengatakan "TLS tidak bekerja secara default pada OpenJDK 9".

Pada Debian / Ubuntu (dan mungkin turunan lainnya), solusi sederhana adalah mengganti file cacerts dengan yang dari paket "ca-Certificate-java":

sudo apt install ca-certificates-java
cp /etc/ssl/certs/java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts

Di Red Hat Linux / CentOS, Anda dapat melakukan hal yang sama dari paket "ca-sertifikat":

sudo yum install ca-certificates
cp /etc/pki/java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts
Mossroy
sumber
4

Saya mengalami masalah ini ketika mencoba menggunakan Maven 3, setelah memutakhirkan dari Ubuntu 16.04 LTS (Xenial Xerus) ke Ubuntu 18.04 LTS (Bionic Beaver).

Memeriksa / usr / lib / jvm / java-8-oracle / jre / lib / keamanan menunjukkan bahwa file cacerts saya adalah tautan simbolis yang menunjuk ke /etc/ssl/certs/java/cacerts .

Saya juga memiliki file yang mencurigakan cacerts.original.

Saya berganti nama cacerts.originalmenjadi cacerts, dan itu memperbaiki masalah.

John Deverall
sumber
The cacerts.originalberkas itu di jksformat, dan dihasilkan dengan Ubuntu 16.04 Java 8, yang digunakan bahwa format sebagaimana default. The cacertsberkas itu dalam pkcs12format yang dihasilkan oleh Ubuntu 18.04 ini Java 10, yang menggunakan format ini sebagai default. Seperti yang dijelaskan di bagian lain di utas ini, format baru mengharuskan Anda meneruskan kata sandi ke file yang dapat dieksekusi. Tetapi selama Anda menghasilkan jks cacertsfile kosong baru atau menyalin yang lama, proses pembuatan generasi berikutnya akan mengosongkan file yang sudah ada, dan mengisinya dengan sertifikat CA dari sistem file.
Mikael Gueck
3

Saya juga menemukan ini pada OS X setelah memperbarui OS X v10.9 (Mavericks), ketika Java 6 lama digunakan dan mencoba mengakses URL HTTPS. Cara mengatasinya adalah kebalikan dari Peter Kriens; Saya perlu menyalin cacertsdari ruang 1,7 ke lokasi yang terhubung dengan versi 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
Berawan
sumber
1
Perintah di sini mencoba untuk menyalin direktori ke file; Tidak masuk akal sama sekali.
praseodym
Saya setuju dengan penilaian menggunakan solusi terbalik. Saya menemukan bahwa jdk1.6 memiliki softlink yang rusak /Library/Java/JavaVirtualMachines/1.6.0_33-b03-424.jdk/Contents/Home/lib/security/cacerts -> /System/Library/Java/Support/CoreDeploy.bundle / Isi / Rumah / lib / keamanan / cacerts. Jadi saya rm'ed tautan lunak yang rusak, kemudian menyalin melalui cacerts dari instalasi jdk1.7.
James A Wilson
CATATAN: ketika Anda selesai, Anda harus dapat menyimpan file cacerts yang Anda salin untuk memvalidasi izin.
Gray
Juga, perbaiki cp untuk pergi ke arah yang benar dan menambahkan umask untuk mkdir dan cp.
Gray
3

Dalam kasus saya, file JKS yang digunakan dalam aplikasi klien rusak. Saya membuat yang baru dan mengimpor sertifikat SSL server tujuan di dalamnya. Kemudian saya menggunakan file JKS baru dalam aplikasi klien sebagai toko kepercayaan, seperti:

System.setProperty("javax.net.ssl.trustStore",path_to_your_cacerts_file);

Sumber: Java SSL dan keystore sertifikat

Saya menggunakan alat (KeyStore Explorer) untuk membuat JKS baru. Anda dapat mengunduhnya dari tautan ini, KeyStore Explorer .

Salman
sumber
keystore-explorer melakukan pekerjaan untukku. Anda hanya perlu membuat keystore default dan memeriksa dan menyimpan file sertifikat untuk situs / host.
Shantha Kumara
3

Anda juga dapat mengalami kesalahan ini setelah memutakhirkan ke Spring Boot 1.4.1 (atau yang lebih baru) karena membawa Tomcat 8.5.5 sebagai bagian dari dependensinya.

Masalahnya adalah karena cara Tomcat berurusan dengan toko kepercayaan. Jika Anda telah menetapkan lokasi trust store Anda sama dengan keystore Anda di konfigurasi Spring Boot, Anda mungkin akan mendapatkan trustAnchors parameter must be non-emptypesan saat memulai aplikasi.

server.ssl.key-store=classpath:server.jks
server.ssl.trust-store=classpath:server.jks

Hapus saja server.ssl.trust-storekonfigurasi kecuali Anda tahu bahwa Anda membutuhkannya, dan lihat tautan di bawah ini.

Masalah-masalah berikut ini mengandung lebih banyak detail tentang masalah:

Robert Hunt
sumber
3

Saya mengalami masalah ini dengan SDK Android SDKman. Bagi saya solusi ini berhasil:

  1. Pergi ke /usr/lib/jvm/java-8-oracle/jre/lib/security/
  2. Ganti cacertdengancacert.original

The cacertberkas adalah satu kecil (22B). Saya telah menginstal oracle-java8-installerdari ppa:webupd8team/java(sesuai dengan manual ini: https://docs.nativescript.org/start/ns-setup-linux ).

Tyg
sumber
2

Sebagai catatan, tidak ada jawaban di sini yang bekerja untuk saya. Bangunan Gradle saya mulai gagal secara misterius dengan kesalahan ini, tidak dapat mengambil HEAD dari pusat Maven untuk file POM tertentu .

Ternyata saya telah mengatur JAVA_HOME untuk build OpenJDK pribadi saya, yang telah saya buat untuk debugging masalah javac. Pengaturan kembali ke JDK yang diinstal pada sistem saya memperbaikinya.

pengguna3562927
sumber
... yang menyebabkan truststore tidak ditemukan, seperti jawaban lainnya.
Marquis of Lorne
1
Ya, tetapi mengetahui bahwa truststore tidak dapat ditemukan sama sekali tidak membantu jika Anda tidak tahu mengapa itu tidak ditemukan. Ada banyak cara yang mungkin bisa salah, dan itu menyebalkan ketika tidak ada satu pun dari mereka yang menjadi cara khusus yang gagal untuk sistem Anda sendiri.
user3562927
Semuanya 'kebetulan' adalah kesalahan yang sama: truststore yang ditentukan tidak dapat dibuka atau kosong. Ada sejuta cara di mana situasi ini bisa muncul, dan tidak ada cukup ruang pada SO untuk menyebutkan semuanya.
Marquis of Lorne
1

Di Red Hat Linux, saya mengatasi masalah ini dengan mengimpor sertifikat /etc/pki/java/cacerts.

ak1
sumber
1
System.setProperty("javax.net.ssl.trustStore", "C:\\Users\\user-id\\Desktop\\tomcat\\cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "passwd");

Anda harus menambahkan dua baris di atas ke kode Anda. Ia tidak dapat menemukan truststore.

Divyesh Kalbhor
sumber
2
Jika tidak, itu akan menggunakan truststore JRE, dan itu pasti akan dapat menemukannya. Kesalahan ini disebabkan oleh nilai yang salah dalam parameter ini, bukan ketidakhadirannya. File yang disebutkan dalam kode Anda hanya berlaku untuk instalasi Anda, tidak secara umum.
Marquis of Lorne
Cara yang tepat untuk mengatur properti-properti itu adalah dengan mengirimkannya pada baris perintah: java -Djavax.net.ssl.trustStore=/tmp/cacerts ...atau jika Anda ingin mengaturnya secara global untuk semua program yang dijalankan dengan JDK, tambahkan baris ke file JDK management.properties.
Mikael Gueck
1

Saya menghadapi masalah ini saat menjalankan perangkat Android untuk pengujian pada Ubuntu 14.04 (Trusty Tahr). Dua hal bekerja untuk saya seperti yang disarankan oleh shaheen:

sudo update-ca-certificates -f

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure
DPKGRG
sumber
1

Tidak ada solusi yang saya temukan di Internet yang berfungsi, tetapi versi modifikasi dari jawaban Peter Kriens tampaknya berhasil.

Pertama temukan folder Java Anda dengan menjalankan /usr/libexec/java_home. Bagi saya itu 1.6.0.jdkversinya. Lalu pergi ke lib/securitysubfoldernya (untuk saya /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security).

Kemudian hapus cacertsfile tersebut jika sudah ada dan cari satu di sistem dengan sudo find / -name "cacerts". Ia menemukan banyak item untuk saya, dalam versi Xcode atau aplikasi lain yang telah saya instal, tetapi juga di /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacertsmana saya memilih.

Gunakan file itu dan buat tautan simbolik ke sana (saat berada di dalam folder Java dari sebelumnya) sudo ln -fsh "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts",, dan itu akan berfungsi.

Saya memiliki keduanya - Java dari unduhan Apple 2017-001 ( https://support.apple.com/kb/dl1572 - Saya berasumsi dari situlah sertifikat yang benar berasal) dan yang Oracle terinstal di Mac OS X v10.12 (Sierra) .

shw
sumber
1

pada ubuntu 14.04 dengan openjdk 11 dari ppa: openjdk-r / ppa ini berfungsi untuk saya:

di java.security ubah jenis keystore menjadi

keystore.type=jks

kemudian:

sudo dpkg --purge --force-depends ca-certificates-java
sudo apt-get install ca-certificates-java

ketika Anda memeriksa apakah itu berhasil, pastikan Anda tidak menggunakan daemon apa pun dengan java lama masih berjalan (mis. --no-daemonopsi untuk gradle)

bug ini menjelaskan semuanya dengan baik dan akan membantu Anda memahami apa yang terjadi di https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1739631

piotrek
sumber
1

Di Ubuntu 18.04 saya perlu menggunakan OpenJDK 1.7 untuk pemeliharaan proyek lama. Saya mengunduh paket biner. Tetapi ketika saya menjalankan skrip saya di atasnya saya mendapat kesalahan yang sama.

Solusinya adalah menghapus cacertsfile JDK yang diunduh di jre/lib/securityfolder dan kemudian membuatnya sebagai symlink ke cacertsfile sistem di /etc/ssl/certs/java/:

sudo ln -s /etc/ssl/certs/java/cacerts /path/to/downloaded/java/jre/lib/security/cacerts

Mike
sumber
1

Peluang kecil ini akan membantu siapa pun kecuali .... untuk siapa saja yang menjalankan Java 8 dari Docker Image pada Raspberry Pi (menggunakan AMD CPU) Saya mendapatkan Dockerfile berikut untuk membangun dan menjalankan dengan sukses untuk saya

FROM hypriot/rpi-java
USER root

WORKDIR /usr/build/

RUN /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
RUN update-ca-certificates -f
RUN /var/lib/dpkg/info/ca-certificates-java.postinst configure

EXPOSE 8080

ARG JAR_FILE=target/app-0.0.1-SNAPSHOT.jar

ADD ${JAR_FILE} app.jar

ENTRYPOINT ["java", "-Djavax.net.ssl.trustStorePassword=changeit", "-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts", "-jar", "app.jar"]
Christian Bartram
sumber