openssl证书制作及编程

来源:互联网 发布:淘宝产品排名规则 编辑:程序博客网 时间:2024/04/30 16:51

一、openssl证书制作:

1、创建目录./demoCA/ ./demoCA/newcerts/,创建文件 ./demoCA/index.txt ./demoCA/serial。

2、执行echo 01 > ./demoCA/serial

3、制作自己的CA证书

$openssl req -new -x509 -keyout ca.key -out ca.crt

4、生成服务端的私钥(key文件)及csr文件

$openssl genrsa -des3 -out server.key 1024

$openssl req -new -key server.key -out server.csr

5、生成客户端的私钥(key文件)及csr文件

$openssl genrsa -des3 -out client.key 1024

$openssl req -new -key client.key -out client.csr

6、用生成的CA的证书为刚才生成的server.csr,client.csr文件签名

$openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

$openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

7、生成pem格式证书

有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成

$cat client.crt client.key> client.pem

$cat server.crt server.key > server.pem

二、openssl编程

      openssl的编程有两种风格:原生态的和层层封装的。

2.1原生态openssl编程

      需要使用BSD socket和openssl中的较底层的API。原生态openssl有两个比较重要的结构SSL和SSL_CTX。

      SSL_CTX数据结构是用与建立SSL/TSL连接的结构,可用于指定通讯协议(SSLv23/TSLv1)、证书、密钥等相关信息。

      SSL数据结构是和具体会话相关联的结构。

常用函数:

      SSL_library_init():初始化一个openssl库。

   SSL_CTX_new(const SSL_METHOD *method):创建一个CTX结构。
   SSL_new(SSL_CTX *ctx):创建一个SSL结构。
   SSL_set_fd(SSL *ssl, int fd):把ssl结构和具体会话相关联。
   SSL_accept(SSL *ssl)、SSL_connect(SSL *ssl):用于SSL会话握手。
   SSL_read(SSL *ssl, void *buf, int num)和SSL_write(SSL *ssl, void *buf, int num)用于SSL读写。
   SSL_shutdown(SSL *ssl)用于关闭一个SSL/TSL会话。
   使用这些函数就可以进行最基本的openssl编程了。Openssl编程框架如下。
1 
   代码示例:HTTPS服务器和客户端
   服务器端:
 
   客户端:
 
2.2层层封装的openssl编程。

     这里BSD socket的基本操作,对上层是不可见的。而且openssl自己有对自己的底层操作进行了封装。

     除此之外还需要了解BIO的概念。

     BIO是openssl 对于io 类型的抽象封装,包括:内存、文件、日志、标准输入输出、socket、加/解密、摘要和ssl 通道等。

     BIO分为两种:source/sink类型的BIO是数据源或输入数据源(我不知道sink该怎么翻译),例如,sokect BIO和文件BIO。而filter BIO就是把数据从一个BIO转换到另外一个BIO或应用接口,在转换过程中,这些数据可以不修改(如信息摘要BIO),也可以进行转换。

     BIO链,可以预先设定好多个BIO之间的链接关系,当数据从source类型的BIO进来之后,数据自动再BIO链之间传递。这应该是BIO有吸引力的地方。比如三个BIO,mbio(内存类型),sbio(ssl类型),abio(accept类型),连成BIO链:mbio->sbio->abio。

     那么对mbio的读操作实际上就包含了从accept接收数据、对加密数据ssl解密,最终把数据读到内存中的操作;对mbio的写操作实际上包含了对数据进行ssl加密,并把加密数据从socket发出去的操作。

BIO常用函数:

     BIO * BIO_new(BIO_METHOD *type):生成BIO

     BIO_set(BIO *a,BIO_METHOD *type):设置BIO

     BIO_free(BIO *a):删除BIO

     BIO_free_all(BIO *a):删除BIO链

     BIO_read(BIO *b, void *buf, int len)

     BIO_gets(BIO *b,char *buf, int size)

     BIO_write(BIO *b, const void *buf, int len)

     BIO_puts(BIO *b,const char *buf)

     BIO * BIO_push(BIO *b,BIO *append):该函数把参数中名为append的BIO附加到名为b的BIO上,并返回b。

     BIO * BIO_pop(BIO *b):为b的BIO从一个BIO链中移除并返回下一个BIO。

     代码示例(echo):
     服务器端:
 
    客户端:
  
原创粉丝点击