Tôi đang tìm cách lấy vị trí cacerts
cài đặt java mặc định, khi bạn chưa có JAVA_HOME
hoặc chưa JRE_HOME
xác định.
Tôi cần một giải pháp ít nhất là hoạt động cho OS X
và 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 cacerts
dưới lib/security/cacerts
:
$(readlink -f /usr/bin/java | sed "s:bin/java::")lib/security/cacerts
Trong mac OS X , để tìm $JAVA_HOME
chạy:
/usr/libexec/java_home
các cacerts
dướ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_home
cho tôi một câu trả lời khác với readlink
lệnh -based ở trên và câu trước có vẻ đúng, trong đó nó chứa cacerts
tệ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