2012-02-10 71 views
-1

嗨,我有点失落,希望你能让我离开这里。我会尽可能地澄清,因为我不太了解/知道如何使用证书。JBoss/Java和SSL

我有一个应用程序应该使用webservices和SSL与另一个进行通信。我们都要求我们的主要“证书颁发机构”获得证书。 他们给我们4个文件,为.P12文件的密码: .csr文件,.CER,.KEY,.P12

这里是我做过什么: *配置JBoss上8443使用SSL和使用的P12文件作为密钥库 为了测试这一点,我做了一个小的Java类调用该服务器上的web服务,使用:

props.setProperty("javax.net.ssl.trustStore", "/.../.../certif.p12"); 
props.setProperty("javax.net.ssl.trustStorePassword", "XXXXXXXXX"); 
props.setProperty("javax.net.ssl.trustStoreType", "PKCS12"); 

的连接工作,但我觉得我失去了一些东西,因为我没有使用其他文件。 如果我将我的.P12文件和密码发送给应该调用我的Web服务的应用程序,它会好吗?

编辑: 我忘了提及,我应该调用另一个应用程序上的Web服务,所以它应该是另一种方式,我只需要一个.P12并通过?

我读过很多关于公钥,私钥,keytool的东西,但现在我的脑海里有点乱。 感谢您的任何信息!

+0

您可能想要详细了解keystore和truststore之间的差异,例如[here](http://stackoverflow.com/a/6341566/372643)。 – Bruno 2012-02-10 17:52:05

回答

2

他们给我们4个文件,为.P12文件的密码:.csr文件,.CER, .KEY,.P12

理想情况下,你应该已经生成的私钥(在.key )和CSR(在.csr中),并且CA应根据您将汇编在一起构建PKCS#12文件(.p12)的CSR(通常在.cer)回来。

在此阶段,您可以放弃CSR。 PKCS#12文件现在应包含私钥,其相关证书以及可能附带的证书链。您可以稍后再从该.p12文件中提取.key.cer文件。我想你会得到所有这些文件,因为它们的生成方式(使用中间文件),或者为了方便,不必自己转换它们。

Java术语并不理想,但密钥库和信任库是两个类型为keystore的实体,但具有不同的用途。所述的KeyManager和的TrustManager(并因此javax.net.ssl.keyStore和javax.net.ssl.trustStore中之间)之间的差异如下(从JSSE ref guide引述):

的TrustManager:确定是否所述远程认证证书(以及连接)应该是可信的。

KeyManager:确定要发送到远程主机的认证凭证。

javax.net.ssl.trustStore*属性是配置TrustManager的一种方法。 javax.net.ssl.keyStore*属性是配置KeyManager的一种方法。

通常,在信任存储中不需要私钥材料(除非您也使用相同的密钥存储)。使用单独的信任库通常会更好,您可以在机器上自由复制,而不必担心泄漏私钥材料。 什么是有意义的将建立一个新的密钥库(JKS),您将使用作为一个信任库,使用CA证书(不知道是否已与他们一起提供)。

您没有通过仅设置信任库进行相互身份验证(密钥库没有默认值,因此他们需要明确指定这些参数)。如果要使用客户端证书连接到远程方,则需要将其设置在密钥存储库中(例如,使用javax.net.ssl.keyStore*属性,方法与您为信任存储库完成的方式相同)。

您可以将密钥库和信任库指向同一个.p12文件。副作用是由您的服务向其他地方(例如https://www.google.com)所做的其他连接将不可信,因为它不包含这些CA的连接。这就是为什么为CA证书创建单独的“信任库密钥库”(JKS可能更容易)可能更好。您可以复制默认的cacerts(在JRE目录中),将CA的证书导入并使用它。

+0

非常感谢这个评论,它有很大的帮助。如果我使用“密钥库和信任库作为.P12文件”,那么我必须使用.P12密码将其提供给客户端? .P12文件包含私钥是不是有点危险? – 2012-02-13 15:02:41

+0

事实上,你必须给他们密码(也就是私钥):当然你应该避免的。我建议建立一个单独的JKS商店,只有CA证书(而不是你的证书或私钥)。我怀疑这些证书是否在你的'.cer'文件中(它可能只是你的证书,没有链),但完整的链可能在'.p12'文件中。你也应该能够很容易地从CA获得CA证书。然后,使用'keytool -import'将它导入到一个新的密钥库中。 – Bruno 2012-02-13 15:17:02

+0

非常感谢,阅读您的回复后我做了很多事情,但它给了我很好的方式。 – 2012-02-14 15:52:34

2

我有一个应用程序应该与另一个使用webservices和SSL的 进行通信。

好的,在这里停下来。沟通如何?我的意思是它只是服务器身份验证,即您的客户端应用程序将验证Web服务或相互身份验证和Web服务也将请求您的应用程序证书?

这很重要,因为名称中显示的文件似乎暗示了后者,即当您显示的代码仅设置用于服务器认证的SSL库时,期望相互认证。

既然你在这里不提供上下文我要说的是:

  • .KEY有你的私钥
  • 的.p12有你的私钥与签名证书或可能是CA的根证书(一起去吗?)
  • CER可以有你的签名证书或受信任域中和 可能已经签署你想 证书通信的Web服务,它被认为可能是根的CA 签名证书(也即是一种可能性/猜测在这里,因为你不 多说了)
  • CSR是你的证书签名请求

我做了一个小的Java类调用该服务器上的web服务,使用

你在代码中做的是将p12设置为truststore。

如果你说这有效,那么没有双向身份验证的唯一服务器端身份验证,并且您正在使用验证Web服务,无论位于p12中。

在这种情况下并不需要communication.It剩下的就是使你能保持尤其是key文件,因为这可能您的私钥,如果您丢失/有人偷走了这则专用证书是无用/妥协。

我不确定你对安全性的要求在这里,但在我看来,你应该更多地考虑它。

即使对于这个问题,我只是试图做基于文件名的猜测.....

我希望这让你在某些赛道阅读。

+0

感谢您的评论,更多阅读后变得清晰,我应该使用相互认证。我发现这个有趣的链接https://community.jboss.org/wiki/SSLSetup(第2章),但他们开始创建公钥/私钥对。我的私钥已经有了.key文件,我不知道如何创建关联的公钥,如果这是做事的方式。 – 2012-02-13 15:06:53

+0

你的公钥在你的证书 – Cratylus 2012-02-13 15:41:10