Lỗi - tham số trustAnchors phải không trống


492

Tôi đang cố gắng định cấu hình e-mail của mình trên Jenkins / Hudson và tôi liên tục nhận được lỗi:

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

Tôi đã thấy một lượng thông tin trực tuyến tốt về lỗi này, nhưng tôi không có cách nào để làm việc. Tôi đang sử dụng JDK của Sun trên Fedora Linux (không phải OpenJDK).

Dưới đây là một vài điều tôi đã thử. Tôi đã thử làm theo lời khuyên từ bài đăng này , nhưng sao chép các đoạn trích từ Windows sang hộp Fedora của tôi, Jenkins không hoạt động. Tôi đã thử làm theo hướng dẫn này khi tôi đang cố gắng định cấu hình Gmail làm máy chủ SMTP của mình, nhưng nó cũng không hoạt động. Tôi cũng đã cố tải xuống và di chuyển các tệp cacert đó theo cách thủ công và chuyển chúng sang thư mục Java của tôi bằng cách sử dụng một biến thể của các lệnh trong hướng dẫn này .

Tôi sẵn sàng nhận mọi đề xuất vì hiện tại tôi đang bị mắc kẹt. Tôi đã nhận được nó để làm việc từ máy chủ Windows Hudson, nhưng tôi đang vật lộn với Linux.

Câu trả lời:


513

Thông điệp kỳ lạ này có nghĩa là cửa hàng ủy thác mà bạn đã chỉ định là:

  • trống,
  • không tìm thấy, hoặc
  • không thể mở (do quyền truy cập chẳng hạn).

Xem thêm câu trả lời của @ AdamPlumb bên dưới .

Để gỡ lỗi vấn đề này (tôi đã viết về nó ở đây ) và hiểu những gì Truststore đang được sử dụng, bạn có thể thêm thuộc tính javax.net.debug = all và sau đó lọc nhật ký về Truststore. Bạn cũng có thể chơi với thuộc tính javax.net.ssl.trustStore để chỉ định một cửa hàng tin cậy cụ thể. Ví dụ :


    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

1
Cảm ơn EJP, tôi đã thấy bài đăng của bạn ở đây nhưng tôi không chắc làm thế nào để xác minh cửa hàng tin cậy ở đó. Ngoài ra, tôi đã đưa lên tệp server.xml của mình nhưng tôi không chắc chắn làm thế nào để xác minh kho tin cậy được đặt đúng chỗ. Tôi chỉ cần kiểm tra khóa keystoreFile = "conf / .keystore" (keystoreFile không có trong tệp đó)?
David Gill

