OpenSSL私有,公钥和证书,我究竟发送给客户端的是什么?

时间:2014-08-01 13:08:20

标签: linux ssl boost openssl

我开始使用SSL。

我创建的服务器和客户端应用程序符合thisthis示例。

在互联网上搜索有关钥匙和证书的一些信息 找到了我用于服务器和客户端的命令openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem,它似乎可以工作。

我打开了cert.pem文件,发现该文件包含私钥和证书数据。我认为发放私钥是一件坏事,所以我所做的事情肯定有问题。我没有在那里看到公钥。

然后我找到了this关于如何创建私钥的简短指南。一切都好(我拒绝使用要求密码的版本)。现在我看到该文件只包含私钥。

NEXT

我找到this证书简短指南。在步骤4之后,我使用先前生成的私钥创建了证书。检查文件,确认其中只有证书数据。大。我开始思考,我终于需要一个可以发送到客户机的公钥。然后我注意到了一些东西,在那个指南中,它说Certificates are related to public key cryptography by containing a public key.嗯,我用名为“查看文件”的应用程序打开文件,它显示我在创建时输入的证书详细信息,并且有一个名为“公钥”的部分'它有数据。

所以,在认为我做得很好并完成时,我将此证书文件发送到客户端计算机,运行服务器(确定),运行客户端(FAIL),说handshaking failed

那么,我很快找到一个命令,用我的私钥创建一个公钥。将其附加到证书文件并发送给客户端。服务器(OK),客户端(OK)。所以它似乎无法从证书中提取公钥。

然后我尝试在客户端只使用公钥 - 没有证书。客户端失败,因此它必须同时具有公钥和证书。如果我失明了一会儿,我检查了我用证书中的公钥数据生成的公钥,发现它们不匹配。

问题是,我是否正确将与证书连接的公钥发送给客户? 为什么客户端应用程序不使用证书本身内的公钥?
我是否正确地做了整件事 是否以这种方式保护服务器和客户端之间的所有流量(在服务器上使用private + cert,在客户端使用pubic + cert)?

任何人都可以打开.pem文件(带有“查看文件”程序)并阅读证书所保存的内容(如国家/地区,城市,组织等)。证书是否可以这样提供?

编辑1

根据目前的答案,我看到我提供的信息太少了。我将尝试在此编辑中执行此操作。

我对SSL没有任何经验,在此工作之前我所知道的是SSL通过加密使浏览器和Web服务器之间的连接安全。

我有一项任务是升级我们的服务器以包含SSL。服务器简述:

这是一个以linux为平台的硬件+软件。它是一种行业型PC。该软件作为没有GUI的服务器工作,通过TCP / UDP发送和接收数据。

我被赋予了将SSL连接安全性包含在服务器中的任务,因此购买服务器的客户端可以连接到客户端计算机并具有加密连接。我被告知,没有人想要将他们的证书存储在第三方CA中,所以这意味着我确实需要自签名。根据我的知识,客户必须将证书包含在受信任区域(一些如何),所以我需要将证书发送到客户端,不管是让他们手动从服务器获取文件,还是使用一些半自动化方式

我正在以各种方式使用boost,所以我决定也使用SSL功能。这就是我查看提供的示例的原因。实际的客户可能会使用我无法控制的不同内容,因此我不知道他们会在“客户端SSL”中使用什么。

  

没有。它通过相互协商的对称密钥来保护,该密钥具有   与PKI密钥无关。

嗯,所以也许我从一开始就做错了。我的最终目标是使用SSL加密连接。最大的问题是:我甚至需要证书吗?

我认为就是这样,我的意思是私钥/公钥+证书是加密所需要的。但如果我这么认为是错的,我需要开始更深入地研究。

2 个答案:

答案 0 :(得分:1)

  

我是否正确将与证书连接的公钥发送给客户?

没有。它已经在证书中,没有该证书就毫无意义。

  

为什么客户端应用程序不使用证书本身内的公钥?

这里没有证据证明它没有,也没有理由不这样做。

  

我是否正确地完成了整个事情。

不可能说。你只是做了一些模糊的陈述,比如'把它发送到服务器和客户端'。您需要准确指定这两个文件在两端的安装方式。

  

服务器和客户端之间的所有流量都是以这种方式保护的(在服务器上使用private + cert,在客户端使用pubic + cert)?

没有。它通过相互协商的对称密钥来保护,该密钥与PKI密钥无关。

  

任何人都可以打开.pem文件(带有“查看文件”程序)并阅读证书所保存的内容(如国家/地区,城市,组织等)。证书是否可以这样提供?

是。它们是公共文档,描述公钥。

答案 1 :(得分:0)

  

在互联网上搜索有关密钥和密钥的一些信息   证书。找到这个命令openssl req -x509 -nodes -days 365   -newkey rsa:1024 -keyout mycert.pem -out mycert.pem我用于服务器和客户端,它似乎都有效。

OpenSSL命令openssl req ...创建证书签名请求。它意味着由一个值得信赖的机构签署。但是,您使用了openssl req -x509 ...-x509选项创建自签名证书(而不是由权威机构签名的请求)。

这对下一次观察很重要......


  

所以,在认为我做得很好并完成时,我发送了这个证书文件   到客户机,运行服务器(OK),运行客户端(FAIL),说   握手失败。

使用相互身份验证时,会发生两件事。首先,服务器可以发送它接受的可信任机构列表来验证客户端。该列表是杰出名称的集合。其次,如果客户端具有匹配的证书,则客户端会发送证书。

由于您的客户端证书是自签名的,因此无法告知服务器信任某个权限(并且服务器无法发送受信任的自签名证书列表)。

我从未在自签名客户端证书上使用相互身份验证。我相信解决方案是创建一个内部/私人可信机构(即CA)。然后,使用该CA签署客户端证书。您也可以使用它来签署服务器的证书。


  

然后我找到了关于如何创建私钥的简短指南。

您在创建自签名证书时创建了私钥。


  

然后我尝试在客户端只使用公钥 - 没有   证书。客户端失败,因此必须同时具有公钥和   证书。

正确。这是PKIX。您使用的证书包含身份和公钥(包括客户端和服务器)。

我相信有一个RFC建议只使用公钥,但我只知道电子邮件系统中的部署。例如,请参阅Domain-Based Email Authentication Using Public Keys Advertised in the DNS (DomainKeys)。还有draft-dukhovni-opportunistic-security,我相信它可以使用通过DNS发布的证书和公钥。


  

所以问题是,我发送公钥是否正确   凭证书给客户?

可能不是。但我并不完全清楚你在做什么。


  

为什么客户端应用程序不使用内部的公钥   证书本身?

它应该。但听起来你用随后创建的另一个私钥覆盖了证书生成的私钥。公钥和私钥是匹配集,如果不匹配,OpenSSL将不会使用它们。


  

服务器和客户端之间的所有流量都是以这种方式保护的(使用   服务器上的private + cert和客户端上的pubic + cert)?

嗯....服务器有证书和私钥。客户端有证书和私钥。客户端使用服务器的公钥。服务器使用客户端的公钥。因此公共密钥由对等方使用,公钥通过X509证书传输。


  

任何人都可以打开.pem文件(带有“查看文件”程序)并阅读   证书持有什么(如国家,城市,组织等)   上)。证书是否可以这样提供?

是。它被认为是公共信息,旨在发布在目录中供其他人查找。但是,您必须保密私钥。