SSL中间人相关技术---根据给定的域名自动伪造证书
本文由CSDN-蚍蜉撼青松【主页:http://blog.csdn.net/howeverpf】原创,转载请注明出处!
一、基于OpenSSL命令的证书手工制作流程
在实现证书的自动生成前,必须先弄清楚使用OpenSSL命令手工制作证书的方法与步骤。以生成一个二级证书链为例,将会用到以下命令:
// 生成顶级CA的公钥证书和私钥文件,有效期10年(RSA 1024bits,默认)
openssl req -new -x509 -days 3650 -keyout CARoot.key -out CARoot.crt
// 为顶级CA的私钥文件去除保护口令
openssl rsa -in CARoot.key -out CARoot.key
// 为应用证书生成私钥文件
openssl genrsa -out app.key 2048
// 根据私钥文件,为应用证书生成 csr 文件(证书请求文件)
openssl req -new -key app.key -out app.csr
// 使用CA的公私钥文件给 csr 文件签名,生成应用证书,有效期5年
openssl ca -in app.csr -out app.crt -cert CARoot.crt -keyfile CARoot.key -days 1826 -policy policy_anything
其中前两句命令生成了一个自签名根证书CARoot.crt及其对应的私钥文件CARoot.key;后两句命令生成了一个名为app.crt的应用证书及其对应的私钥文件app. key,并用前面生成的CARoot.crt、CARoot.key为应用证书app.crt签名。
对于这些命令和参数的具体含义,我已在另一篇博文《使用OpenSSL工具制作X.509证书的方法及其注意事项总结》里进行了详细阐述,此处略过不提。
二、证书自动伪造待解决的问题
因为所有伪造的应用证书都可以使用一个自签名根证书签发,没有必要每次签发前重新生成。所以,本文所讨论的自动伪造证书,只是特指应用证书,并非是全自动从头开始伪造一个证书链,这就只会用到上一小节中第二部分提到的三条命令。
在使用上述三步生成应用证书的时候,有几个地方会要求人机交互,因此由手工制作转为自动生成,首先要做的就是想办法避免或代替这些人机交互。下面根据证书的制作过程依次介绍:
- (1) 在第二步,生成csr文件的时候,OpenSSL会要求输入一些关于证书持有者身份的信息【国家代码、省份、城市、公司、部门,以及通用名】,也称为DN字段。如果不想在命令运行过程中逐个输入这些DN字段的值,作为代替,可以在命令中直接使用选项-subj(这也是上节中所说的博文中有详细说明的),如下所示(以网易126为例):
openssl req -new -subj/C=CN/ST=Zhejiang/L=Hangzhou/O=NetEase\ \(Hangzhou\)\ Network\ Co.,\ Ltd/OU=MAIL\Dept./CN=*.126.com -key app.key -out app.csr
- (2) 在第三步,使用CA给csr文件签名的时候,OpenSSL会要求在运行过程中手工完成两次确认输入。如果想要避免,可以在命令里加上-batch选项,如下所示:
openssl ca -in app.csr -out app.crt -cert CARoot.crt-keyfile CARoot.key -days 1826 –policy policy_anything –batch
找到了以上这些避免或代替人机交互的方法,下一步需要解决的问题是命令的各个参数如何取值,同样根据证书的制作过程依次介绍:
- (1) 在第一步,为应用证书生成私钥文件的时候,需要指定密钥长度,这个长度值当然要和真实证书一致。OpenSSL提供了以下函数,以便从真实证书中提取这一信息:
// 获取真实证书的公钥(假设已经提前获取了指向X509结构真实证书的指针pstCert)
EVP_PKEY *pstPubKey =X509_get_pubkey(X509 *pstCert);
// 获取真实证书中公钥的密钥长度
int nKeyBitsLen =EVP_PKEY_bits(pstPubKey);
- (2) 在第二步,生成csr文件的时候,需要指定选项-subj的具体参数取值。这个参数说明了证书持有者的身份,所以也需要和真实证书保持一致。命令要求此选项参数必须符合:/type0=value0/type1=value1/t