如何查找 JVM 使用的密钥存储库?

我需要将一个证书导入到我的 JVM 密钥存储库中:

keytool -import -alias daldap -file somecert.cer

所以我可能需要把我的电话改成:

keytool -import -alias daldap -file somecert.cer -keystore cacerts –storepass changeit
530794 次浏览

您的密钥存储库将在 JAVA_HOME---> JRE -->lib---> security--> cacerts中。您需要检查您的 JAVA _ HOME 的配置位置,可能是这些位置之一,

  1. 计算机—— > 高级—— > 环境变量—— > JAVA _ HOME

  2. 服务器启动批处理文件。

在你的导入命令-keystore ccerts (在这里给出上述 JRE 的完整路径,而不是只说 ccerts)。

钥匙店位置

每个 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

因此,如果用户名是“ 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

Https://docs.oracle.com/en/java/javase/17/docs/specs/man/keytool.html#importing-a-certificate-for-the-ca

正如 DimtryB 提到的,默认情况下,密钥存储在用户目录下。但是,如果您试图更新 cacerts文件,以便 JVM 可以选择键,那么您必须更新 jre/lib/security下的 cacerts文件。还可以通过执行命令 keytool -list -keystore cacerts查看密钥,以查看是否添加了证书。

这对我有用:

#! /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

我的 Solaris 没有 readlink,最后我使用了这个 Perl 脚本:

#! /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;
}

你可以在你的“ Home”目录中找到它:

在 Windows7上:

C:\Users\<YOUR_ACCOUNT>\.keystore

在 Linux (Ubuntu)上:

/home/<YOUR_ACCOUNT>/.keystore

我们在运行在 jre 目录下的 Tomcat 上遇到了这个问题,在自动更新 jre 之后,这个目录(几乎完全)被删除了,所以运行的 jre 不能再找到 jre.../lib/security/ccerts,因为它已经不存在了。

重新启动 Tomcat (在更改配置以从不同的 jre 位置运行之后)修复了这个问题。

Mac OS X 10.12 with Java 1.8:

$JAVA _ HOME/jre/lib/security

cd $JAVA_HOME

/Library/Java/JavaVirtualMachines/jdk1.8.0 _ 40. jdk/Content/Home

从那里开始:

./jre/lib/security

我在里面有一个钥匙仓库。

将其指定为 VM 选项:

-Djavax.net.ssl.trustStore=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit

我不是说这是正确的方法(为什么 JAVA 不知道查看 JAVA _ HOME?)但我必须这么做才能让它运作起来。

除了上述所有答案外:

如果更新 JRE 目录中的 ccerts 文件没有帮助,请尝试在 JDK 中更新它。

C: Program Files Java jdk1.8.0 _ 192 jre lib security

在 Debian 上,使用 openjdk 版本“1.8.0 _ 212”,我在这里发现了 ccerts:

 /etc/ssl/certs/java/cacerts

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

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

/usr/java/openjdk-12/lib/security/cacerts