这是一个网友在跟我交流openssl的Mail记录整理出来的,希望能够对刚刚接触Openssl的朋友有用。
Q1:我是偶然一次在清华的BBS上看到了你的文章,关于CA认证的。很感兴趣。你是用的openssl吗,可以发一点关于openssl API的资料给我吗?
A1:Openssl本身提供的API资料非常有限,当然,基本的函数说明文档还是有一些的,主要在Doc目录下。此外,Openssl的官方网站也可以找到一些讨论的材料,但是非常有限。至于Openssl的中文资料就非常少了,好像在水木上有些网友的心得,可以看看。要对Openssl有深入的了解,研究其源代码是必须的过程,作为起步,可以从它的APP程序开始。 Openssl还提供了几个简单的例程,也可以看看。
Q2:我现在打算在linux下,建一个小型CA.用浏览器-服务器模式,用户在前端发出请求,服务器来生成密钥和证书。我想后台用php,openssl是命令行方式,我找了一些php调用openssl的函数,但是这些是php新增的功能,只给出了定义。我现在不知道该怎么办了,有没有其他的比如jsp什么的,可以调用openssl.
A2:我没有在Linux下使用过Openssl,我是在Windows下使用的。象你所说的功能,Openssl是完全可以完成的。Openssl是使用标准C语言写的,所以只要按C语言的标准函数格式调用就可以了。Openssl的命令行方式直接调用我个人觉得并不是很方便,你可以对每个命令对应的源程序稍微修改,变成适合你需要的函数形式,这样更方便。而且,这些程序并不是很长,改起来不是特别困难的。
Q3:我这几天在试那些函数,有一些小收获,心情一下子好多了。你作的时候,证书和crl,密钥是用什么存储的。我想用库来存放证书。那当我作废一个证书时,应该从证书库里删除这个证书吗?另外,假如我用文件来存放crl ,是不是当新生成一个crl时,就可以删除以前的crl,也就是只保留一个最近的crl文件即可。
A3:我做的时候,证书、CRL以及密钥都是用数据库存放的,但是也可以导入文件或IC卡中,其实,这个存放形式并不重要。做废一个证书的时候,可以从证书库里删除证书,也可以建一个吊销证书库,专门存放吊销的证书,作为以后查证的依据。必须注意的是,删除证书的时候,Openssl是需要更新一个文本文件index(好像是这个名字),因为最后Openssl生成CRL的时候就是根据这个文件生成的。CRL理论上是最新的吊销证书列表,所以你生成了新的CRL之后,旧的当然可以删除。
Q4:我用php的一个openssl_csr_sign()函数,可是只能生成自签名的证书,不能给其它证书签名。看来我只能看openssl的源程序了。我只想看对应于命令行openssl ca ...的这一段源程序,你知道它在哪个文件里吗?我是在linux下,我不知道在windows 下可不可以在命令行方式下执行这条命令,它实现的是用根证书给证书请求签名。
A4:Openssl CA对应的源程序就是app\ca.c,windows下也有命令行方式,其内容跟Linux下应该是一样的。
Q5:我在linux下用openssl生成一个自签名的根证书,后缀为.crt,在windows下可以打开.之后用根证书签名一个用户请求,生成用户证书(扩展名是.crt),但在windows下打开时却显示"无效的安全证书文件" ,这是为什么?
A5:windows下的证书格式跟openssl生成的证书格式不完全一样,主要是openssl的证书附加了一些文本头信息。这是很奇怪的一个问题,因为Openssl生成的自签名根证书却是不带这个头信息的,肯定是写这个代码的那个老兄一时胡涂了。所以,你只要用写字板把生成的证书打开,然后把------BEGIN….------前面的信息去掉就可以了。