需要澄清私钥和公钥以及证书

时间:2015-01-30 11:47:51

标签: openssl ssl-certificate

我已经检查过很多关于使用openssl的教程​​和示例,但没有一个是足够清楚或完整的。

我理解Diffie-Hellman算法本身,但我不清楚openssl是如何工作的。

如何在不连接服务器的情况下从私钥生成公钥?

客户端和服务器必须使用相同的prime和base,所以除非它们是预定的(是吗?),否则在你同意prime和base之前,你不能从私钥生成公钥。

证书中的主要和基数在哪里?

客户端和服务器是否应拥有SAME证书的副本?客户端只检索服务器证书并看到它与它自己的相同?

证书的验证是在握手中自动完成还是必须编程?

当你加密和解密时,这是不是由openssl堆栈自动完成的,我是否必须调用加密和解密函数来做到这一点?

1 个答案:

答案 0 :(得分:3)

SSL/TLS handshake期间,服务器和客户端首先需要协商双方支持的常见密码套件。如果他们同意DHE密钥交换和RSA身份验证(一种非常常见的情况),则服务器始终发送证书RFC5246,第7.4.2节)和 ServerKeyExchange ( 7.4.3)发送给客户端的消息,然后客户端发送 ClientKeyExchange (7.4.7)消息作为响应。

  

如何在没有私钥的情况下生成公钥   连接到服务器?

     

客户端和服务器必须使用相同的prime和base,除非它们   是预定的(是吗?)你不能从中生成公钥   私钥,直到你同意素数和基数。

     

证书中的主要和基数在哪里?

现在对SSL / TLS协议中应用的Diffie-Hellman流进行一些数学运算:

服务器选择主要 p 和base <生成器 g Zp 。通常它在服务器源代码中修复,或者sysadmin可以提供自己的dhparam文件(例如由openssl dhparam命令生成)。它可以是公共的并且可以重复使用。只有 p 的长度对安全性很重要。

服务器随机生成其秘密值( Xs )和公共值( Ys = g ^ Xs mod p )。它将带有 p g Ys ServerKeyExchange 消息发送给客户端。

客户端收到 p g Ys 。它随机生成其秘密值( Xc )和公共值( Yc = g ^ Xc mod p )。它会在 Yc 中发回 ClientKeyExchange 消息作为响应。

双方现在可以计算共同主密钥( S = Yc ^ Xs =(g ^ Xc)^ Xs = g ^(XcXs)mod p S = Ys ^ Xc = (g ^ Xs)^ Xc = g ^(XsXc)mod p )。它用于进一步的计算。

  

客户端和服务器是否应拥有SAME证书的副本?该   客户端只检索服务器证书并看到它是相同的   作为自己的?

客户端收到包含服务器证书(带有中间信任链)的证书消息。客户端通过检查是否可以重建从您的证书,通过中间CA证书到默认情况下安装在其系统中的根(自签名)CA证书的信任路径来验证它。

  

证书的验证是否自动完成   握手还是必须编程?

     

当你加密和解密时,这是不是由openssl堆栈自动完成的,我是否必须调用加密和解密函数来做到这一点?

SSL / TLS协议旨在对使用它的任何应用程序完全透明。其实现(例如OpenSSL)包含验证证书(身份验证),建立公共密钥(密钥交换)或加密/解密数据(对称密码)的所有必要功能。您不需要自己编写这些加密算法。