为什么 Keytool 在添加过期证书时不警告您
why Keytool doesn't warn you when adding an expired certificate
我试图使用 SOAP 向主机服务器发送请求,它需要一个证书,因为 cxf 需要一个。
我使用此命令将证书导出到 JAVA_HOME
中的 cacerts
文件:
keytool -import -trustcacerts -alias fooAlias -file foo -keystore cacerts
但是在尝试再次发送请求后我得到了这个异常:
pkix path building failed: sun.security.provider.certpath.suncertpathbuilderexception:
unable to find valid certification path to requested target
当然我去搜索了一个解决方案,结果是将证书添加到 cacerts
文件 我已经这样做了!,所以它造成了对为什么会发生这种情况的困惑。
然后在苦思冥想了2天后无意间打开证书,发现3个月前就过期了。
我联系了团队并申请了一个新的有效申请,添加后错误消失,申请已发送。
所以请有人告诉我为什么当我尝试添加过期证书时 keytool
没有显示警告。
这样做是有意义的,因为错误是因为它已过期而引发的。
为什么它甚至允许添加过期的证书。
当您尝试添加证书时,Keytool 不会发出警告。您使用的命令将根证书或中间 CA 证书导入现有的 Java 密钥库,它也会为您做同样的事情。
由于该命令仅要求提供证书实例,因此它从不检查有效性。有效性检查应该由证书的用户而不是提供者来完成。所以代码按预期工作。
您可以通过
检查证书的有效性
$ keytool -printcert -v -file [CERTIFICATE]
输出
Owner:
Issuer: CN=CPD Root CA, DC=cpd, DC=local<br>
Serial number: 39e8d1610002000000cb
<br>Valid from: Wed Feb 22 21:36:31 CET 2012 until: Thu Feb 21 21:36:31 CET 2013
Certificate fingerprints: <br>
MD5: 82:46:8B:DB:BC:5C:64:21:84:BB:68:E3:4B:D4:35:70<br>
SHA1: 35:52:CA:F2:11:66:1E:50:63:BC:53:A5:50:C1:F0:1E:62:81:BC:3F<br>
Signature algorithm name: SHA1withRSA
为了更好地理解您可以查看下面的代码。
Keytool.java 有一个 main 方法,它接受所有参数
你路过。然后它解析它并将它传递给 doCommands for
进一步处理。
public static void main(String[] args) throws Exception {
Main kt = new Main();
kt.run(args, System.out);
}
private void run(String[] args, PrintStream out) throws Exception {
try {
parseArgs(args);
if (command != null) {
doCommands(out);
}
然后调用 KeyStoreUtil 获取 CacertsKeystore。
if (trustcacerts) {
caks = KeyStoreUtil.getCacertsKeyStore();
}
它从 KeystoreUtil 获取文件并调用 KeyStore 获取实例。
/**
* Returns the keystore with the configured CA certificates.
*/
public static KeyStore getCacertsKeyStore() throws Exception {
File file = new File(getCacerts());
if (!file.exists()) {
return null;
}
return KeyStore.getInstance(file, (char[])null);
}
在 KeyStore 中 returns 一个加载的适当密钥库类型的密钥库对象。
public static final KeyStore getInstance(File file, char[] password)
throws KeyStoreException, IOException, NoSuchAlgorithmException,
CertificateException {
return getInstance(file, password, null, true);
}
我试图使用 SOAP 向主机服务器发送请求,它需要一个证书,因为 cxf 需要一个。
我使用此命令将证书导出到 JAVA_HOME
中的 cacerts
文件:
keytool -import -trustcacerts -alias fooAlias -file foo -keystore cacerts
但是在尝试再次发送请求后我得到了这个异常:
pkix path building failed: sun.security.provider.certpath.suncertpathbuilderexception:
unable to find valid certification path to requested target
当然我去搜索了一个解决方案,结果是将证书添加到 cacerts
文件 我已经这样做了!,所以它造成了对为什么会发生这种情况的困惑。
然后在苦思冥想了2天后无意间打开证书,发现3个月前就过期了。
我联系了团队并申请了一个新的有效申请,添加后错误消失,申请已发送。
所以请有人告诉我为什么当我尝试添加过期证书时 keytool
没有显示警告。
这样做是有意义的,因为错误是因为它已过期而引发的。
为什么它甚至允许添加过期的证书。
当您尝试添加证书时,Keytool 不会发出警告。您使用的命令将根证书或中间 CA 证书导入现有的 Java 密钥库,它也会为您做同样的事情。
由于该命令仅要求提供证书实例,因此它从不检查有效性。有效性检查应该由证书的用户而不是提供者来完成。所以代码按预期工作。
您可以通过
$ keytool -printcert -v -file [CERTIFICATE]
输出
Owner:
Issuer: CN=CPD Root CA, DC=cpd, DC=local<br>
Serial number: 39e8d1610002000000cb
<br>Valid from: Wed Feb 22 21:36:31 CET 2012 until: Thu Feb 21 21:36:31 CET 2013
Certificate fingerprints: <br>
MD5: 82:46:8B:DB:BC:5C:64:21:84:BB:68:E3:4B:D4:35:70<br>
SHA1: 35:52:CA:F2:11:66:1E:50:63:BC:53:A5:50:C1:F0:1E:62:81:BC:3F<br>
Signature algorithm name: SHA1withRSA
为了更好地理解您可以查看下面的代码。
Keytool.java 有一个 main 方法,它接受所有参数 你路过。然后它解析它并将它传递给 doCommands for 进一步处理。
public static void main(String[] args) throws Exception { Main kt = new Main(); kt.run(args, System.out); } private void run(String[] args, PrintStream out) throws Exception { try { parseArgs(args); if (command != null) { doCommands(out); }
然后调用 KeyStoreUtil 获取 CacertsKeystore。
if (trustcacerts) { caks = KeyStoreUtil.getCacertsKeyStore(); }
它从 KeystoreUtil 获取文件并调用 KeyStore 获取实例。
/** * Returns the keystore with the configured CA certificates. */ public static KeyStore getCacertsKeyStore() throws Exception { File file = new File(getCacerts()); if (!file.exists()) { return null; } return KeyStore.getInstance(file, (char[])null);
}
在 KeyStore 中 returns 一个加载的适当密钥库类型的密钥库对象。
public static final KeyStore getInstance(File file, char[] password) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException { return getInstance(file, password, null, true); }