`

用Openssl API制作证书

阅读更多

  Openssl中形成X509证书的函数集中在genrsa.c,req.c,ca.c,x509.c等中,但是这些文件中的函数过于复杂,不太容易理解。下载了中国信息安全组织webmaster的CISOCA后受益非浅,思路清晰,真是非常感谢zrh。
  一:准备工作
    确保在windows2000系统安装了openssl,vc6.0。将libeay32.dll和SSLeay32.dll复制到system32目录 下,将libeay32.lib和SSLeay32.lib复制到当前目录并且导入工程中,将openssl里inc32下的openssl复制到VC的 include文件夹下(或者用option->directories也行),切记在主函数的开头包含如下:
  OpenSSL_add_all_ciphers();
  OpenSSL_add_all_digests();
  ERR_load_crypto_strings();
  二:产生密钥对
   从公钥基础设施(PKI)这个名词上就可以看出密钥在这个体系中的重要性,数字证书也就是将公钥和实体的一些信息绑定并且跟它相关的私钥联合使用,所以形成一对安全的密钥对是至关重要的。RSA算法是现在比较流行的公开密钥算法,在openssl里,产生RSA密钥对的文件为genrsa.c.
  主要有如下两个函数:
    1,app_RAND_load_files(char *file),它的目的是导入随机数种子文件。因为RSA算法的基础是随机产生两个大素数,所以随机数的产生极为重要,有时要配置专用机器随时生成,不过 这里可以建立一个包含两三行以上的随机字符的文件即可。
   2,RSA_generate_key(int bits, unsigned long e_value,void (*callback)(int,int,void *), void *cb_arg),参数bits是密钥的长度(如1024),参数e_value是RSA中公开的加密密钥,一般有3, 17 or 65537,常用0x10001L(十进制的65537),第三,四个参数为产生私钥过程中的回调函数,在一般应用中将它们置为NULL即可。返回一个RSA结构,不过在应用中使用的是更高一层的EVP_PKEY结构。例如:
  EVP_PKEY *m_pClientKey =EVP_PKEY_new();
  EVP_PKEY_assign_RSA(m_pClientKey,RSA_generate_key(1024,0x10001,NULL,NULL))。
  二:产生请求证书。
   在openssl中,本部分由req.c实现,不过它实在过于复杂不太利于理解。
   证书请求包括3个部分:证书请求信息,一个签名算法标识符和一个对证书请求信息的数字签名。证书的请求信息包括实体的别名、实体的公钥和一系列有关实体的其他信息的属性。构造一个证书请求包含如下几个步骤:
  1,构造主体信息值,包含一个主体别名,一个主体公钥和一组可选属性
   当然生成req证书需要一个申请一个X509_REQ对象。
   加入主体信息还必须先申请一个X509_NAME对象,然后将信息先加到这里结构中,最后把这个结构赋给req。例如添加国家和省份信息:(NID_countryName为14,NID_stateOrProvinceName为16)
  X509_REQ *req; X509_NAME *subj; char *country="cn";
  X509_NAME_add_entry_by_NID(subj,14, MBSTRING_ASC,(unsigned char *)country, -1,-1,0);
  X509_NAME_add_entry_by_NID(subj,16,MBSTRING_ASC,(unsigned char *)provinc,-1,-1,0) ;
  X509_NAME_set(&req->req_info->subject, subj);
   加入一个主体公钥(上小节生成的m_pClientKey)
  X509_REQ_set_pubkey(req, m_pClientKey);
   加入一组可选的扩展属性
  STACK_OF(X509_EXTENSION) *extlist=sk_X509_EXTENSION_new_null();
  X509_EXTENSION*ext=X509V3_EXT_conf(NULL,NULL,REQ_SUBJECT_ALT_NAME,value);
   生成扩展对象
  sk_X509_EXTENSION_push(extlist,ext);
  X509_REQ_add_extensions(req,extlist)加入扩展项目。
  2,用主体的私钥对上面的req进行签名。在签名是需要选择摘要算法,
  EVP_MD *digest=EVP_md5()(选择MD5算法)
  X509_REQ_sign(req,,m_pClientKey ,digest)
  这样一份请求证书就形成拉。
  三:形成X509证书
   由上面的数字证书介绍我们已经知道了证书的构成项,下面我们就只需要一项一项添加即可
   申请证书对象
  X509 *ptemp=NULL;
  X509 *m_pClientCert;
  m_pClientCert = X509_new();
   设置版本号
  X509_set_version(ptemp, 2)
   设置证书序列号,这个sn就是CA中心颁发的第N份证书
  ASN1_INTEGER_set(X509_get_serialNumber(ptemp),sn)
   设置证书开始时间
  X509_gmtime_adj(X509_get_notBefore(ptemp),0)
   设置证书结束时间
  X509_gmtime_adj(X509_get_notAfter(ptemp), (long)60*60*24*days)
   设置证书的主体名称,req就是刚刚生成的请求证书
  X509_set_subject_name(ptemp, X509_REQ_get_subject_name(req))
   设置证书的公钥信息
  X509_set_pubkey(ptemp, X509_PUBKEY_get(req->req_info->pubkey))
   设置证书的签发者信息,m_pCACert是CA证书
  X509_set_issuer_name(ptemp, X509_get_subject_name(m_pCACert))
   设置扩展项目
  X509V3_CTX ctx;
  X509V3_set_ctx(&ctx, m_pCACert, m_pClientCert, NULL, NULL, 0);
  X509_EXTENSION *x509_ext = X509_EXTENSION_new();
  x509_ext = X509V3_EXT_conf(NULL, name,value);
  X509_add_ext(m_pClientCert,x509_ext,-1))
   设置签名值
  X509_sign(m_pClientCert,m_pCAKey,EVP_md5());
   这样一份X509证书就生成了,下面的任务就是对它进行编码保存。
  i2d_X509_bio(pbio, m_pClientCert) DER格式
  PEM_write_bio_X509(pbio, m_pClientCert) PEM格式
  这里只是简单讲解一下openssl API制作证书的过程,没有任何错误处理,也没有任何内存释放,要看原代码还请下载中国信息安全组织(www.infosecurity.org.cn )上的CISOCA, 由于本人水平有限,如有错误敬请原谅。

分享到:
评论

相关推荐

    利用openssl自制CA证书

    具体代码实现不在本文档范围内,但通常涉及到读取`ca.crt`文件,然后使用系统API将其添加到受信任的根证书颁发机构。 5. **生成服务器证书**:创建了CA后,我们可以用它来签发服务器证书。首先为服务器生成私钥和...

    OpenSSL证书制作过程

    本文详细介绍了使用OpenSSL制作证书的过程,包括自签名CA的创建、服务器证书和客户端证书的颁发,以及如何在J2EE环境中使用这些证书。通过这些步骤,可以构建一个完整的安全通信体系,保障数据传输的安全性和通信...

    openssl-1.0.2u + openssl-1.0.2k

    OpenSSL在网络安全中扮演着重要角色,它的功能包括但不限于:数据加密、密钥生成、证书管理、数字签名和SSL/TLS协议支持。在Web服务器、邮件服务器、数据库和其他需要安全通信的应用中,OpenSSL被广泛采用。同时,...

    grafana的https协议证书配置

    第一步:自己制作一个证书使用openssl制作然后填写一些信息,证书就制作成功 第二步:使用我制作好的证书,压缩包里有修改Grafana的grafana.ini,修改配置如下:改protocol 为 httpsprotocol = https,证书路径(路径改...

    openssl-1.0.2

    - OpenSSL 提供了 C 语言的 API,允许开发者轻松集成到自己的应用中,实现加密、签名和身份验证等功能。 8. **跨平台支持** OpenSSL 可在多种操作系统上运行,包括 Linux、Windows、Mac OS X、FreeBSD 等,具有...

    使用数字证书进行PKCS#7数字签名

    越来越多的应用需要我们使用USB接口数字证书进行PKCS#7数字签名。本文分别介绍了使用微软CryptoAPI方式和OpenSSL Engine方式进行数字签名。特别地,提出了OpenSSL Engine简化方式,这种方式更为灵活方便易行。

    Bouncy Castle 1.64 API及制作工具

    使用 Bouncy Castle 时,开发者需要注意选择合适的 API(轻量级或提供商)、理解加密算法的原理、正确处理密钥和证书,以及遵循最佳安全实践。在遇到问题时,官方文档和社区支持是宝贵的资源。 总之,Bouncy ...

    openssl 源码 帮助手册

    2. **API 文档**:详细的 API 文档解释了各个函数的用途、参数和返回值,有助于开发者正确使用 OpenSSL 库。 3. **示例代码**:帮助文档通常会包含一些示例代码,展示如何在实际项目中应用 OpenSSL,例如创建自签名...

    window API下的 SSL\TLS 传输

    证书,可以用openSSL制作,要注意的是server端填CN字段的时候要写主机名或者IP。 OpenSSL直接作出了的Crt证书导入系统不能用,需要将crt证书和私钥证书合成p12格式的证书再倒入系统,才可以用 证书查看命令,...

    cert.zip(iOS 证书加密)

    "cert.zip"这个压缩包文件涉及到一个iOS应用程序使用OpenSSL库来实现公钥加密和私钥解密的机制,这是确保数据安全传输的一种常见方法。OpenSSL是一个强大的安全套接字层密码库,包含各种主要的密码算法、常用的密钥...

    linux-用于快速为本地开发环境生成HTTPS证书的一组脚本

    1. `generate_cert.sh`: 这个脚本可能会使用OpenSSL库来生成私钥和证书请求。 2. `sign_cert.sh`: 可能用于使用自签发CA(如`openssl x509 -req -days <valid_days> -in cert.csr -signkey privkey.key -out cert....

    nginx实现ssl之https改造(包含单机版以及负载均衡配置)

    二、制作与申请SSL证书1. 使用openssl生成私钥文件openssl genrsa -out server.key 20482. 生成CSR文件openssl req -new -key server.key -out server.csr3. 提交CSR给CA机构,购买SSL证书(如:Let's Encrypt、...

    签名制作工具(CertMaker)

    【标题】"签名制作工具(CertMaker)"是一个专为简化软件签名过程而设计的应用程序,旨在帮助用户快速创建数字签名,无需深入理解复杂的代码或使用付费服务。这个工具的出现,使得开发者能够更加便捷地对他们的软件...

    利用HTTPS协议加密web传输

    ... 一、搭建 apache2 服务 在 Ubuntu 系统中,可以使用以下命令搭建 apache2 服务: `sudo apt-get install apache2` ...4. 如何使用 SSL 证书来保护 API 传输? 5. 如何使用 SSL 证书来保护数据库连接?

    TASSL-win64.rar

    同时,TASSL的使用可能涉及到与OpenSSL的互操作性问题,因为很多现有的SSL/TLS库是基于OpenSSL的。在这种情况下,开发者需要理解两者之间的差异,适当地进行代码调整。 在实际应用中,TASSL-win64广泛应用于金融、...

    基于Qt的密钥生成工具、密钥使用示例

    Qt提供了一些文件操作类(如`QFile`和`QTextStream`)来读写文件,我们可以将密钥以加密格式存储在本地文件系统中,或者使用系统的密钥存储服务,如Windows的证书存储或Linux的keyring服务。 3. **密钥使用**:在...

    kafka linux C++ 动态库

    在C++中与Kafka交互时,通常会依赖于Kafka提供的SDK或者API,这些接口封装了与Kafka服务器通信的细节。 描述中提到,这些文件是编译后的动态库文件,包含`.h`头文件和`.so`(Shared Object)文件。`.h`文件包含了...

    cyrclebot:咕umble的机器人,可根据要求播放音频

    "mumble.cert", "serverAddress": "mumble://example.com:64738", "youtubeKey": "SERVER_API_KEY_GOES_HERE", "channelName": "Root", "redisOpts": { "host": "localhost" }, "debug": false}按键Mumble使用证书对...

    电子工具电子工具电子工具

    11. **安全与加密工具**:例如BitLocker、TrueCrypt提供磁盘加密,而OpenSSL则用于网络安全和证书管理。 12. **文件共享与存储工具**:Google Drive、Dropbox、OneDrive等,方便用户在不同设备间同步和共享文件。 ...

Global site tag (gtag.js) - Google Analytics