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

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

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

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

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

我发现的一个解决办法是在IE中导入证书并将其导出为.pfx文件。该文件可以作为密钥存储库加载,并可用于使用webservice进行身份验证。但是,我不能期望我的客户每次收到新证书时都执行这些步骤。所以我想把.cer文件直接加载到Java中。任何想法吗?

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

1283930 次浏览

您不应该对证书做任何更改。您确定您正在运行正确的导入命令吗?

以下是我的工作:

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-----
  • 如果您想进行身份验证,则需要私钥-没有其他选择。
  • 证书是具有额外属性(如公司名称、国家等)的公钥,由某个证书颁发机构签名,以保证所附属性为真。
  • .CER文件是证书,没有私钥。私钥通常由.PFX keystore文件提供。 如果您真的进行了身份验证,则是因为您已经导入了私钥
  • 你通常可以导入.CER证书,没有任何问题

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

您已经拥有的证书可能是服务器证书,或者用于签署服务器证书的证书。您将需要它,这样您的web服务客户机才能对服务器进行身份验证。

但是如果您还需要使用SSL执行客户端身份验证,那么您需要获得自己的证书,以验证您的web服务客户端。为此,您需要创建一个证书请求;这个过程包括创建您自己的私钥和相应的公钥,并将该公钥与您的一些信息(电子邮件、姓名、域名等)附加到一个称为证书请求的文件中。然后,您将该证书请求发送给已经向您请求该证书的公司,他们将通过用他们的私钥签名您的公钥来创建您的证书,并将您的证书发送回一个X509文件,现在您可以将该文件添加到您的密钥存储库中,您将准备使用SSL连接到需要客户端身份验证的web服务。

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

当你取回你的证书时,运行"keytool -importcert -alias -keypass -keystore "。

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

下面是我一直用于以编程方式将.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中的密钥库中对我有用,而不是试图生成和使用我自己的密钥库。

  1. 去你的java_home\jre\lib\security
  2. (窗户)使用cmdCTRL+转变+输入打开管理命令行
  3. 执行keytool命令导入证书。
    • (分别替换yourAliasNamepath\to\certificate.cer)
    • 李< / ul > < / >

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

这样您就不必指定任何额外的JVM选项,并且证书应该可以被JRE识别。

这是我的工作方式:

  1. 在文本编辑器中以。txt格式保存以下证书数据
    < p >——开始证书 [微软数据序列化] -----END CERTIFICATE-----

    . 李< /引用> < / >
  2. 打开chrome浏览器(这一步可能也适用于其他浏览器) settings >显示高级设置> HTTPS/SSL >管理证书 导入步骤1中的.txt
  3. 选择并导出Base-64编码格式的证书。保存为。cer
  4. 现在可以使用keytool或Portecle将其导入java密钥存储库

下面是一个脚本,我用它将当前目录中的一堆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

一个开源的GUI工具可以在keystore-explorer.org找到

密钥存储库浏览器

KeyStore Explorer是Java的开源GUI替代品 命令行实用工具keytool和jarsigner。密钥存储库浏览器 通过直观的图形显示它们的功能 用户界面。< / p >

以下画面会有帮助(它们来自官方网站)

运行命令得到的默认屏幕:

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

enter image description here

然后转到ExamineExamine a URL选项,然后给出你想导入的web URL。

如果你给谷歌站点链接,结果窗口将如下所示。 enter image description here < / p >

这是用例之一,其余由用户决定(所有积分都归keystore-explorer.org)

虽然已经提供了很多很好的答案,但我想给出一个以编程方式加载ssl材料的替代方案。您可以尝试下面的代码片段:

Path certificatePath = Paths.get("/path/to/certificate.cer");
List<Certificate> certificates = CertificateUtils.loadCertificate(certificatePath);


SSLFactory sslFactory = SSLFactory.builder()
.withTrustMaterial(certificates)
.build();


SSLContext sslContext = sslFactory.getSslContext();

它可以处理pem, der(二进制)和p7b格式的文件。GitHub - SSLContext Kickstart你可以用下面的代码段添加它:

<dependency>
<groupId>io.github.hakky54</groupId>
<artifactId>sslcontext-kickstart</artifactId>
<version>7.0.2</version>
</dependency>