Tôi đang tìm cách lấy vị trí cacertscài đặt java mặc định, khi bạn chưa có JAVA_HOMEhoặc chưa JRE_HOMExác định.
Tôi cần một giải pháp ít nhất là hoạt động cho OS Xvà Linux.
Đúng. java -vđược cho là hoạt động :)
Câu trả lời:
Trong Linux , để tìm vị trí của $JAVA_HOME:
readlink -f /usr/bin/java | sed "s:bin/java::"
các cacertsdưới lib/security/cacerts:
$(readlink -f /usr/bin/java | sed "s:bin/java::")lib/security/cacerts
Trong mac OS X , để tìm $JAVA_HOMEchạy:
/usr/libexec/java_home
các cacertsdưới Home/lib/security/cacerts:
$(/usr/libexec/java_home)/lib/security/cacerts
CẬP NHẬT (OS X với JDK)
mã trên đã được thử nghiệm trên máy tính mà không cần cài đặt JDK. Với JDK được cài đặt, như pR0Ps đã nói , nó ở
$(/usr/libexec/java_home)/jre/lib/security/cacerts
/usr/libexec/java_homecho tôi một câu trả lời khác với readlinklệnh -based ở trên và câu trước có vẻ đúng, trong đó nó chứa cacertstệp.
Nếu bạn cần truy cập các chứng chỉ đó theo chương trình thì tốt nhất là không sử dụng tệp mà hãy truy cập nó thông qua trình quản lý tin cậy. Mã sau là từ một Trường hợp thử nghiệm OpenJDK (đảm bảo bộ sưu tập cacerts đã xây dựng không trống):
TrustManagerFactory trustManagerFactory =
TrustManagerFactory.getInstance("PKIX");
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers =
trustManagerFactory.getTrustManagers();
X509TrustManager trustManager =
(X509TrustManager) trustManagers[0];
X509Certificate[] acceptedIssuers =
trustManager.getAcceptedIssuers();
Vì vậy, bạn không phải xử lý vị trí tệp hoặc mật khẩu kho khóa.
Trong MacOS Mojave, vị trí là:
/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/jre/lib/security/cacerts
Nếu sử dụng sdkman để quản lý các phiên bản java, các cacerts nằm trong
~/.sdkman/candidates/java/current/jre/lib/security
~/.sdkman/candidates/java/current/lib/security
/usr/libexec/java_home