我需要将证书导入我的JVM密钥库。我使用以下内容:
keytool -import -alias daldap -file somecert.cer
所以我需要将我的调用改为:
keytool -import -alias daldap -file somecert.cer -keystore cacerts –storepass changeit
你的密钥库将在你的JAVA_HOME---> JRE -->lib---> security--> cacerts
。您需要检查JAVA_HOME的配置位置,可能是其中一个位置,
在你的import命令-keystore cacerts中(在这里提供上述JRE的完整路径,而不仅仅是说cacerts)。
密钥库位置
每个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
使用Java 1.8的Mac OS X 10.12:
$ JAVA_HOME / JRE / lib / security中
cd $JAVA_HOME
/library/Java/Java virtual machines/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中查看?),但这是我必须要做的才能让它工作。
您可以在“主页”目录中找到它:
在Windows 7上:
C:\Users\<YOUR_ACCOUNT>\.keystore
在Linux(Ubuntu)上:
/home/<YOUR_ACCOUNT>/.keystore
这对我有用:
#! /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; }
正如DimtryB所提到的,默认情况下,密钥库位于用户目录下。但是,如果您尝试更新cacerts
文件,以便JVM可以选择密钥,那么您将不得不更新cacerts
下的jre/lib/security
文件。您还可以通过执行命令keytool -list -keystore cacerts
来查看密钥,以查看是否添加了证书。
我们在从自动jre更新后(几乎完全)删除的jre目录运行的Tomcat上遇到此问题,因此运行的jre无法再找到jre ... / lib / security / cacerts,因为它已不存在。
重新启动Tomcat(在将配置更改为从不同的jre位置运行之后)修复了问题。
除了以上所有答案:
如果更新JRE目录中的cacerts文件没有帮助,请尝试在JDK中更新它。
C:\ Program Files \ Java \ jdk1.8.0_192 \ jre \ lib \ security
在Debian上,使用openjdk版本“1.8.0_212”,我在这里找到了cacerts:
/etc/ssl/certs/java/cacerts
如果有一个打印出这条路径的标准命令,肯定会很方便。