如何将.cer证书导入Java密钥库中?


226

在Java Web服务客户端的开发过程中,我遇到了一个问题。Web服务的身份验证使用客户端证书,用户名和密码。我从Web服务背后的公司那里收到的客户证书的.cer格式是。当我使用文本编辑器检查文件时,它具有以下内容:

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----

我可以在Internet Explorer中将该文件作为证书导入(无需输入密码!),并使用它通过Web服务进行身份验证。

通过首先剥离第一行和最后一行,转换为Unix换行符并运行base64解码,我能够将此证书导入密钥库。可以将生成的文件导入到密钥库中(使用keytool命令)。当我在密钥库中列出条目时,该条目的类型为trustedCertEntry。由于此输入类型(?),我无法使用此证书对Web服务进行身份验证。我开始认为提供的证书是用于身份验证的公共证书...

我发现一种解决方法是在IE中导入证书并将其导出为.pfx文件。该文件可以作为密钥库加载,并且可以用于与Web服务进行身份验证。但是,我不能期望我的客户每次收到新证书时都执行这些步骤。因此,我想将.cer文件直接加载到Java中。有什么想法吗?

附加信息:该网络服务背后的公司告诉我,应该从PC和用户(使用IE和网站)中请求证书,稍后再导入证书。

Answers:


317
  • 如果要进行身份验证,则需要私钥-没有其他选择。
  • 证书是具有额外属性(例如公司名称,国家/地区...)的公共密钥,该证书由某些证书颁发机构签名,以确保所附加的属性为真。
  • .CER文件是证书,没有私钥。私钥.PFX keystore通常随文件一起提供。如果您真正进行身份验证是因为您已经导入了私钥。
  • 通常,您可以导入.CER证书而不会出现任何问题

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 

3
原来私钥是由IE插件生成的。目前唯一的解决方案是在IE中导入证书并导出.pfx文件。
Jan-Pieter

5
.CER文件确实具有公共密钥。他们没有私钥。建议编辑..
KyleM 2013年

6
-alias在这里做什么?
2013年

5
:(-> keytool错误:java.lang.Exception:输入的不是X.509证书
necromancer 2014年

1
@hop一个Java密钥库可以有多个证书,每个证书都有不同的别名来标识它。您可以将其用作参考来识别它和/或通过别名以编程方式检索它。
lujop 2015年

85

导入.cer从浏览器下载证书文件(打开详细信息的URL和DIG)到cacerts的密钥存储在java_home\jre\lib\security为我工作,而不是attemps生成和使用自己的密钥库。

  1. 去你的 java_home\jre\lib\security
  2. Windows)使用cmdCTRL+ SHIFT+ 打开管理命令行ENTER
  3. 运行keytool导入证书:
    • (替换yourAliasNamepath\to\certificate.cer分别地)

 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

这样,您不必指定任何其他JVM选项,并且JRE应该可以识别证书。


路径\到\证书。如果我的文件在桌面上,我该如何设置路径?C:/ user / desktop /或../../../../desktop/文件名
Jesse,

在MacOS / Linux上,此命令与sudo一起使用。谢谢。但是什么是noprompt param?我没有使用它,但仍然成功。
Evgeniy Mishustin

请注意,使用JDK进行开发时,正确的路径是:java_home\jdk_x.xx\jre\lib\security 对于绝对路径,请使用反斜杠,例如,"C:\myCert.crt"如果路径中不包含空格,则引号是可选的。
jp-jee

谢谢一百万次。
vikingsteve,

问题:私钥如何?讨论是关于客户端证书的。我的理解是,需要创建具有私钥的CSR,然后从远程网站公司接收客户端证书,然后将客户端证书与私钥匹配。您的答案似乎没有提及有关私钥的任何内容。只是问问。
user2367418 '19

51

这是我用于以编程方式将.cer文件导入新KeyStore的代码。

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//VERY IMPORTANT.  SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

//Put everything after here in your function.
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}

20

您不必对证书进行任何更改。您确定运行正确的导入命令吗?

以下对我有用:

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

其中mycert.cer包含:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----

2
当我尝试将未修改的证书导入密钥库时,出现错误“ keytool错误:java.lang.Exception:输入的不是X.509证书”。按照我在帖子中描述的方式修改证书后,我可以使用与您类似的命令无任何错误地导入证书。但是,它将作为TrustedCertEntry导入,并且在访问Web服务时不使用。
1

您可以在问题中添加命令例外吗?您确定要在导入命令中指定别名吗?
dogbane 2010年

如果您使用Windows,请不要忘了以管理员身份运行cmd
SilentBob470

9

可在keystore-explorer.org上使用开源GUI工具。

密钥库资源管理器

KeyStore Explorer是Java命令行实用程序keytool和jarsigner的开源GUI替代。KeyStore Explorer通过直观的图形用户界面展示其功能以及更多功能。

以下屏幕会有所帮助(它们来自官方网站)

通过运行命令获得的默认屏幕:

shantha@shantha:~$./Downloads/kse-521/kse.sh

在此处输入图片说明

然后转到ExamineExamine a URL选项,然后提供要导入的Web URL。

如果您提供Google网站链接,则结果窗口将如下所示。 在此处输入图片说明

这是用例之一,其余部分取决于用户(所有功劳归于keystore-explorer.org


7

您已经拥有的证书可能是服务器的证书,或用于对服务器的证书进行签名的证书。您将需要它,以便您的Web服务客户端可以验证服务器。

但是,如果另外需要使用SSL执行客户端身份验证,则需要获取自己的证书来对Web服务客户端进行身份验证。为此,您需要创建一个证书申请;该过程涉及创建自己的私钥和相应的公钥,并将该公钥以及一些信息(电子邮件,名称,域名等)附加到称为证书请求的文件中。然后,您将该证书请求发送给已经要求您提供证书的公司,他们将通过使用私钥对您的公钥签名来创建您的证书,然后他们会向您发送带有证书的X509文件,您可以现在将其添加到您的密钥库中,您就可以使用需要客户端身份验证的SSL连接到Web服务了。

要生成您的证书请求,请使用“ keytool -certreq -alias -file -keypass -keystore”。将结果文件发送给将要签名的公司。

当您取回证书时,请运行“ keytool -importcert -alias -keypass -keystore”。

如果密钥库受保护,则在两种情况下都可能需要使用-storepass(这是一个好主意)。


5

这是我用来将当前目录中的一堆crt文件批量导入Java密钥库中的脚本。只需将其保存到证书所在的文件夹中,然后像这样运行即可:

./import_all_certs.sh

import_all_certs.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_java_keystore
else
  echo "This script needs to be run as root!"
fi

1

这对我来说是这样的:

  1. 在文本编辑器中以以下格式将证书数据另存为.txt。

    ----- BEGIN CERTIFICATE ----- [由Microsoft序列化的数据] ----- END CERTIFICATE -----

  2. 打开Chrome浏览器(此步骤也可能与其他浏览器一起使用)设置>显示高级设置> HTTPS / SSL>管理证书在步骤1中导入.txt
  3. 选择并以Base-64编码格式导出该证书。将其另存为.cer
  4. 现在您可以使用keytool或Portecle将其导入到Java密钥库中
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.