如何找出我的JVM使用的密钥库?

jin*_*ini 117 java jvm keytool

我需要将证书导入我的JVM密钥库.我使用以下内容:

keytool -import -alias daldap -file somecert.cer
Run Code Online (Sandbox Code Playgroud)

所以我需要将我的调用改为:

keytool -import -alias daldap -file somecert.cer -keystore cacerts –storepass changeit
Run Code Online (Sandbox Code Playgroud)

kos*_*osa 119

你的密钥库将在你的JAVA_HOME---> JRE -->lib---> security--> cacerts.您需要检查JAVA_HOME的配置位置,可能是其中一个位置,

  1. 计算机--->高级 - >环境变量---> JAVA_HOME

  2. 您的服务器启动批文件.

在你的import命令-keystore cacerts中(在这里提供上述JRE的完整路径,而不仅仅是说cacerts).

  • *"JAVA_HOME ---> JRE - > lib --->安全 - > cacerts"最后注意"s",仅适用于未来的读者. (8认同)
  • Mac OS X 10.9上的/ Library/Java/Home/lib/security/cacerts (6认同)
  • 因此,如果我安装新版本的Java,并且JAVA_HOME指向新目录,我是否会遇到证书问题? (4认同)
  • 这是信托商店的位置,而不是我认为的关键商店位置. (4认同)
  • Ubuntu 和其他基于 Debian 的系统上的 /usr/lib/jvm/<jvm-version>/jre/lib/security/cacerts (2认同)

dbr*_*rin 33

密钥库位置

每个keytool命令都有一个-keystore选项,用于指定由keytool管理的密钥库的持久密钥库文件的名称和位置.密钥库默认存储在.keystore用户主目录中指定的文件中,由"user.home"系统属性确定.给定用户名uName,"user.home"属性值默认为

C:\Users\uName on Windows 7 systems
C:\Winnt\Profiles\uName on multi-user Windows NT systems
C:\Windows\Profiles\uName on multi-user Windows 95 systems
C:\Windows on single-user Windows 95 systems
Run Code Online (Sandbox Code Playgroud)

因此,如果用户名是"cathy",则"user.home"默认为

C:\Users\cathy on Windows 7 systems
C:\Winnt\Profiles\cathy on multi-user Windows NT systems
C:\Windows\Profiles\cathy on multi-user Windows 95 systems
Run Code Online (Sandbox Code Playgroud)

http://docs.oracle.com/javase/1.5/docs/tooldocs/windows/keytool.html

  • 我一直在寻找这个神秘的 `~/.keystore` 文件!如果我不使用 `-keystore` 参数,我将无法确定默认的密钥库 `keytool` 目标。我一直在机器上的其他地方寻找其他“cacerts”。我没想到 keytool 会在主目录中生成 `~/.keystore`,也没有将它命名为 `.keystore` 而不是 `cacerts`。您已经填补了 Java 人员应该记录的空白!谢谢! (2认同)

com*_*day 25

使用Java 1.8的Mac OS X 10.12:

$ JAVA_HOME/JRE/lib/security中

cd $JAVA_HOME
Run Code Online (Sandbox Code Playgroud)

/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home

从那里开始:

./jre/lib/security
Run Code Online (Sandbox Code Playgroud)

我有一个cacerts密钥库.

要将其指定为VM选项:

-Djavax.net.ssl.trustStore=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit
Run Code Online (Sandbox Code Playgroud)

我不是说这是正确的方法(为什么java不知道在JAVA_HOME中查看?),但这是我必须要做的才能让它工作.


Eva*_* Y. 15

您可以在"主页"目录中找到它:

在Windows 7上:

C:\Users\<YOUR_ACCOUNT>\.keystore
Run Code Online (Sandbox Code Playgroud)

在Linux(Ubuntu)上:

/home/<YOUR_ACCOUNT>/.keystore
Run Code Online (Sandbox Code Playgroud)

  • 我在Windows上没有此目录 (3认同)

cev*_*ing 13

这对我有用:

#! /bin/bash

CACERTS=$(readlink -e $(dirname $(readlink -e $(which keytool)))/../lib/security/cacerts)

if keytool -list -keystore $CACERTS -storepass changeit > /dev/null ; then
    echo $CACERTS
else
    echo 'Can not find cacerts file.' >&2
    exit 1
fi

仅适用于Linux.我的Solaris没有readlink.最后我使用了这个Perl-Script:

#! /usr/bin/env perl
use strict;
use warnings;
use Cwd qw(realpath);
$_ = realpath((grep {-x && -f} map {"$_/keytool"} split(':', $ENV{PATH}))[0]);
die "Can not find keytool" unless defined $_;
my $keytool = $_;
print "Using '$keytool'.\n";
s/keytool$//;
$_ = realpath($_ . '../lib/security/cacerts');
die "Can not find cacerts" unless -f $_;
my $cacerts = $_;
print "Importing into '$cacerts'.\n";
`$keytool -list -keystore "$cacerts" -storepass changeit`;
die "Can not read key container" unless $? == 0;
exit if $ARGV[0] eq '-d';
foreach (@ARGV) {
    my $cert = $_;
    s/\.[^.]+$//;
    my $alias = $_;
    print "Importing '$cert' as '$alias'.\n";
    `keytool -importcert -file "$cert" -alias "$alias" -keystore "$cacerts" -storepass changeit`;
    warn "Can not import certificate: $?" unless $? == 0;
}


Pat*_*ard 7

在 Debian 上,使用 openjdk 版本“1.8.0_212”,我在这里找到了 cacerts:

 /etc/ssl/certs/java/cacerts
Run Code Online (Sandbox Code Playgroud)

如果有一个标准命令可以打印出这个路径,肯定会很方便。


小智 6

正如DimtryB所提到的,默认情况下,密钥库位于用户目录下.但是,如果您尝试更新cacerts文件,以便JVM可以选择密钥,那么您将不得不更新该cacerts文件jre/lib/security.您还可以通过执行命令keytool -list -keystore cacerts来查看密钥,以查看是否添加了证书.

  • 但这不适用于`-importcert`。list 命令显示系统范围的证书,但 import 命令会在当前目录中生成一个新文件。 (2认同)

jon*_*ckt 5

对于使用官方 OpenJDK 12 Docker 映像的我来说,Java 密钥库的位置是:

/usr/java/openjdk-12/lib/security/cacerts
Run Code Online (Sandbox Code Playgroud)

  • 那是信任库,而不是密钥库。 (3认同)
  • 第一:如果您仔细阅读问题(以及您自己的评论),它听起来更像是一个信任库,应该在其中导入证书。其次,信任库和密钥库之间的区别非常令人迷惑 - 顺便说一句,两者都使用术语“密钥库”,因为它们都使用两种格式。第三:如果您查看导入命令“keytool -import -file example.crt -alias exampleCA -keystore truststore.jks”,您还可以使用参数“-keystore”...恕我直言,还不清楚。最后但并非最不重要的一点是:我正在寻找这个确切的问题 - 并发现了这个问题。也许其他人也有同样的经历。 (3认同)