如何将.cer证书导入到java密钥库?

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

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

我可以在Internet Explorer中将该文件作为证书导入(无需input密码!),并使用它来与web服务进行身份validation。

我能够通过首先剥离第一行和最后一行,将该证书导入密钥库,转换为unix换行符并运行base64解码。 生成的文件可以导入到密钥库(使用keytool命令)。 列出密钥库中的条目时,此条目的types为trustedCertEntry 。 由于这个入口types(?)我不能使用这个证书来authenticationweb服务。 我开始认为提供的证书是一个公共证书,用于身份validation…

我find的解决方法是在IE中导入证书并将其导出为.pfx文件。 该文件可以作为密钥库加载,并可用于使用web服务进行身份validation。 但是,我不能指望我的客户每次收到新证书时都要执行这些步骤。 所以我想直接将.cer文件加载到Java中。 有什么想法吗?

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

  • 如果你想authentication你需要私钥。 没有别的select。
  • 证书是具有额外属性(如公司名称,国家等)的公钥,由一些证书颁发机构签署,以保证附属属性为真。
  • .CER文件是证书,没有私钥。 私钥通常提供.PFX密钥库文件。 如果你真的authentication是因为你已经导入了私钥。
  • 您通常可以导入.CER证书没有任何问题

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

这里是我已经用于编程导入.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); } 

导入从浏览器下载的.cer证书文件(打开url和挖掘细节)到java_home\jre\lib\security cacerts密钥库中,这对我来说是工作的,而不是试图生成和使用我自己的密钥库。

  1. 转到您的java_home\jre\lib\security
  2. Windows )使用cmdCTRL + SHIFT + ENTER打开pipe理命令行
  3. 运行keytool导入证书:
    • (分别将yourAliasNamepath\to\certificate.cerreplacepath\to\certificate.cer
  ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer 

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

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

以下为我工作:

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

您已拥有的证书可能是服务器证书或用于签署服务器证书的证书。 您将需要它,以便您的Web服务客户端可以validation服务器。

但是,如果还需要使用SSL执行客户端身份validation,则需要获取自己的证书,以便对Web服务客户端进行身份validation。 为此,您需要创build一个证书请求; 该过程涉及创build您自己的私钥和相应的公钥,并将该公钥与您的一些信息(电子邮件,名称,域名等)一起附加到称为证书请求的文件。 然后,您将该证书请求发送给已经向您询问的公司,他们将创build您的证书,通过使用其私钥签署您的公钥,然后他们将您的证书发回给您一个X509文件,您可以现在添加到您的密钥库中,并且您将准备好使用需要客户端身份validation的SSL连接到Web服务。

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

当你拿回你的证书时,运行“keytool -importcert -alias -keypass -keystore”。

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

以下是我用来批量导入当前目录中的一堆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. 在文本编辑器中以下列格式另存为.txt证书数据

    —– BEGIN CERTIFICATE —– [微软串连的数据] —– END CERTIFICATE —–

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