2
Câu trả lời là với cách tôi nhập khẩu. Tôi dường như đã bỏ lỡ một bước quan trọng. Xem [Lỗi Java không hợp lệ Thuật toánParameterException
David Gill

2
Khẳng định câu trả lời này là đúng. Tôi đã nhận được lỗi theo Tomcat. Tôi đã có cửa hàng ủy thác của mình ${CATALINA_HOME}\confnhưng CATALINA_HOMEkhông được thiết lập nên Tomcat đang tìm kiếm \confcửa hàng ủy thác.
SingleShot

4
@BubblewareT Technology Không, lỗi là ở tên tệp, không phải ở cách bạn nhập chứng chỉ vào tệp. Blog của bạn không đúng. Bạn cũng không nên đề xuất sửa đổi tệp JRE $ / cacerts. Nó sẽ thay đổi nâng cấp Java tiếp theo. Bạn cần một quy trình sao chép nó, thêm chứng chỉ của riêng bạn vào bản sao và sử dụng bản sao làm kho ủy thác. Lặp lại mọi nâng cấp Java. Và bạn không cần phải nói với Java về kho ủy thác của riêng mình, chỉ về riêng bạn, nếu nó khác.
Hầu tước Lorne

3
Tôi sẽ thêm một nút thắt: ngay cả khi kho lưu trữ tin cậy tồn tại, có thể truy cập được, ở định dạng phù hợp, nếu đó là HOÀN TOÀN EMPTY, đó là lỗi bạn có thể gặp phải với các thư viện khác nhau (bao gồm cả Apache httpClient).
Alan Franzoni

265

Trong Ubuntu 18.04 , lỗi này có một nguyên nhân khác (JEP 229, chuyển từ jksđịnh dạng mặc định của kho khóa sang pkcs12định dạng và tạo tệp trích dẫn Debian bằng cách sử dụng mặc định cho các tệp mới) và cách khắc phục :

# 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

Trạng thái (2018-08-07) , lỗi đã được sửa trong Ubuntu Bionic LTS 18.04.1 và Ubuntu Cosmic 18.10.


🗹 Ubuntu 1770553: [SRU] backport ca-chứng-java từ vũ trụ (20180413ubuntu1)

🗹 Ubuntu 1769013: Xin merge ca-chứng-java 20180413 (chính) từ Debian không ổn định (chính)

🗹 Ubuntu 1739631: Fresh cài đặt với JDK 9 không thể sử dụng file cacerts pkcs12 tạo keystore

🗹 Docker-thư viện 145: hình ảnh 9-jdk có vấn đề về SSL

🗹 Debian 894979: ca-cert-java: không hoạt động với OpenJDK 9, các ứng dụng không thành công với UnlimitedAlerskymParameterException: tham số trustAnchors phải không trống

🗹 JDK-8044445: JEP 229: Tạo pkcs12 Keystores theo Mặc định

🖺 JEP 229: Tạo pkcs12 Keystores theo Mặc định


Nếu sự cố vẫn tiếp diễn sau cách giải quyết này, bạn có thể muốn đảm bảo rằng bạn thực sự đang chạy bản phân phối Java mà bạn vừa sửa.

$ which java
/usr/bin/java

Bạn có thể đặt các lựa chọn thay thế Java thành 'tự động' với:

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

Bạn có thể kiểm tra kỹ phiên bản Java bạn đang thực thi:

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

Cũng có những cách giải quyết khác, nhưng những cách này có tác dụng phụ riêng sẽ cần bảo trì thêm trong tương lai, không phải trả bất cứ điều gì.

Cách giải quyết tốt nhất tiếp theo là thêm hàng

javax.net.ssl.trustStorePassword=changeit

đến các tập tin

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

cái nào tồn tại

Cách giải quyết ít vấn đề thứ ba là thay đổi giá trị của

keystore.type=pkcs12

đến

keystore.type=jks

trong các tập tin

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

Bất cứ điều gì tồn tại, và sau đó loại bỏ cacertstệp và tạo lại nó theo cách được mô tả trên hàng cuối cùng của tập lệnh giải pháp ở đầu bài.


50
Người dùng Ubuntu 18, hãy đọc cái này! Điều này sẽ tiết kiệm nhiều giờ trong cuộc sống của bạn! Cảm ơn bạn!
vak

5
Câu trả lời này đã giúp tôi sửa lỗi tương tự với maven trên Ubuntu 18.04. Tôi đã phải thay đổi chủ sở hữu của tập tin / etc / ssl / certs / java / cacerts từ root sang bản thân mình để có thể ghi vào nó. Sau đó tôi chuyển nó trở lại.
Yuri Gor

77
Tôi đã chạy sudo rm / etc / ssl / certs / java / cacerts và sau đó sudo update-ca- cert -f và điều này đã khắc phục sự cố của tôi trong kubfox 18.04.
jsn

2
@jsn, cảm ơn vì các giải pháp, cũng hoạt động trên linux mint 19, dựa trên ubfox 18.04
Samrat

2
Giải pháp của @ jsn cũng hoạt động cho Debian Stretch + openjdk8
HRJ

105

Điều này đã khắc phục sự cố cho tôi trên Ubuntu:

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

(tìm thấy tại đây: https://bugs.launchpad.net/ubfox/+source/ca-certert-java/+orms/1396760 )

ca-certificates-java không phải là một phụ thuộc trong Oracle JDK / JRE vì vậy điều này phải được cài đặt rõ ràng.


2
Cảm ơn, điều này đã khắc phục sự cố cho tôi khi tôi chạy nó trên Ubuntu 15.04.
Macil

Làm việc trên Raspbian trên Raspberry Pi
Defozo

1
Gặp phải vấn đề này với các bản sao lưu ổn định của Debian jlie với OpenJDK8 và điều này đã khắc phục vấn đề này. Đã sử dụng điều này trong khi xây dựng hình ảnh Docker. :)
Tuxdude

9
Thật không hoạt động trên Ubuntu MATE 18.04, thật đáng buồn. Tôi sẽ thử cài đặt lại Java.
Pranav A.

1
@codefx - Tôi đã thực hiện những gì bạn đề xuất và nó không hoạt động - trên Ubuntu 18.x với Java 10 (mặc định).
mzingeler

69

Trên Ubuntu 18.04, nguyên nhân gốc là xung đột giữa openjdk-11-jdk (là mặc định) và các gói khác tùy thuộc vào nó. Nó đã được sửa trong Debian và sẽ sớm được đưa vào Ubuntu. Trong khi đó, cách giải quyết đơn giản nhất là hạ cấp java của bạn sang phiên bản 8. Các giải pháp khác sử dụng ca-certificates-javaphức tạp hơn nhiều.

Đầu tiên loại bỏ các gói xung đột:

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

Kiểm tra xem bạn đã xóa thành công tất cả các gói liên quan chưa:

sudo update-alternatives --config java

Hệ thống sẽ nhắc bạn rằng không có sẵn Java để cấu hình , nếu không thì cách khắc phục này không thành công .

Sau đó cài đặt lại các gói yêu cầu:

sudo apt-get install openjdk-8-jdk

Mô tả này thực tế không chính xác và chỉ khắc phục sự cố theo nghĩa tương tự như cài đặt lại Windows có thể khắc phục sự cố. Không cần phải xóa tất cả các gói Java. Nếu bạn muốn đi theo cách này, bạn chỉ cần cài đặt openjdk-8-jdkgói, xóa /etc/ssl/certs/java/cacertstệp và chạy sudo update-ca-certificates -f, đó là cách chuyển vòng từ pkcs12tệp được định dạng sang tệp jksđược định dạng, như được mô tả ở nơi khác trong chuỗi này.
Mikael Gueck

1
@MikaelGueck Mặc dù logic có vẻ đứng về phía bạn, tôi ở đây để đảm bảo với bạn rằng trước đây tôi đã làm chính xác những gì được mô tả trong bình luận của bạn và trong hầu hết các câu trả lời được bình chọn khác, và trong 18.04 đây là câu trả lời duy nhất có hiệu quả . Tôi nghĩ rằng downvote của bạn nên biến thành upvote, hoặc ít nhất là biến mất, vì nó không được đánh giá cao.
Andrea Ligios

@AndreaLigios, bạn có thể tự đọc qua các tập lệnh, chúng khá ngắn. Họ có một bộ các đường dẫn JAVA_HOME được mã hóa cứng từ 8 đến 10, họ thử các đường dẫn đó cùng một lúc, họ gọi trình tạo tệp Debian CA mà bạn cũng có thể đọc qua, sử dụng định dạng tệp hiện có, bởi vì mã trình xử lý keyfile của JDK, mã này bạn có thể đọc qua, có chế độ dự phòng tương thích. Nếu máy tính của bạn chạy phần mềm đơn giản này khác đi, bạn có thể gặp các vấn đề khác với nó. Bạn đã sửa đổi các lựa chọn thay thế java của mình và gọi một số JVM khác, vì sau đó xóa có thể đã đặt lại các lựa chọn thay thế?
Mikael Gueck

1
@MikaelGueck có, trong một trong những lần thử trước tôi đã sửa đổi các lựa chọn thay thế java của mình, vì vậy có lẽ đó là điều đó. Tôi là người đầu tiên thích đào sâu vào mã nguồn và tìm hiểu cách thức hoạt động của công cụ, nhưng hôm nay không phải là mục tiêu của tôi, nó chỉ là một trong số 5-6 trở ngại bất ngờ khác nhau mà tôi gặp phải trong mục tiêu thực sự của mình. Câu trả lời này cho phép tôi giải quyết vấn đề trong vòng chưa đầy 2 phút! Tôi nên dành bao nhiêu thời gian để xem xét các kịch bản và tìm ra giải pháp tốt hơn? Và để làm gì, để tiết kiệm một số megabyte? Điều này rất quyết liệt, nhưng hoạt động (và cho dù vấn đề là gì), vì vậy, một lời cảm ơn lớn cho OP cho những người bận rộn như địa ngục
Andrea Ligios

1
Tôi đã tìm kiếm một giải pháp trong 2 ngày, và câu trả lời của bạn đã giải quyết vấn đề của tôi, cảm ơn. Tôi mới chuyển đến Kubfox 18.04, điều này đã làm việc với nó.
guepardomar

55

EJP về cơ bản đã trả lời câu hỏi (và tôi nhận ra rằng đây là một câu trả lời được chấp nhận), nhưng tôi chỉ giải quyết vấn đề góc cạnh này và muốn bất tử giải pháp của mình.

Tôi đã InvalidAlgorithmParameterExceptiongặp lỗi trên máy chủ Jira được lưu trữ mà trước đây tôi đã thiết lập để truy cập chỉ SSL. Vấn đề là tôi đã thiết lập kho khóa của mình ở định dạng PKCS # 12, nhưng kho tin cậy của tôi ở định dạng JKS.

Trong trường hợp của tôi, tôi đã chỉnh sửa server.xmltệp của mình để chỉ định keystoreType thành PKCS, nhưng tôi không chỉ định TruststoreType, vì vậy nó mặc định là bất cứ thứ gì mà keystoreType là. Chỉ định rõ ràng TruststoreType khi JKS giải quyết nó cho tôi.


tốt, tôi giúp bạn giải pháp bất tử cho gotcha trường hợp cạnh của bạn. đó là nơi nó trở nên thú vị.
n611x007

2
Đây chính xác là vấn đề của tôi. Tôi đã sử dụng Spring Boot 1.4.2.RELEASE, và có một kho lưu trữ phần cứng và kho phần mềm. Tôi đã chỉ định nhà cung cấp và loại cho kho khóa, nhưng không phải là cửa hàng tin cậy. Kết quả là, nhà cung cấp và loại sai đã được sử dụng bởi Truststore. Chỉ định những người (SUN và JKS) đã giải quyết vấn đề.
Kenco

12
Làm thế nào chính xác bạn đã làm điều này? (cửa sổ ở đây)
tatsu

2
Gặp phải vấn đề này với ông bà Android của tôi ngày hôm nay, tôi gần như hiểu những gì bạn nói nhưng bạn không nói làm thế nào để giải quyết nó. Câu trả lời không thể giúp đỡ
Lothar

52

Tôi đã gặp giải pháp này từ bài đăng trên blog Khắc phục sự cố về TrustAnchors khi chạy OpenJDK 7 trên OS X :

Khắc phục sự cố TrustAnchors khi chạy OpenJDK 7 trên OS X. Nếu bạn đang chạy OpenJDK 7 trên OS X và đã thấy ngoại lệ này:

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

Có một sửa chữa đơn giản. Chỉ cần liên kết trong cùng một tệp cacerts mà JDK 1.6 của Apple sử dụng:

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

Bạn cần phải làm điều này cho mọi phiên bản OpenJDK bạn đã cài đặt. Chỉ cần thay đổi -v 1.7phiên bản bạn muốn sửa chữa. Chạy /usr/libexec/java_home -Vđể xem tất cả các JRE và JDK bạn đã cài đặt.

Có lẽ các anh chàng OpenJDK có thể thêm nó vào tập lệnh cài đặt của họ.


1
Lệnh "ln" của tôi (trên OSX 10.6.8) không có tùy chọn "h"; nó có nghĩa là gì
Andrew Swan

1
À, tôi có hai lệnh "ln", một trong / usr / bin (mặc định) và một trong / bin; cái sau có tùy chọn "h" và hoạt động.
Andrew Swan

Tôi đã sửa lỗi cài đặt 1.6 bị hỏng của tôi liên kết với các trích dẫn từ cài đặt hệ thống 1.8 bằng kỹ thuật ln này. Cảm ơn!
A21z

1
Đối với độc giả trong tương lai: có vẻ như bạn cũng cần 3 file khác đang trong securitythư mục ( blacklisted.certs, local_policy.jarUS_export_policy.jar) cho Java để được hạnh phúc.
awksp

@Peter Kriens, tại sao liên kết đến cacertsdưới jrethư mục?
BAE

45

Trong Ubuntu 12.10 (Quantal Quetzal) trở lên, các chứng chỉ được giữ trong gói ca-cert-java . Việc sử dụng -Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacertssẽ chọn chúng bất kể bạn đang sử dụng JDK nào.


54
Tôi thấy tôi cần chạy update-ca-certificates -fthủ công, để điền vào tệp cacerts
Portablejim

4
@Portablejim Cảm ơn. Nhận xét của bạn đã giải quyết vấn đề đầu tiên tôi nhấn vào việc xây dựng Apache Spark trên Ubuntu 15.04beta.
Paul

1
Cảm ơn bạn @Portablejim, bình luận của bạn đã làm việc cho tôi trên Ubuntu 15.04.
David Berg

Cảm ơn. Điều này đã được khắc phục sự cố của tôi với JDK PhpStrom + đã vá. Tôi đã viết khóa này vào tệp "phpstorm64.vmoptions".
Vijit

Không hoạt động với tôi trong Ubuntu 18.04 và JDK là 1.8.0_62
Devendra

34

Tôi gặp vấn đề chính xác này trên OS X, sử dụng JDK 1.7, sau khi nâng cấp lên OS X v10.9 (Mavericks). Cách khắc phục hiệu quả với tôi là chỉ cần cài đặt lại phiên bản Java của Apple, có sẵn tại http://support.apple.com/kb/DL1572 .


Tôi đã gặp điều này với Java 6 được Grails sử dụng trên OSX. Tôi cũng đã cài đặt Java 7 từ Oracle và cũng được nâng cấp lên Mavericks. Cài đặt lại Java 6 từ trang web của Apple cũng đã khắc phục sự cố cho tôi.
pm_labs

Chạy vào đây khi cài đặt mở jdk 6 lên hộp đám mây ubfox. Rất vui khi thấy một khuôn mặt quen thuộc, BTW
Ben Hutchison

30

Tôi đã chạy

sudo update-ca-certificates -f

để tạo một tệp chứng chỉ, và sau đó:

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

Tôi đã trở lại trong kinh doanh, cảm ơn các bạn. Thật đáng tiếc, nó không được bao gồm trong cài đặt, nhưng cuối cùng tôi đã đến đó.


Khi tôi chạy, sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure**tôi nhận đượcsudo: /var/lib/dpkg/info/ca-certificates-java.postinst: command not found
Magick

Chỉ cần sudo update-ca-certificates -fđủ cho jessie Debian với openjdk-8-jre-headlesstừ jessie-backports, miễn là ca-certificates-javađược cài đặt. Tôi nghĩ thứ tự của các vấn đề cài đặt (JRE sau ca-certificates-javacó thể gây ra điều này, vì cái sau không có bất kỳ trình kích hoạt nào cho Java 8 được nhập vào).
mirabilos

2
sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure không có sao **
Yu Jiaao

update-ca-certificates -flà thứ đã sửa nó. Tôi không cần lệnh thứ 2
Mark Jeronimus

17

Lỗi cho biết hệ thống không thể tìm thấy cửa hàng tin cậy trong đường dẫn được cung cấp với tham số javax.net.ssl.trustStore.

Trong Windows, tôi đã sao chép cacertstệp từ jre/lib/securityvào thư mục cài đặt Eclipse (cùng địa điểm với eclipse.initệp) và thêm các cài đặt sau vào eclipse.ini:

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

Tôi đã gặp một số rắc rối với đường dẫn đến các cacerts (biến môi trường% java_home% bị ghi đè bằng cách nào đó), vì vậy tôi đã sử dụng giải pháp tầm thường này.

Ý tưởng là cung cấp một đường dẫn hợp lệ cho tệp tin Truststore - lý tưởng nhất là sử dụng một đường dẫn tương đối. Bạn cũng có thể sử dụng một đường dẫn tuyệt đối.

Để đảm bảo loại cửa hàng là JKS, bạn sẽ chạy lệnh sau:

keytool -list -keystore cacerts

Keystore type: JKS
Keystore provider: SUN

2
Đây là câu trả lời duy nhất thực sự có hiệu quả. Cảm ơn @razvanone
Akshar Patel

1
Tôi đã xoay sở để đạt được một "gotcha" nhỏ: Ba dòng trong tệp eclipse.ini phải nằm trên ba dòng riêng biệt thực tế. Ban đầu tôi đặt tất cả chúng trên một dòng và nhật thực không nhận ra điều đó.
SiKing

16

Loại bỏ gói ca-cert-java và cài đặt lại nó hoạt động với tôi ( Ubuntu MATE 17.10 (Artful Aardvark)).

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

sudo apt-get install ca-certificates-java

Cảm ơn bạn, jdstrand: Nhận xét 1 về lỗi 983302, Re: ca-cert-java không cài đặt được các đoạn trích Java trên Oneiric Ocelot .


11

Tôi đã gặp nhiều vấn đề về bảo mật sau khi nâng cấp lên OS X v10.9 (Mavericks):

  • Sự cố SSL với AWS của Amazon
  • Đồng đẳng không được xác thực với Maven và Eclipse
  • trustAnchors tham số phải không trống

Tôi đã áp dụng bản cập nhật Java này và nó đã sửa tất cả các vấn đề của tôi: http://support.apple.com/kb/DL1572?viewlocale=en_US


5
Ừ Java 6 đã nhiều năm trôi qua khi hết hỗ trợ công cộng và chắc chắn bị lỗ hổng bảo mật. Apple cung cấp sẵn để tải xuống để phần mềm cũ không thể chạy bằng Java 7/8 có thể tiếp tục thực thi, nhưng không nên sử dụng phần mềm này để tạo kết nối SSL tới các dịch vụ trên internet công cộng, chẳng hạn như 1. AWS, 2. Maven Trung, 3. bất cứ điều gì khác.
Zac Thompson

10

Tôi đã mong đợi những thứ như thế này, vì tôi sử dụng một JVM thay thế trong Studio mở Talend của tôi (hỗ trợ tại thời điểm này chỉ tồn tại cho đến khi JDK 1.7). Tôi sử dụng 8 cho mục đích bảo mật ... dù sao đi nữa

  • Cập nhật cửa hàng chứng chỉ của bạn:

    sudo update-ca-certificates -f

sau đó

  • thêm một giá trị mới trong các tham số khởi tạo của bạn

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

Đối với tôi, mục thứ hai làm việc. Tôi nghĩ, tùy thuộc vào phiên bản Talend Open Studio / TEnt + JVM, nó có một tên tham số khác, nhưng nó tìm cùng một tệp kho khóa.


4
Bạn đã lấy tài sản javax.net.ssl.trustAnchorstừ đâu? Nó không được đề cập trong tài liệu JSSE.
Hầu tước Lorne

10

Đối với tôi, điều đó được gây ra bởi sự thiếu một TrustedCertEntry trong kho ủy thác.

Để kiểm tra, sử dụng:

keytool -list -keystore keystore.jks

Nó đưa cho tôi:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

cert-alias, 31-Jul-2017, PrivateKeyEntry

Mặc dù PrivateKeyEntry của tôi có chứa CA nhưng nó cần được nhập riêng :

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

Nó nhập chứng chỉ, và sau đó chạy keytool -list -keystore keystore.jkslại cho:

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>

Bây giờ nó đã có TrustedCertEntry và Tomcat sẽ bắt đầu thành công.


NB kiểm tra hướng dẫn baeldung với Makefile hữu ích làm lối tắt để tạo kho khóa & cửa hàng tin cậy (
hello_earth

9

Một số nhà cung cấp OpenJDK phát hành gây ra điều này bằng cách có một cacertstệp trống được phân phối với tệp nhị phân. Lỗi được giải thích tại đây: https://github.com/AdoptOpenJDK/openjdk-build/issues/555

Bạn có thể sao chép vào adoptOpenJdk8\jre\lib\security\cacertstập tin từ một bản in cũ như thế nào c:\Program Files\Java\jdk1.8.0_192\jre\lib\security\cacerts.

Phiên bản buggy AdoptOpenJDK là https://github.com/AdoptOpenJDK/openjdk8-release/release/doad/jdk8u172-b11/OpenJDK8_x64_Win_jdk8u172.


Tôi nghĩ rằng đây là trường hợp đối với tôi là tốt. Trong AdoptOpenJDK 202, lỗi này xuất hiện và trong 222 nó hoạt động. Vì vậy, cập nhật jdk của bạn nếu có thể.
Marty

6

Nếu bạn trải nghiệm điều này trên Ubuntu với JDK9 và Maven, bạn có thể thêm tùy chọn JVM này - trước tiên hãy kiểm tra xem đường dẫn có tồn tại không:

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

Nếu tệp bị thiếu, hãy thử cài đặt ca-cert-java như ai đó đã lưu ý:

sudo apt install ca-certificates-java

Nếu bạn sử dụng docker thì bạn cũng có thể thử hình ảnh "maven: 3-jdk-9-slim" thay vì "maven: 3-jdk-9"
Konstantin Pavlov

Cảm ơn, điều này đã làm việc cho tôi vì openjdk-8-jdk trong ubfox 18.04
Aftab Naveed

4

Tôi đã có thông báo lỗi này trên Java 9.0.1 trên Linux. Đó là do lỗi đã biết của JDK, trong đó tệp cacerts trống trong gói nhị phân .tar.gz (được tải xuống từ http://jdk.java.net/9/ ).

Xem đoạn "các vấn đề đã biết" của Ghi chú phát hành JDK 9.0.1 , nói rằng "TLS không hoạt động theo mặc định trên OpenJDK 9".

Trên Debian / Ubuntu (và có thể là các dẫn xuất khác), một cách giải quyết đơn giản là thay thế tệp cacerts bằng tệp từ gói "ca-cert-java":

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

Trên Red Hat Linux / CentOS, bạn có thể thực hiện tương tự từ gói "chứng chỉ ca":

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

4

Tôi gặp vấn đề này khi thử sử dụng Maven 3, sau khi nâng cấp từ Ubuntu 16.04 LTS (Xenial Xerus) lên Ubuntu 18.04 LTS (Bionic Beaver).

Kiểm tra / usr / lib / jvm / java-8-oracle / jre / lib / security cho thấy tệp cacerts của tôi là một liên kết tượng trưng chỉ đến /etc/ssl/certs/java/cacerts .

Tôi cũng đã có một tập tin đáng ngờ tên cacerts.original.

Tôi đổi tên cacerts.originalđểcacerts , và cố định vấn đề này.


Các cacerts.originaltập tin được trong jksđịnh dạng, và được tạo ra với Ubuntu 16,04 Java 8, trong đó sử dụng mà định dạng như mặc định của nó. Các cacertstập tin được trong pkcs12định dạng, được tạo ra bởi Ubuntu 18,04 là Java 10, trong đó sử dụng định dạng này như mặc định của nó. Như đã giải thích ở nơi khác trong chủ đề này, định dạng mới yêu cầu bạn chuyển mật khẩu để thực thi. Nhưng miễn là bạn tạo một jks cacertstệp trống mới hoặc sao chép một tệp cũ, quy trình tạo các đoạn trích tiếp theo sẽ làm trống tệp hiện có và nạp lại bằng chứng chỉ CA từ hệ thống tệp.
Mikael Gueck

3

Tôi cũng gặp phải điều này trên OS X sau khi cập nhật OS X v10.9 (Mavericks), khi Java 6 cũ đang được sử dụng và cố gắng truy cập URL HTTPS. Cách khắc phục là nghịch đảo của Peter Kriens; Tôi cần sao chép cacertskhoảng trắng từ 1.7 sang vị trí được liên kết bởi phiên bản 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

1
Lệnh ở đây cố gắng sao chép một thư mục vào một tệp; Làm cho không có ý nghĩa gì cả.
praseodym

Tôi đồng tình với việc đánh giá sử dụng giải pháp đảo ngược. Tôi thấy rằng jdk1.6 có một liên kết mềm bị hỏng / L Library / Java / JavaVirtualMachines / .6.0_33-b03 -424.jdk / Content / Home / lib / security / caderts -> /System/L Library / Java / Support / / Nội dung / Trang chủ / lib / bảo mật / trích dẫn. Vì vậy, tôi đã liên kết mềm bị hỏng, sau đó sao chép qua các đoạn trích từ bản cài đặt jdk1.7.
James A Wilson

LƯU Ý: khi bạn hoàn tất, bạn sẽ có thể gửi tệp cacerts mà bạn đã sao chép để xác thực các quyền.
Xám

Ngoài ra, cố định cp để đi đúng hướng và thêm ô cho mkdir và cp.
Xám

3

Trong trường hợp của tôi, tệp JKS được sử dụng trong ứng dụng khách bị hỏng. Tôi đã tạo một cái mới và nhập chứng chỉ SSL máy chủ đích trong đó. Sau đó, tôi đã sử dụng tệp JKS mới trong ứng dụng khách như một cửa hàng tin cậy, như:

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

Nguồn: Java SSL và kho khóa chứng chỉ

Tôi sử dụng công cụ (KeyStore Explorer) để tạo JKS mới. Bạn có thể tải xuống từ liên kết này, KeyStore Explorer .


keystore-explorer đã làm việc cho tôi. Bạn chỉ cần tạo kho khóa mặc định và kiểm tra và lưu tệp chứng chỉ cho trang web / máy chủ lưu trữ.
Chaiha Kumara

3

Bạn cũng có thể gặp phải lỗi này sau khi nâng cấp lên Spring Boot 1.4.1 (hoặc mới hơn) vì nó mang theo Tomcat 8.5.5 như một phần phụ thuộc của nó.

Vấn đề là do cách Tomcat giao dịch với cửa hàng ủy thác. Nếu bạn tình cờ đã chỉ định vị trí cửa hàng tin cậy giống như kho khóa của bạn trong cấu hình Spring Boot, bạn có thể sẽ nhận được trustAnchors parameter must be non-emptythông báo khi khởi động ứng dụng.

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

Đơn giản chỉ cần loại bỏ server.ssl.trust-store cấu hình trừ khi bạn biết rằng bạn cần nó, trong trường hợp đó hãy tham khảo các liên kết dưới đây.

Các vấn đề sau có chứa nhiều chi tiết hơn về vấn đề:


3

Tôi gặp phải vấn đề này với sdkmanager SDK Android. Đối với tôi giải pháp này đã làm việc:

  1. Đi đến /usr/lib/jvm/java-8-oracle/jre/lib/security/
  2. Thay thế cacertbằngcacert.original

Các cacerttập tin là một nhỏ (22B). Tôi đã cài đặt oracle-java8-installertừ ppa:webupd8team/java(theo hướng dẫn này: https://docs.nativecript.org/start/ns-setup-linux ).


2

Đối với hồ sơ, không có câu trả lời nào ở đây làm việc cho tôi. Bản dựng Gradle của tôi bắt đầu thất bại một cách bí ẩn với lỗi này, không thể tìm nạp CHÍNH từ trung tâm Maven cho một POM cụ thể tệp .

Hóa ra tôi đã cài đặt JAVA_HOME cho bản dựng OpenJDK cá nhân của riêng tôi, mà tôi đã xây dựng để gỡ lỗi một vấn đề javac. Đặt nó trở lại JDK được cài đặt trên hệ thống của tôi đã sửa nó.


... khiến cho các cửa hàng tin cậy không được tìm thấy, theo các câu trả lời khác.
Hầu tước Lorne

1
Vâng, nhưng biết rằng cửa hàng ủy thác không thể được tìm thấy là hoàn toàn không có ích nếu bạn không thể hiểu tại sao nó không được tìm thấy. Có rất nhiều cách có thể xảy ra, và thật đáng thất vọng khi không có cách nào trong số chúng xảy ra là cách cụ thể mà nó không thành công cho hệ thống của bạn.
dùng3562927

Tất cả đều 'xảy ra' là cùng một lỗi: kho tin được chỉ định không thể mở hoặc trống. Có một triệu cách mà tình huống này có thể phát sinh và không có đủ không gian trên SO để liệt kê tất cả.
Hầu tước Lorne

1

Trên Red Hat Linux, tôi đã giải quyết vấn đề này bằng cách nhập chứng chỉ vào /etc/pki/java/cacerts.


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

Bạn phải thêm hai dòng trên vào mã của bạn. Nó không thể tìm thấy các cửa hàng tin cậy.


2
Nếu bạn không, nó sẽ sử dụng cửa hàng ủy thác của JRE và chắc chắn nó sẽ có thể tìm thấy điều đó. Lỗi được gây ra bởi các giá trị không chính xác trong các tham số này, không phải sự vắng mặt của chúng. Tệp có tên trong mã của bạn chỉ áp dụng cho cài đặt của bạn, không phải nói chung.
Hầu tước Lorne

Cách thích hợp để đặt các thuộc tính đó là bằng cách chuyển chúng vào dòng lệnh: java -Djavax.net.ssl.trustStore=/tmp/cacerts ...hoặc nếu bạn muốn đặt chúng trên toàn cầu cho tất cả các chương trình chạy với JDK, hãy thêm hàng vào management.propertiestệp của JDK .
Mikael Gueck

1

Tôi đã gặp phải vấn đề này khi chạy một bộ Android cụ thể để thử nghiệm trên Ubuntu 14.04 (Trusty Tahr). Hai điều làm việc cho tôi theo đề nghị của shaheen:

sudo update-ca-certificates -f

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

1

Không có giải pháp nào tôi tìm thấy trên Internet có hiệu quả, nhưng một phiên bản sửa đổi của câu trả lời của Peter Kriens dường như thực hiện công việc.

Trước tiên hãy tìm thư mục Java của bạn bằng cách chạy /usr/libexec/java_home. Đối với tôi đó là 1.6.0.jdkphiên bản. Sau đó đi đến lib/securitythư mục con của nó (đối với tôi/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security ).

Sau đó xóa cacertstệp nếu đã có và tìm kiếm một tệp trên hệ thống sudo find / -name "cacerts". Nó tìm thấy nhiều mục cho tôi, trong các phiên bản Xcode hoặc các ứng dụng khác mà tôi đã cài đặt, nhưng cũng ở /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacertsđó tôi đã chọn.

Sử dụng tệp đó và tạo một liên kết tượng trưng đến nó (trong khi bên trong thư mục Java từ trước đó) sudo ln -fsh "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts"và nó sẽ hoạt động.

Tôi có cả hai - Java từ bản tải xuống 2017-001 của Apple ( https://support.apple.com/kb/dl1572 - Tôi giả sử đó là chứng chỉ chính xác đến từ đâu) và Oracle được cài đặt trên Mac OS X v10.12 (Sierra) .


1

trên Ubuntu 14.04 với openjdk 11 từ ppa: openjdk-r / ppa điều này làm việc cho tôi:

trong java.security thay đổi loại kho khóa thành

keystore.type=jks

sau đó:

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

Khi bạn kiểm tra xem nó có hoạt động không, hãy chắc chắn rằng bạn không sử dụng bất kỳ trình nền nào với java cũ vẫn đang chạy (ví dụ: --no-daemon tùy chọn cho lớp)

lỗi này mô tả mọi thứ độc đáo và sẽ giúp bạn hiểu những gì đang diễn ra https://bugs.launchpad.net/ubfox/+source/ca-certert-java/+orms/1739431


1

Trên Ubuntu 18.04 tôi cần sử dụng OpenJDK 1.7 để bảo trì một dự án cũ. Tôi đã tải xuống gói nhị phân. Nhưng khi tôi thực thi kịch bản của mình trên đó, tôi đã gặp lỗi tương tự.

Giải pháp là xóa cacertstệp JDK đã tải xuống trong jre/lib/securitythư mục và sau đó tạo tệp đó dưới dạng liên kết tượng trưng đến cacertstệp hệ thống trong /etc/ssl/certs/java/:

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


1

Cơ hội mỏng này sẽ giúp được bất cứ ai nhưng .... đối với bất kỳ ai chạy Java 8 từ Docker Image trên Raspberry Pi (sử dụng CPU AMD) Tôi đã có Dockerfile sau để xây dựng và chạy thành công cho tôi

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"]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.