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


125

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

keytool -import -alias daldap -file somecert.cer

所以我可能需要将通话更改为:

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

1
您需要将证书导入到JVM 信任库中,除非证书是经过签名的CSR,在这种情况下,您应该将证书导入到自己的密钥库中,并且必须已经知道它在哪里,否则您将无法生成证书。密钥对或CSR。
2014年

Answers:


129

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

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

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

在导入命令-keystore cacerts中(在此处给出上述JRE的完整路径,而不仅仅是说cacerts)。


6
/ Library / Java / Home / lib / security / cacerts(在Mac OS X 10.9上
-Sam Barnum

9
*“ JAVA_HOME ---> JRE-> lib --->安全性-> cacerts”最后请注意“ s”,仅供以后使用。
Keir Nellyer

4
因此,如果我安装新版本的Java,并且JAVA_HOME指向新目录,我是否会遇到证书问题?
Kirill Yunussov 2015年

1
@Murphy:这可能会帮助您stackoverflow.com/questions/5251323/…–
kosa

4
我认为这是信任库位置,而不是密钥库位置。
user2001850 '02 / 02/23

35

密钥库位置

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


我一直在寻找这个神秘的~/.keystore文件!如果我保留该-keystore参数,则无法确定哪个默认密钥库keytool定位。我一直在寻找cacerts机器上其他地方的东西。我没想到keytool会~/.keystore在主目录中生成,也不希望它被命名.keystorecacerts。您已经填补了Java人员应该记录的空白!谢谢!
乔治·潘塔兹

26

具有Java 1.8的Mac OS X 10.12:

$ JAVA_HOME / jre / lib / security

cd $JAVA_HOME

/图书馆/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中查找?),但这是我必须做的才能使其工作。


16

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

在Windows 7上:

C:\Users\<YOUR_ACCOUNT>\.keystore

在Linux(Ubuntu)上:

/home/<YOUR_ACCOUNT>/.keystore

4
我在Windows上没有此目录
simgineer 2013年

1
我没有指定密钥库就做了-keygen,希望它在当前目录中创建一个,但是正如您所说的,它在我的家中创建了它。〜/ .keystore很久找不到了!:-) 谢谢。
Eurospoofer

让我补充一点,在Cygwin的,因为Java属性窗口路径用于user.home等于$HOMEDRIVE$HOMEPATH由Windows设置,而不是$HOME通过cygwin的其中一套HOMEDRIVE=C:HOMEPATH=\Users\[YOUR ACCOUNT]
user1708042

13

这对我有用:

#!/ bin / bash

CACERTS = $(readlink -e $ {dirname $(readlink -e $ {哪个keytool)))/../ lib / security / cacerts)= $ readlink - e $ 目录名$ readlink - e $ 其中keytool )))/../ lib / security / cacerts 

如果keytool -list -keystore $ CACERTS -storepass changeit> / dev / null; 然后如果keytool - list - keystore $ CACERTS - storepass changeit > / dev / null ; 然后  
    回声$ CACERTS
其他其他
    回显“找不到cacerts文件”。>&2“找不到cacerts文件。” >&2 
    1号出口1个
科幻科幻

仅适用于Linux。我的Solaris没有读取链接。最后,我使用了以下Perl脚本:

#!/ usr / bin / env perl
使用严格使用严格;
使用警告;使用警告;
使用Cwd qw(realpath);使用Cwd qw realpath ); 
$ _ = realpath((grep {-x && -f} map {“ $ _ / keytool”} split(':',$ ENV {PATH}))[0]);;= realpath ((grep { -x && - f } map { “ $ _ / keytool” } split ':' $ ENV { PATH }))[ 0 ]);; 
除非定义了$ _,否则死掉“找不到键盘工具”;“无法找到密钥工具” 除非定义$ _ ;  
我的$ keytool = $ _;我的$ keytool = $ _ ;
打印“使用'$ keytool'。\ n”;打印“使用'$ keytool'。\ n” ; 
s / keytool $ //;/ keytool $ / /;
$ _ = realpath($ _。'../lib/security/cacerts');lib / security / cacerts ');
死于“找不到证书”,除非-f $ _;
我的$ cacerts = $ _;
打印“导入到'$ cacerts'。\ n”;$ cacerts '。\ n“;
`$ keytool -list -keystore“ $ cacerts” -storepass changeit`;
die除非$,否则“无法读取密钥容器”?== 0;
如果$ ARGV [0]等于'-d',则退出;- d “;
foreach(@ARGV){
    我的$ cert = $ _;
    s /\.[^.]+$//;
    我的$ alias = $ _;
    打印“将'$ cert'导入为'$ alias'。\ n”;$ cert '为' $ alias '。\ n“;
    `keytool -importcert-文件“ $ cert”-别名“ $ alias” -keystore“ $ cacerts” -storepass changeit`;
    警告“无法导入证书:$?” 除非$?== 0;
}

6

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


很高兴知道,lib/security如果仅给出相对名称,keytool命令会自动添加正确的路径。
ceving 2012年

1
但这不适用于-importcert。list命令显示了系统范围的证书,但是import命令在当前目录中生成一个新文件。
ceving 2012年

1
updatedb; locate cacerts帮助查找cacerts文件的安装位置。
sjas 2015年

5

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

 /etc/ssl/certs/java/cacerts

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


1

对我而言,使用官方OpenJDK 12 Docker映像,Java密钥库的位置为:

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

那是一个信任库,而不是密钥库。
罗恩侯爵,

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

此外,所有其他答案也都涉及JDK用来验证的所谓的“ Truststore”。那么,您是否也否决了所有其他答案?我已经收到了赞成票,因此已经有人帮助了我。
jonashackt

0

我们在从jre目录运行的Tomcat上遇到了这个问题,该Tomcat在自动更新jre之后被(几乎完全删除)了,因此正在运行的jre不再能够找到jre ... / lib / security / cacerts,因为它不再存在。

重新启动Tomcat(将配置更改为从其他jre位置运行之后)解决了该问题。


0

除了以上所有答案:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.