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

时间:2012-01-24 00:00:44

标签: java jvm keytool

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

keytool -import -alias daldap -file somecert.cer

所以我需要将我的电话改为:

keytool -import -alias daldap -file somecert.cer -keystore cacerts –storepass changeit

10 个答案:

答案 0 :(得分:113)

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

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

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

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

答案 1 :(得分:30)

密钥库位置

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

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

答案 2 :(得分:22)

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/Contents/Home

从那里开始:

./jre/lib/security

我有一个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

我并不是说这是正确的方法(为什么java不知道如何在JAVA_HOME中查看?),但这是我必须做的才能让它发挥作用。

答案 3 :(得分:15)

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

在Windows 7上:

C:\Users\<YOUR_ACCOUNT>\.keystore

在Linux(Ubuntu)上:

/home/<YOUR_ACCOUNT>/.keystore

答案 4 :(得分: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;
}

答案 5 :(得分:6)

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

答案 6 :(得分:0)

我们在从自动jre更新后(几乎完全)删除的jre目录运行的Tomcat上遇到此问题,因此运行的jre无法再找到jre ... / lib / security / cacerts因为它没有更长时间存在。

重新启动Tomcat(将配置更改为从不同的jre位置运行)修复了问题。

答案 7 :(得分:0)

除了以上所有答案:

如果在JRE目录中更新cacerts文件无济于事,请尝试在JDK中更新它。

C:\ Program Files \ Java \ jdk1.8.0_192 \ jre \ lib \ security

答案 8 :(得分:0)

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

 /etc/ssl/certs/java/cacerts

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

答案 9 :(得分:0)

对于我使用official OpenJDK 12 Docker image而言,Java密钥库的位置为:

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