OpenSSL
-
经常问到的问题
--------------------------------------
*
目前的
OpenSSL
的版本是什么?
*
文档在哪里?
*
我怎样和
OpenSSL
的开发人员联系?
*
要使用
OpenSSL
我需要申请专利许可证吗?
*
OpenSSL
线程安全吗?
*
为什么我收到
"PRNG
not
seeded"
这样的错误信息?
*
为什么链接器抱怨说有未定义的符号?
*
我在哪里能得到编译好了的
OpenSSL
版本?
*
我在
Windows
下编译了一个程序,可它崩溃了:为什么?
*
怎样使用ASN1的函数读写DER编码的缓冲区?
*
我想使用
这样的宏,但却给我一个错误,为什么?
*
我调用了
但是却失败了,为什么?
*
我的错误输出只是一大堆数字,它们是什么意思?
*
为什么我收到什么未知算法的错误信息?
*
怎么创建证书或者认证请求?
*
我为什么不能创建认证请求?
*
为什么
会因为证书认证错误而失败?
*
为什么我与使用OpenSSL的服务器联接的时候总是只能使用弱加密?
*
我怎样才能创建DSA证书?
*
为什么我不能和一台使用DSA证书的服务器建立SSL联接?
*
我怎么才能删除一个私钥上的口令保护?
*
为什么OpenSSH
的
configure
脚本不能检测到
OpenSSL?
*
为什么
OpenSSL
测试带着
"bc:
command
not
found"
信息失败?
*
为什么
OpenSSL
测试带着
"bc:
1
no
implemented信息失败?
*
为什么
OpenSSL
在
Alpha
True64
Unix
上编译失败?
*
为什么
OpenSSL
带着"ar:
command
not
found"
这样的错误信息编译失败?
*
目前的
OpenSSL
的版本是什么?
目前的版本可以从获得.OpenSSL
0.9.6
在
2000
年
9
月
24
日发布.
除了当前的稳定版本以外,你还可以获取
OpenSSL
的每日开发快照,在
,或者你也可以通过匿名
CVS
访问
获取.
*
文档在哪里?
OpenSSL
是一个库,它为类似安全
web
服务器这样的应用提供加密功能.
请仔细阅读你想用的应用的文档.INSTALL
文件解释了如何安装这个库的问题.
OpenSSL
包含一个可以用于执行加密功能的命令行工具.在
openssl(1)
手册页
里有描述.给开发人员使用的文档正在写.有几个手册页已经可以用了;libcrypto
和
libssl
库的概述在
crypto(3)
和
ssl(3)的手册页里描述.
OpenSSL
手册页安装在
/usr/local/ssl/man
(或者你象
INSTALL
里描述的那样声明
的另外一个目录).另外,你可以在阅读大多数
当前版本的文档.
有关
libcrypto
里面的部件的更多内容,你可以阅读
Ariel
Glenn
的关于
SSLeay
0.9
的文档,它是
OpenSSL
的前身,它的文档在
那些文档中有许多仍然适用于
OpenSSL.
在
doc/openssl.txt
里有一些关于证书扩展和
PKCS#12
的文档.
最早的
SSLeay
的文档放在
OpenSSL
的
doc/ssleay.txt
里.如果其他的资源都
不能帮助你的话,那么它也许有用,不过你一定要知道它反映的是过时的
SSLeay
0.6.6
的版本.
*
我怎样和
OpenSSL
的开发人员联系?
README
文件描述了如何向
OpenSSL
提交臭虫报告和补丁.OpenSSL
邮件列表
的信息可以在
获得.
*
要使用
OpenSSL
我需要申请专利许可证吗?
README
文件的专利(patent)段列出了你使用OpenSSL时可能要遵循的专利.
请咨询一位律师获取关于版权的信息.OpenSSL
开发组不提供法律建议.
你可以配置你的
OpenSSL
不使用
RC5
和
IDEA.用下面的命令:
./config
no-rc5
no-idea
*
OpenSSL
线程安全吗?
是(有一个局限:一次
SSL
联接不能使用多线程进行并发).在
Windows
和许多
Unix
系统上,OpenSSL
自动使用标准库的多线程版本.如果你的平台不是这些平台
之一,请参考
INSTALL
文件.
多线程应用必须给
OpenSSL
提供两个回调函数.这些都在
thread(3)
手册页里描述.
*
为什么我收到
"PRNG
not
seeded"
这样的错误信息?
加密软件需要一个非周期的数据源才能正确运转.
许多开放源码的操作系统提供一个"随机设备"为这个用途服务.而在其他系统上,
应用在生成密钥或者执行公钥加密之前必须用合适的数据调用
RAND_add()或
RAND_seed()函数.
有些有缺陷的应用不做这件事.到版本
0.9.5,OpenSSL
里面的需要随机数
的函数如果在随机数发生器没有收到一个128位的随机值就会报一个错误.
如果出现这个错误,请与你使用的应用的作者联系.很可能是他/她就没有正确
使用这些东西.OpenSSL
0.9.5
和以后的版本会拒绝执行那些有潜在的不安全加密
的动作,以此把错误显示出来.
在没有
/dev/urandom
的系统上,使用熵收集守护(Entropy
Gathering
Demon)
也是一个好计策);参阅
RAND_egd()
的手册页获取细节.
大多数
openssl
的命令行工具会试图使用文件
$HOME/.rnd
(或者
$RANDFILE,
--如果设置了这个环境变量)用做产生
PRNG
种子.如果这个文件不存在或者太短,
就有可能出现那个
"PRNG
not
seeded"
错误信息.
[
OpenSSL
0.9.5
的用户注意了:版本0.9.5的命令"openssl
rsa"
并不做这件事,并且在那些没有
/dev/urandom
的系统上用口令加密一个
RSA密钥时会失效!这是一个库里面的臭虫;请使用更高版本的软件.]
对于
Solaris
2.6
而言,Tim
Nibbe
和另外一些人建议
安装
SUNski
包.该包来自
Sun
补丁
105710-01
(Sparc),它会增加一个
/dev/random
设备并确保其投入使用,通常是通过
$RANDFILE.其他
Solaris
版本也可能有类似补丁.不过,我们必须警告你
/dev/random
通常是一个块设备,
这一点可能对
OpenSSL
有些影响.
*
为什么链接器抱怨说有未定义的符号?
可能是因为编译中断了,而且
make
没有认识到还缺少某些东西.运行
"make
clean;
make".
如果你用的是
./Configure
而不是
./config,请确信你选用了正确的目标机器.
在不同的
OS
版本之间的文件格式可能有些许区别(比如
sparcv8/sparcv9,
或者
a.out/elf).
如果你看到的错误信息包含下面的符号,请使用
"no-asm"
配置选项,
就象
INSTALL
里描述的那样:
BF_cbc_encrypt,
BF_decrypt,
BF_encrypt,
CAST_cbc_encrypt,
CAST_decrypt,
CAST_encrypt,
RC4,
RC5_32_cbc_encrypt,
RC5_32_decrypt,
RC5_32_encrypt,
bn_add_words,
bn_div_words,
bn_mul_add_words,
bn_mul_comba4,
bn_mul_comba8,
bn_mul_words,
bn_sqr_comba4,
bn_sqr_comba8,
bn_sqr_words,
bn_sub_words,
des_decrypt3,
des_ede3_cbc_encrypt,
des_encrypt,
des_encrypt2,
des_encrypt3,
des_ncbc_encrypt,
md5_block_asm_host_order,
sha1_block_asm_data_order
如果这些东西都不能帮你解决问题,那你可以试试当前的快照(源程序).
如果问题依旧,请提交一个错误报告.
*
我在哪里能得到编译好了的
OpenSSL
版本?
有些使用
OpenSSL
的应用是以二进制的形式发布的.当使用这样的应用时,
你不需要自己安装
OpenSSL;该应用会包含所需要的部分(比如,DLL)
如果你想在
Windows
系统上安装
OpenSSL,但是你没有
C
编译器,请阅读
INSTALL.W32
里的
"mingw32"
节,获取如何获取和安装自由的
GNU
C
编译器的信息.
许多
Linux
和
*BSD
发布版带有
OpenSSL.
*
我在
Windows
下编译了一个程序,可它崩溃了:为什么?
通常是因为你忽略了
INSTALL.W32
里的注解.你必须和多线程版本的
VC++
运行时间
DLL
库链接,否则冲突会导致程序崩溃:通常是在第一次
BIO
相关的读写操作的时候.
*
怎样使用ASN1的函数读写DER编码的缓冲区?
你有两个选择.一个是用一个内存BIO和
i2d_XXX_bio()或
d2i_XX_bio()一起使用,
另一个是你可以直接使用
i2d_XXX(),d2i_XXX()
函数.
因为这个问题是最常见的导致痛苦的问题,所以我们在这里包含了一个使用PKCS7
的代码片段做例子:(靠,我花了整整一周读程序才找到方法,眼前一黑...)
unsigned
char
*buf,
*p;
int
len;
len
=
i2d_PKCS7(p7,
NULL);
buf
=
OPENSSL_malloc(len);
/*
or
Malloc,
error
checking
omitted
*/
p
=
buf;
i2d_PKCS7(p7,
&p);