首页 文章

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

提问于
浏览
173

在开发Java Web服务客户端期间,我遇到了一个问题 . Web服务的身份验证使用客户端证书,用户名和密码 . 我从webservice后面的公司收到的客户证书是 .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 回答

  • 3

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

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

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

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

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

  • 54
    • 如果要进行身份验证,则需要私钥 . 别无选择 .

    • 证书是具有额外属性(如公司名称,国家/地区等)的公钥,由某些证书颁发机构签名,以确保附加属性为true .

    • .CER文件是证书,没有私钥 . 私钥通常提供.PFX密钥库文件 . 如果您真的进行身份验证是因为您已经导入了私钥 .

    • 您通常可以毫无问题地导入.CER证书

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

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

    • 转到 java_home\jre\lib\security

    • (Windows)使用 cmd 和CTRL SHIFT ENTER打开管理命令行

    • 运行keytool导入证书:

    • (分别替换 yourAliasNamepath\to\certificate.cer

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

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

  • 43

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

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

    以下适用于我:

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

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

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

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

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

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

    enter image description here

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

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

    这是一个用例和休息是用户(所有信用转到keystore-explorer.org

  • 2

    这是我用来批量导入当前目录中的一堆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
    
  • 16

    以下是这对我有用的方法:

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

    -----开始证书----- [由microsoft序列化的数据] ----- END CERTIFICATE -----

    • 打开Chrome浏览器(此步骤也可以与其他浏览器一起使用)设置>显示高级设置> HTTPS / SSL>管理证书在步骤1中导入.txt

    • 以Base-64编码格式选择并导出该证书 . 将其保存为.cer

    • 现在您可以使用keytool或Portecle将其导入Java密钥库

相关问题