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

Jan*_*ter 208 java certificate keystore

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

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

luj*_*jop 293

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

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
    
    Run Code Online (Sandbox Code Playgroud)

  • .CER文件确实有公钥.他们没有私钥.建议编辑.. (5认同)
  • -alias在这做什么? (5认同)
  • :( - > keytool错误:java.lang.Exception:输入不是X.509证书 (5认同)
  • 原来,私有密钥是由IE插件生成的.目前唯一的解决方案是在IE中导入证书并导出.pfx文件. (3认同)
  • @hop Java 密钥库可以有多个证书,每个证书都有不同的别名来标识它。您可以使用它作为参考来识别它和/或通过别名以编程方式检索它。 (2认同)

jed*_*diz 73

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

  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
Run Code Online (Sandbox Code Playgroud)

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

  • 注意使用JDK开发时,正确的路径是`java_home\jdk_x.xx\jre\lib\security`绝对路径使用反斜杠,例如`"C:\myCert.crt"`引号是可选的,如果路径不包含空格。 (2认同)

Pat*_*k M 49

这是我用于以编程方式将.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);
}
Run Code Online (Sandbox Code Playgroud)


dog*_*ane 17

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

以下适用于我:

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit
Run Code Online (Sandbox Code Playgroud)

mycert.cer包含的位置:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试将未修改的证书导入密钥库时,我收到错误"keytool error:java.lang.Exception:输入不是X.509证书".以我在帖子中描述的方式修改证书后,我可以使用与您类似的命令导入证书而不会出错.但是,它作为trustedCertEntry导入,在访问Web服务时不使用. (2认同)

Sha*_*ara 9

keystore-explorer.org提供了一个开源GUI工具

KeyStore资源管理器

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

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

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

shantha@shantha:~$./Downloads/kse-521/kse.sh
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

和去ExamineExamine a URL选项,然后给你想要导入的网站URL.

如果您提供Google网站链接,结果窗口将如下所示. 在此输入图像描述

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

  • 具有讽刺意味的是,所提供的链接指向未经认证的 http - no s - 站点。 (2认同)

Cho*_*hos 6

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

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

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

当您取回证书时,请运行"keytool -importcert -alias -keypass -keystore".

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


Bra*_*rks 5

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

./import_all_certs.sh
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)