2012-04-12 78 views
1

现状产生新的.p12/.jks:更新/从.der

我们做一个POST使用HTTPS/SSL一定的URL。对于这个工作我的(前)同事发布了这个问题:Java HTTPS client certificate authentication

所以基本上我们有一个密钥库.p12格式和信任库是.jks文件。

我们无法控制接收到我们POST请求的服务器。

问题:

管理员为我们提供了一些新的.der文件,因为他们的老证书即将到期的服务器。

由于我是相当新的SSL证书和keytool-和openssl-命令我不知道如何从这里开始。

1)是否有必要产生新.p12.jks文件?或者我只需要生成一个新的.jks文件?

2)如何生成从.der证书这些文件?我发现一些网站的命令最多,但我无法成功生成我需要的东西。

的最后一个命令我试过(无济于事)是:

keytool -storepass dsmserver -keystore c:\temp\newkeystore.jks -importcert -alias "c:\temp\newcert.der" -trustcacerts 
+0

你有钥匙和证书.der文件的权利? – Phani 2012-04-12 08:35:37

+0

他们为我提供了3个不同的.der文件。所以我假设我有他们。 – 2012-04-12 09:46:39

回答

2

等一下,哪个证书过期了?如果是他们的,那就不需要向你发送一个新文件(毕竟,当stackoverflow.com的SSL证书过期并且他们安装了一个新的文件时,你不必更新浏览器)。如果您正在进行相互身份验证(客户端证书身份验证),则会涉及四个证书:您的证书,其证书,签名证书的授权机构证书以及签署证书的授权机构证书。他们向您发送他们的证书,并检查它是否由您信任的证书颁发机构正确签名(这是信任仓库的用途 - 它是您信任从其一侧签署证书的证书颁发机构的列表)。随后,您发送您的证书,并检查它是否由他们信任的证书颁发机构正确签署。 (当然,所有这些都是在SSL握手过程中在JSSE的幕后自动完成的)

请记住,证书是一个(签名)断言,某个特定公众键。因此,如果他们的证书过期了,他们会生成一个新的证书,并由您已经信任的CA签名,并用此证书替换旧证书。当您的软件(自动作为幕后SSL握手的一部分)获得新握手时,它将检查签名者(“签发者”)是谁,以及它是否在您的受信任机构列表中(并且已正确签名)。如果检查出来,你会自动接受它。除非他们正在更换证书颁发机构,并且您还不相信新证书颁发机构,否则他们不需要向您发送任何带外信息以实现此目的。如果是这样,你可以使用

keytool -import -keystore <truststore> -file <certificate file> -alias <someca> 

如果,另一方面,你的证书是过期的人,那么他们不应该送你什么未经请求。

keytool -genkey -alias <myalias> -keystore <keystore>.p12 -storetype pkcs12 
keytool -certreq -alias <myalias> -file request.csr -keystore <keystore>.p12 -storetype pkcs12 

这将更新与新的私钥的密钥库,创建一个名为“request.csr”的文件,你应该然后发送到他们(或到:相反,你应该通过以下方式生成CSR在他们的信任仓库中的CA)签名。他们将与签名证书回应,你会再使用导入回您的密钥库:

keytool -import -alias <myalias> -file <signed certificate>.cer 

如果我猜,它看起来像他们尝试执行这三个步骤为你,并试图向您发送证书和相应的私钥,这是无效的 - Java会(尽力!)尽力阻止你导入,因为私钥本身在通过不受信任的通道(电子邮件,我假设?)发送时本身被污染了。这打破了PKI的目的 - 除了你以外,任何人都不应该访问你的私钥。

+1

我明白了,这清除了一些东西。到目前为止我的理解是:**他们的**证书已过期,他们向所有客户端发送了三件事:公钥证书,中间CA证书和根CA证书。我不知道他们是否改变了CA级别的任何内容。他们还告诉我,我的私钥没有改变......为了安全起见,我将新的CA证书添加到我的(预先存在的)jks文件中? – 2012-04-13 12:34:42

+0

是的,你所需要做的就是将中间证书添加到信任库(我相信你说的是JKS文件)。您也可以添加根证书,但您不需要,因为它们的证书将使用中间证书进行签名(如果中间证书是可信的,证书是可信的)。 – 2012-04-13 13:54:25

+0

所以我使用:'keytool -trustcacerts -import -keystore existing.jks -file intemed_ca.der -alias servercert'将intermed cert添加到我现有的jks密钥库(aka truststore)中。我会在今天或明天测试这个,并发布后续信息。 – 2012-04-16 12:36:13

1

下载从下面的链接文件:ImportKey.Java

运行以下命令:

javac ImportKey.java 
java ImportKey key.der cert.der 

    - arg1 is your key and arg2 iscertificate. 

命令将把你的密钥放到Java Key Store中。

+0

我熟悉ImportKey.java文件。我不知道3 .der文件中的哪一个代表密钥和/或证书。 所以,我想每一个可能的组合: 'Java的ImportKey 1.der 2.der' 'Java的ImportKey 1.der 3.der' 'Java的ImportKey 2.der 1.der' '的Java ImportKey 2 .der 3.der' 'Java的ImportKey 3.der 1.der' 'Java的ImportKey 3.der 2.der' 所有这些命令导致以下错误之一: java.security.InvalidKeyException :IOException:DER输入,整数标记错误 或 java.security.InvalidKeyException:无效的密钥格式 – 2012-04-12 10:21:04

+0

您可以与提供文件的人员联系以找出哪一个是证书和密钥。 – Phani 2012-04-12 10:26:16

+0

我现在确定哪个.der文件是关键字,哪个是cert。如果我运行ImportKey工具,我仍然会收到:java.security.InvalidKeyException:无效的密钥格式 – 2012-04-12 12:00:41