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

时间:2010-12-01 14:18:40

标签: java certificate keystore

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

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

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

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

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

其他信息:webservice背后的公司告诉我,应该从PC和用户那里请求证书(使用IE和网站),以便稍后导入证书。

8 个答案:

答案 0 :(得分:269)

  • 如果您要进行身份验证,则需要私钥 - 没有其他选择。
  • 证书是具有额外属性(如公司名称,国家/地区等)的公钥,由一些证书颁发机构签名,以确保附加属性为真。
  • .CER文件是证书,没有私钥。私钥通常提供.PFX keystore文件。 如果你真的认证是因为你已经导入了私钥。
  • 您通常可以毫无问题地导入.CER证书

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

答案 1 :(得分:64)

将从浏览器下载的.cer证书文件(打开网址并挖掘详细信息)导入java_home\jre\lib\security {strong}中的 cacerts 密钥库,而不是尝试生成和使用我自己的密钥库。

  1. 转到java_home\jre\lib\security
  2. Windows )使用cmd CTRL + SHIFT + ENTER
  3. 运行keytool导入证书:
    • (分别替换yourAliasNamepath\to\certificate.cer
  4.  ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer
    

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

答案 2 :(得分:46)

以下是我用于以编程方式将.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);
}

答案 3 :(得分:17)

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

以下适用于我:

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

答案 4 :(得分:7)

keystore-explorer.org

提供了一个开源GUI工具
  

KeyStore Explorer

     

KeyStore Explorer是Java的开源GUI替代品   命令行实用程序keytool和jarsigner。 KeyStore资源管理器   通过直观的图形呈现其功能等   用户界面。

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

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

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

enter image description here

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

如果您提供Google网站链接,结果窗口将如下所示。 enter image description here

这是一个用例,其余的是用户(所有信用转到keystore-explorer.org

答案 5 :(得分:6)

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

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

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

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

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

答案 6 :(得分:5)

这是我用来将当前目录中的一堆crt文件批量导入java密钥库的脚本。只需将其保存到与证书相同的文件夹中,然后按以下方式运行:

    resultado.done(
function (data){//success
$("#cursos").append($("<tr>").append(
$("<td>").append("Tema"),
$("<td>").append("Indice"),
$("<td>").append("Descripción"),
$("<td>").append("Fecha"),
$("<td>").append("Idioma"),
$("<td>").append("Imagen"),
$("<td>").append("Enlaces"),
$("<td>").append("Nivel"),
$("<td>").append("Palabras clave"),
$("<td>").append("Autor"),
$("<td>").append("Escuela"),
$("<td>").append("Categoria"),
$("<td>").append("Subcategoria")
),
$("<tr>").html(
$.each(data, function (key, data1) {
    $.each(data1, function (index, datos) {
       console.log("index", datos);
       $("<td>").append(datos);
    })
})
/* if this block comment is removed it works
$("<td>").append(data[0].tema),
$("<td>").append(data[0].indice),
$("<td>").append(data[0].descripcion),
$("<td>").append(data[0].fecha),
$("<td>").append(data[0].idioma),
$("<td>").append(data[0].imagen),
$("<td>").append(data[0].enlaces),
$("<td>").append(data[0].nivel),
$("<td>").append(data[0].keywords),
$("<td>").append(data[0].autorId),
$("<td>").append(data[0].escuelasId),
$("<td>").append(data[0].categoriaId),
$("<td>").append(data[0].subcategoriaId)*/
)
);

//data[0].tema

}//function DONE
);//done

import_all_certs.sh

./import_all_certs.sh

答案 7 :(得分:1)

以下是对我有用的方法:

  1. 在文本编辑器中将证书数据保存为.txt,格式如下
      

    -----开始证书-----   [由microsoft序列化的数据]   -----结束证书-----

  2. 打开Chrome浏览器(此步骤也可能适用于其他浏览器) 设置&gt;显示高级设置&gt; HTTPS / SSL&gt;管理证书 在步骤1中导入.txt
  3. 以Base-64编码格式选择并导出该证书。将其另存为.cer
  4. 现在您可以使用keytool或Portecle将其导入您的Java密钥库
相关问题