OpenSSL编程初探3 --- 根据给定的域名自动伪造应用证书

本文介绍了如何使用OpenSSL进行证书自动伪造,主要解决在生成CSR文件时的人机交互问题,以及从真实证书中提取信息。通过实现一系列函数,包括GetRealCert(), GetInfoFromCert(), ConvertSubjInfo()和FakeCert(),实现了根据给定域名自动生成应用证书的流程。" 133194692,19453730,Python的动态类型系统详解,"['Python', '开发语言', '动态类型']
摘要由CSDN通过智能技术生成

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
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值