异想天开

What's the true meaning of light, Could you tell me why

SSL知识点

日期:2014-11-28 20:02:55
  
最后更新日期:2016-12-08 16:37:53
【技术文章】
1.证书
这几天弄SSL的加密通信,查阅了大量的资料。搞懂了之前似懂非懂的一些概念。SSL位于传输层的上面,目前SSL仅应用于tcp连接,这样编码简单些。常见的SSL连接加密就是https协议。有时候,你自己写的程序也可以用那几个api来通信。SSL需要一张证书,该证书表明你的有效身份。证书有编码和格式之分。编码就是指证书文件是二进制还是base64编码。二进制的编码,后缀就是.DER,当然你懂的,后缀并不总能正确表明文件格式,若为base64编码格式,后缀命名为.PEM,base64编码的文件为文本文件。下面是一个base64编码的证书的示例:
[code lang="cpp"]
-----BEGIN CERTIFICATE REQUEST-----
---- 这里是base64编码后的部分 -----
-----END CERTIFICATE REQUEST-----
[/code]
证书格式,普遍的x509标准格式,更详细内容wiki。而常见的pkcs12格式,这种格式是混合了证书和密钥或一个证书信用链,wiki描述:
[code lang="cpp"]
In cryptography, PKCS #12 defines an archive file format for storing many cryptography objects as a single file. It is commonly used to bundle a private key with its X.509 certificate or to bundle all the members of a chain of trust.
[/code]
之前接触过一个苹果推送服务,苹果提供的就是p12文件,该文件里面包含了证书和密钥。利用openssl查看p12文件:
[code lang="cpp"]
openssl pkcs12 –in foo.p12 -info
[/code]
也可以利用openssl命令提取里面的证书或密钥:
[code lang="cpp"]
//这里仅提取密钥
openssl pkcs12 -nocerts -out PushChatKey.pem -in PushChatKey.p12
[/code]
证书的内容有些啥呢?
可以在chrome浏览器上,点击网址前面那个绿色的徽标,然后查看证书。也可以用参考1的方法。
证书制作,见另外一篇博文。证书链的问题,考虑良久,以为需要浏览器自己去下载从root证书到网站证书的所有中间证书,后来见参考2讲的很明白,这些证书集成在证书链里面了:
[-- 这是引用 begin--]
有些浏览器不接受那些众所周知的证书认证机构签署的证书,而另外一些浏览器却接受它们。这是由于证书签发使用了一些中间认证机构,这些中间机构被众所周知的证书认证机构授权代为签发证书,但是它们自己却不被广泛认知,所以有些客户端不予识别。针对这种情况,证书认证机构提供一个证书链的包裹,用来声明众所周知的认证机构和自己的关系,需要将这个证书链包裹与服务器证书合并成一个文件。在这个文件里,服务器证书需要出现在认证方证书链的前面:
[-- 这是引用 end--]

2.SSL编程
这个问题,其实下载一个openssl源码包,读里面的README和FAQ,可以获得一些有用的信息。比如openssl是否线程安全,支持异步么?这里异步网上的建议,connect之前是阻塞的,connect之后就可以设置fd为非阻塞的。因为handshake握手需要几步才能完成,这逻辑需要同步。源码里面还有一些有价值的demo。最后说一下,openssl做测试服务端和客户端方法:
[code lang="cpp"]
作客户端
openssl s_client -host host_name -port port_number
作服务端
openssl s_server -port 443 -www -cert ./server.crt -key server.key
[/code]
这样可以验证你写的程序逻辑。

1.der文件和pem文件相互转换
2.nginx配置https服务器
3.pkcs12 rfc文档