openssl之BIO系列(01-25)(带目录)
OpenSSL命令行常用功能(1)-中国信息安全组织

OpenSSL命令行常用功能(1)-中国信息安全组织OpenSSL命令行常用功能(1)作者:rainbow 文章出处:中国信息安全组织发布时间:2005-11-04 点击: 2793 字体:【小中大】1、为CA创建一个RSA私钥D:\openssl\bin>openssl genrsa -des3 -out -ca.key 1024Loading ‘screen‘ into random state - doneGenerating RSA private key, 1024 bit long modulus............................................................................++++++........++++++e is 65537 (0x10001)Enter pass phrase for -ca.key:123456Verifying - Enter pass phrase for -ca.key:1234562、利用CA的RSA私钥创建一个自签名的CA证书D:\openssl\bin>openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -config fEnter pass phrase for ca.key:You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter ‘.‘, the field will be left blank.-----Country Name (2 letter code) [AU]:cnState or Province Name (full name) [Some-State]:shLocality Name (eg, city) []:shOrganization Name (eg, company) [Internet Widgits Pty Ltd]:cisoOrganizational Unit Name (eg, section) []:cisoCommon Name (eg, YOUR name) []:EmailAddress[]:**************************.cn3、生成证书请求D:\openssl\bin>openssl req -config f -new -keyout webmaster.key -out wm_req.pem -days 365Loading ‘screen‘ into random state - doneGenerating a 1024 bit RSA private key.....++++++......................++++++writing new private key to ‘newreq.pem‘Enter PEM pass phrase:123456(自己输)Verifying - Enter PEM pass phrase:123456(自己输)-----You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter ‘.‘, the field will be left blank.-----Country Name (2 letter code) [AU]:cnState or Province Name (full name) [Some-State]:shLocality Name (eg, city) []:shOrganization Name (eg, company) [Internet Widgits Pty Ltd]:cisoOrganizational Unit Name (eg, section) []:cisoCommon Name (eg, YOUR name) []:webmasterEmailAddress[]:**************************.cnPlease enter the following ‘extra‘ attributesto be sent with your certificate requestA challenge password []:(不输)An optional company name []:(不输)4、签发证书D:\openssl\bin>openssl ca -config f -out webmaster.pem -infiles wm_req.pemUsing configuration from fLoading ‘screen‘ into random state - done1896:error:0E06D06C:configuration file routines:NCONF_get_string:novalue:.\crypto\conf\conf_lib.c:329:group=CA_default name=unique_subjectEnter pass phrase for ./ca.key:Check that the request matches the signatureSignature okThe Subject‘s Distinguished Name is as followscountryName :PRINTABLE:‘cn‘stateOrProvinceName :PRINTABLE:‘sh‘localityName :PRINTABLE:‘sh‘organizationName :PRINTABLE:‘ciso‘organizationalUnitName:PRINTABLE:‘ciso‘commonName :PRINTABLE:‘webmaster‘emailAddress:IA5STRING:****************************. cn‘Certificate is to be certified until Aug 23 10:01:35 2005 GMT (365 days)Sign the certificate? [y/n]:y1 out of 1 certificate requests certified, commit? [y/n]yWrite out database with 1 new entriesData Base Updated5、重复步骤3与4可以创建个人证书。
openssl代码结构

OpenSSL的源代码目录结构通常是一个典型的C/C++项目结构,包含了各种源文件、头文件、构建脚本和文档等。
其中,`crypto/`目录是OpenSSL的核心加密库代码所在的位置,包含了各种对称加密、非对称加密、哈希算法、消息认证码等的实现。
在`crypto/`目录下,有很多子目录,每个子目录都包含了特定类型或家族的加密算法的实现。
例如:* `asn1/`目录包含了Abstract Syntax Notation One (ASN.1)编码和解码的相关实现,用于处理X.509证书和其他结构化数据的序列化和反序列化。
* `evp/`目录包含了OpenSSL中的高级加密接口(EVP)的实现。
EVP接口提供了一种通用的方式来使用对称加密、非对称加密、哈希等功能,而不需要直接调用底层的具体算法函数。
* `cipher/`目录包含了对称加密算法的实现,如AES(Advanced Encryption Standard)、DES(Data Encryption Standard)、RC4(Rivest Cipher 4)等。
* `rsa/`目录包含了RSA非对称加密算法的实现。
* `dsa/`目录包含了DSA(Digital Signature Algorithm)非对称加密算法的实现。
* `dh/`目录包含了Diffie-Hellman密钥交换算法的实现。
* `digest/`目录包含了哈希函数的实现,如SHA-1(Secure Hash Algorithm 1)、SHA-256(Secure Hash Algorithm 256-bit)、MD5(Message Digest Algorithm 5)等。
* `modes/`目录包含了各种块密码操作模式(如CBC、ECB、GCM等)的实现,用于对大数据块进行加密。
此外,OpenSSL还包含了一些其他的目录,如`apps/`目录包含了OpenSSL的应用程序代码,`include/openssl/`目录包含了OpenSSL的头文件等。
openssl 操作手册

OpenSSL 是一个强大的安全套接字层密码库,包含了各种加密算法的实现,提供了通用的密码安全服务。
下面是一个简要的OpenSSL 操作手册,包括一些常用的命令和选项:1. 生成密钥对:```openssl genpkey -algorithm RSA -out private_key.pemopenssl rsa -pubout -in private_key.pem -out public_key.pem```2. 生成自签名证书:```cssopenssl req -new -x509 -key private_key.pem -out cert.pem -days 365```3. 生成证书签名请求(CSR):```openssl req -new -key private_key.pem -out request.csr```4. 验证证书签名:```bashopenssl x509 -in cert.pem -text -noout```5. 导出证书为PEM 格式:```bashopenssl x509 -in cert.der -inform DER -outform PEM -out cert.pem```6. 加密数据:```cssopenssl enc -aes-256-cbc -salt -in plaintext.txt -out ciphertext.enc```7. 解密数据:```cssopenssl enc -aes-256-cbc -d -in ciphertext.enc -out plaintext.txt```8. 生成随机数:```openssl rand -out random.bin 1024```9. 验证数字签名:```cssopenssl dgst -sha256 -sign private_key.pem -in file.txt -out signature.bin openssl dgst -sha256 -verify public_key.pem -signature signature.bin file.txt```10. 生成Diffie-Hellman 密钥交换参数:```openssl dhparam -out dhparam.pem 2048```11. 生成CA 证书:```cssopenssl req -new -x509 -days 365 -extensions v3_ca -key private_ca_key.pem -out ca.pem```12. 生成服务器证书:```cssopenssl req -new -key private_server_key.pem -out server.reqopenssl x509 -req -days 365 -in server.req -CA ca.pem -CAkey private_ca_key.pem -CAcreateserial -out server.pem```13. 生成客户端证书:```cssopenssl req -new -key private_client_key.pem -out client.reqopenssl x509 -req -days 365 -in client.req -CA ca.pem -CAkey private_ca_key.pem -CAcreateserial -out client.pem```这只是一些常见的OpenSSL 命令示例,OpenSSL 还提供了许多其他功能和选项,具体可以参考官方文档或使用`man openssl` 命令来获取完整的操作手册。
openssl基础知识以及部分命令详解

openssl基础知识以及部分命令详解⼀、基础知识 Openssl是⼀个开源的⽤以实现SSL协议的产品,它主要包括了三个部分:密码算法库、应⽤程序、SSL协议库。
Openssl实现了SSL协议所需要的⼤多数算法。
OpenSSL⼀共提供了8种对称加密算法,其中7种是分组加密算法,仅有的⼀种流加密算法是RC4。
这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都⽀持电⼦密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常⽤的分组密码加密模式。
其中,AES使⽤的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使⽤的则是64位。
事实上,DES算法⾥⾯不仅仅是常⽤的DES算法,还⽀持三个密钥和两个密钥3DES算法。
下⾯是使⽤Openssl进⾏⽂件的对称加密操作。
(⼀)Openssl⽀持的加密算法有:-aes-128-cbc -aes-128-cfb -aes-128-cfb1-aes-128-cfb8 -aes-128-ecb -aes-128-ofb-aes-192-cbc -aes-192-cfb -aes-192-cfb1-aes-192-cfb8 -aes-192-ecb -aes-192-ofb-aes-256-cbc -aes-256-cfb -aes-256-cfb1-aes-256-cfb8 -aes-256-ecb -aes-256-ofb-aes128 -aes192 -aes256-bf -bf-cbc -bf-cfb-bf-ecb -bf-ofb -blowfish-cast -cast-cbc -cast5-cbc-cast5-cfb -cast5-ecb -cast5-ofb-des -des-cbc -des-cfb-des-cfb1 -des-cfb8 -des-ecb-des-ede -des-ede-cbc -des-ede-cfb-des-ede-ofb -des-ede3 -des-ede3-cbc-des-ede3-cfb -des-ede3-ofb -des-ofb-des3 -desx -desx-cbc-rc2 -rc2-40-cbc -rc2-64-cbc-rc2-cbc -rc2-cfb -rc2-ecb-rc2-ofb -rc4 -rc4-40(⼆)Openssl加密指令语法openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e][-d] [-a] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-p][-P] [-bufsize number] [-nopad] [-debug]说明: -chipername选项:加密算法,Openssl⽀持的算法在上⾯已经列出了,你只需选择其中⼀种算法即可实现⽂件加密功能。
openssl之PEM系列

openssl之BIO系列之1---抽象的IO接口---根据openssl源代码、SSLeay Documents以及其它相关材料写成(作者:DragonKing, Mail: wzhah@ ,发布于:之openssl专业论坛,版本:openssl-0.9.7)PEM全称是Privacy Enhanced Mail,该标准定义了加密一个准备要发送邮件的标准。
它的基本流程是这样的:1.信息转换为ASCII码或其它编码方式;2.使用对称算法加密转换了的邮件信息;3.使用BASE64对加密后的邮件信息进行编码;4.使用一些头定义对信息进行封装,这些头信息格式如下(不一定都需要,可选的):Proc-Type,4:ENCRYPTEDDEK-Info: cipher-name, ivec其中,第一个头信息标注了该文件是否进行了加密,该头信息可能的值包括ENCRY PTED(信息已经加密和签名)、MIC-ONL Y(信息经过数字签名但没有加密)、MIC-CLEAR(信息经过数字签名但是没有加密、也没有进行编码,可使用非PEM格式阅读)以及CLEAR(信息没有签名和加密并且没有进行编码,该项好象是openssl自身的扩展,但是并没有真正实现);;第二个头信息标注了加密的算法以及使用的ivec参量,ivec其实在这儿提供的应该是一个随机产生的数据序列,与块加密算法中要使用到的初始化变量(IV)不一样。
5.在这些信息的前面加上如下形式头标注信息:-----BEGIN PRIV ACY-ENHANCED MESSAGE-----在这些信息的后面加上如下形式尾标注信息:-----END PRIV ACY-ENHANCED MESSAGE-----上面是openssl的PEM文件的基本结构,需要注意的是,Openssl并没有实现PEM的全部标准,它只是对openssl中需要使用的一些选项做了实现,详细的PEM格式,请参考RF C1421-1424。
openssl简介

opensslopensslSSL,Security Socket Layer,是一个安全传输协议,在Internet网上进行数据保护和身份确认。
OpenSSL是一个开放源代码的实现了SSL及相关加密技术的软件包,由加拿大的Eric Yang等发起编写的。
OpenSSL的官方网站为/,源代码可以从ftp:///source/opensslSSL是Secure Socket Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。
Netscape 公司在推出第一个Web浏览器的同时,提出了SSL协议标准,目前已有3.0版本。
SSL采用公开密钥技术。
其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。
openssl利用公开密钥技术的SSL协议已成为Internet上保密通讯的工业标准。
安全套接层协议能使C/S应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。
SSL协议要求建立在可靠的传输层协议(TCP)之上。
SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。
opensslSSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。
在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
通过以上叙述,SSL协议提供的安全信道有以下三个特性:1.数据的保密性信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。
加密的过程需要用到密匙来加密数据然后再解密。
没有了密钥,就无法解开加密的数据。
数据加密之后,只有密匙要用一个安全的方法传送。
加密过的数据可以公开地传送。
2.数据的一致性加密也能保证数据的一致性。
例如:消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。
OpenSSL中的dgst、dh、dhparam、enc命令使用说明
OpenSSL中的dgst、dh、dhparam、enc命令使⽤说明OpenSSL中的dgst、dh、dhparam、enc命令使⽤说明dgst主要⽤于数据摘要、数据签名以及验证签名。
概要openssl dgst [-digest] [-help] [-c] [-d] [-list] [-hex] [-binary] [-r] [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify filename] [-signature filename] [-sigopt nm:v] [-hmac key] [-fips-fingerprint] [-rand file...] [-engine i dgst函数输出⼗六进制的摘要⽂件,默认的摘要算法是sha256,输⼊如下命令查看可选摘要算法openssl dgst -list选项说明-digest ——摘要算法名称Supported digests:-blake2b512 -blake2s256 -md4-md5 -md5-sha1 -ripemd-ripemd160 -rmd160 -sha1-sha224 -sha256 -sha3-224-sha3-256 -sha3-384 -sha3-512-sha384 -sha512 -sha512-224-sha512-256 -shake128 -shake256-sm3 -ssl3-md5 -ssl3-sha1-whirlpool-help ——查找帮助-c ——当设置了-hex,输出结果每两个字符中加⼀个冒号-d ——打印出BIO调试信息值。
-hex ——以⼗六进输出结果,⼆选⼀-binary ——以⼆进制输出结果,⼆选⼀-r —— 以sha1sum的“coreutils”格式输出摘要-non-fips-allow —— 允许在FIPS模式使⽤⾮FIPS算法-out filename —— 输出⽂件,默认标准输出-sign filename —— 使⽤⽂件中的私钥签名-keyform arg —— 私钥格式,PEM | DER-passin arg —— 私钥密码-verify filename ——公钥验签-prverify filename ——私钥验签-signature filename ——签名⽂件-hmac key ——hmac 秘钥-non-fips-allow ——允许在FIPS模式使⽤⾮FIPS算法-fips-fingerprint ——在某些openssl-FIPS中使⽤特殊密钥计算HMAC-engine id ——指定硬件引擎file ——输⼊⽂件,不指定则为标准输⼊注意事项所有新应⽤程序的选择的摘要算法是SHA1。
openssl 编程入门(含完整示例)
openssl编程入门(含完整示例)易剑1.编写目的第一次跑起openssl示例并不太简单,本文的目的是为了让这个过程变得非常简单。
在开始之前,要非常感谢周立发同学,正是通过他共享的示例,较轻松的入了门。
本文档对他共享的示例中的一个小错误进行了修正,并提供了傻瓜式的“编译-生成-KEY运行”一条龙脚本(方法请参见压缩包中的readme文件),让跑第一个openssl程序变得轻轻松松。
2.示例包ssl_test.tar.gz openssl-0.9.8h-SuSE10.tar.gzssl_test.tar.gz为示例源代码包,openssl-0.9.8h-SuSE10.tar.gz为openssl二进制包,测试时是安装在/usr/local/ssl。
ssl_test.tar.gz中的示例在SuSE10中测试通过,使用的是openssl-0.9.8h,它包括如下文件:-rw-r--r--1root root1346Dec518:11cacert.pem-rwxr-xr-x1root root114Dec518:11make_key.sh-rwxr-xr-x1root root172Dec518:37mk_client.sh-rwxr-xr-x1root root172Dec518:37mk_server.sh-rw-r--r--1root root1679Dec518:11privkey.pem-rw-r--r--1root root167Dec518:39readme-rwxr-xr-x1root root38Dec518:38run_client.sh-rwxr-xr-x1root root64Dec518:38run_server.sh-rwxr-xr-x1root root1140142Dec518:38ssl_client-rw-r--r--1root root3928Dec517:31ssl_client.cpp-rwxr-xr-x1root root1139667Dec518:38ssl_server-rw-r--r--1root root4882Dec517:31ssl_server.cppreadme为包内容说明,run_server.sh用来运行服务端,run_client.sh用来运行客户端,mk_server.sh用来编译服务端,mk_client.sh用来编译客户端,make_key.sh用来生成钥匙KEY。
OpenSSL 中文手册
OpenSSL 中文手册之一OpenSSL 简介-证书2011-05-13 11:52 44人阅读评论(0) 收藏举报证书就是数字化的文件,里面有一个实体(网站,个人等)的公共密钥和其他的属性,如名称等。
该公共密钥只属于某一个特定的实体,它的作用是防止一个实体假装成另外一个实体。
证书用来保证不对称加密算法的合理性。
想想吧,如果没有证书记录,那么假设某俩人A 与B的通话过程如下:这里假设A的publickey是K1,privatekey是K2,B的publickey是K3,privatekey是K4 xxxxxx(kn)表示用kn加密过的一段文字xxxxxxA-----〉hello(plaintext)-------------〉BA〈---------hello(plaintext)〈---------BA〈---------Bspublickey〈------------BA---------〉spublickey(K1)--------〉B......如果C想假装成B,那么步骤就和上面一样。
A-----〉hello(plaintext)-------------〉CA〈---------hello(plaintext)〈---------C注意下一步,因为A没有怀疑C的身份,所以他理所当然的接受了C的publickey,并且使用这个key来继续下面的通信。
A〈---------Cspublickey〈------------CA---------〉Aspublickey(K1)--------〉C......这样的情况下A是没有办法发觉C是假的。
如果A在通话过程中要求取得B的证书,并且验证证书里面记录的名字,如果名字和B的名字不符合,就可以发现对方不是B.验证B的名字通过再从证书里面提取B的公用密钥,继续通信过程。
那么,如果证书是假的怎么办?或者证书被修改过了怎么办?慢慢看下来吧。
证书最简单的形式就是只包含有证书拥有者的名字和公用密钥。
解析OpenSSL程序概念及震惊业界的“心脏出血”漏洞
解析OpenSSL程序概念及震惊业界的“⼼脏出⾎”漏洞OpenSSL的各种概念解析: 公钥/私钥/签名/验证签名/加密/解密/⾮对称加密 我们⼀般的加密是⽤⼀个密码加密⽂件,然后解密也⽤同样的密码.这很好理解,这个是对称加密.⽽有些加密时,加密⽤的⼀个密码,⽽解密⽤另外⼀组密码,这个叫⾮对称加密,意思就是加密解密的密码不⼀样.初次接触的⼈恐怕⽆论如何都理解不了.其实这是数学上的⼀个素数积求因⼦的原理的应⽤,如果你⼀定要搞懂,百度有⼤把⼤把的资料可以看,其结果就是⽤这⼀组密钥中的⼀个来加密数据,可以⽤另⼀个解开.是的没错,公钥和私钥都可以⽤来加密数据,相反⽤另⼀个解开,公钥加密数据,然后私钥解密的情况被称为加密解密,私钥加密数据,公钥解密⼀般被称为签名和验证签名. 因为公钥加密的数据只有它相对应的私钥可以解开,所以你可以把公钥给⼈和⼈,让他加密他想要传送给你的数据,这个数据只有到了有私钥的你这⾥,才可以解开成有⽤的数据,其他⼈就是得到了,也看懂内容.同理,如果你⽤你的私钥对数据进⾏签名,那这个数据就只有配对的公钥可以解开,有这个私钥的只有你,所以如果配对的公钥解开了数据,就说明这数据是你发的,相反,则不是.这个被称为签名. 实际应⽤中,⼀般都是和对⽅交换公钥,然后你要发给对⽅的数据,⽤他的公钥加密,他得到后⽤他的私钥解密,他要发给你的数据,⽤你的公钥加密,你得到后⽤你的私钥解密,这样最⼤程度保证了安全性. RSA/DSA/SHA/MD5 ⾮对称加密的算法有很多,⽐较著名的有RSA/DSA ,不同的是RSA可以⽤于加/解密,也可以⽤于签名验签,DSA则只能⽤于签名.⾄于SHA则是⼀种和md5相同的算法,它不是⽤于加密解密或者签名的,它被称为摘要算法.就是通过⼀种算法,依据数据内容⽣成⼀种固定长度的摘要,这串摘要值与原数据存在对应关系,就是原数据会⽣成这个摘要,但是,这个摘要是不能还原成原数据的,嗯....,正常情况下是这样的,这个算法起的作⽤就是,如果你把原数据修改⼀点点,那么⽣成的摘要都会不同,传输过程中把原数据给你再给你⼀个摘要,你把得到的原数据同样做⼀次摘要算法,与给你的摘要相⽐较就可以知道这个数据有没有在传输过程中被修改了. 实际应⽤过程中,因为需要加密的数据可能会很⼤,进⾏加密费时费⼒,所以⼀般都会把原数据先进⾏摘要,然后对这个摘要值进⾏加密,将原数据的明⽂和加密后的摘要值⼀起传给你.这样你解开加密后的摘要值,再和你得到的数据进⾏的摘要值对应⼀下就可以知道数据有没有被修改了,⽽且,因为私钥只有你有,只有你能解密摘要值,所以别⼈就算把原数据做了修改,然后⽣成⼀个假的摘要给你也是不⾏的,你这边⽤密钥也根本解不开. CA/PEM/DER/X509/PKCS ⼀般的公钥不会⽤明⽂传输给别⼈的,正常情况下都会⽣成⼀个⽂件,这个⽂件就是公钥⽂件,然后这个⽂件可以交给其他⼈⽤于加密,但是传输过程中如果有⼈恶意破坏,将你的公钥换成了他的公钥,然后得到公钥的⼀⽅加密数据,不是他就可以⽤他⾃⼰的密钥解密看到数据了吗,为了解决这个问题,需要⼀个公证⽅来做这个事,任何⼈都可以找它来确认公钥是谁发的.这就是CA,CA确认公钥的原理也很简单,它将它⾃⼰的公钥发布给所有⼈,然后⼀个想要发布⾃⼰公钥的⼈可以将⾃⼰的公钥和⼀些⾝份信息发给CA,CA⽤⾃⼰的密钥进⾏加密,这⾥也可以称为签名.然后这个包含了你的公钥和你的信息的⽂件就可以称为证书⽂件了.这样⼀来所有得到⼀些公钥⽂件的⼈,通过CA的公钥解密了⽂件,如果正常解密那么机密后⾥⾯的信息⼀定是真的,因为加密⽅只可能是CA,其他⼈没它的密钥啊.这样你解开公钥⽂件,看看⾥⾯的信息就知道这个是不是那个你需要⽤来加密的公钥了. 实际应⽤中,⼀般⼈都不会找CA去签名,因为那是收钱的,所以可以⾃⼰做⼀个⾃签名的证书⽂件,就是⾃⼰⽣成⼀对密钥,然后再⽤⾃⼰⽣成的另外⼀对密钥对这对密钥进⾏签名,这个只⽤于真正需要签名证书的⼈,普通的加密解密数据,直接⽤公钥和私钥来做就可以了. 密钥⽂件的格式⽤OpenSSL⽣成的就只有PEM和DER两种格式,PEM的是将密钥⽤base64编码表⽰出来的,直接打开你能看到⼀串的英⽂字母,DER格式是⼆进制的密钥⽂件,直接打开,你可以看到........你什么也看不懂!.X509是通⽤的证书⽂件格式定义.pkcs的⼀系列标准是指定的存放密钥的⽂件标准,你只要知道PEM DER X509 PKCS这⼏种格式是可以互相转化的.⼼脏出⾎的OpenSSL去年,OpenSSL爆出史上最严重的安全漏洞,此漏洞在⿊客社区中被命名为“⼼脏出⾎”漏洞。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录openssl之BIO系列之1---抽象的IO接口 (1)openssl之BIO系列之2---BIO结构和BIO相关文件介绍 (2)openssl之BIO系列之3---BIO的声明和释放等基本操作 (5)openssl之BIO系列之4---BIO控制函数介绍 (6)openssl之BIO系列之5---CallBack函数及其控制 (9)openssl之BIO系列之6---BIO的IO操作函数 (11)openssl之BIO系列之7---BIO链的操作 (12)openssl之BIO系列之8---读写出错控制 (13)openssl之BIO系列之9---BIO对的创建和应用 (14)openssl之BIO系列之10---BIO链的定位操作 (16)openssl之BIO系列之11---文件(file)类型BIO (18)openssl之BIO系列之12---文件描述符(fd)类型BIO (21)openssl之BIO系列之13---Socket类型BIO (22)openssl之BIO系列之14---源类型的NULL型BIO (23)openssl之BIO系列之15---内存(mem)类型BIO (24)openssl之BIO系列之16---BIO对(pair)类型BIO (26)openssl之BIO系列之17---连接(connect)类型BIO (29)openssl之BIO系列之18---接受(accept)类型BIO (32)openssl之BIO系列之19---Filter类型的NULL型BIO (36)openssl之BIO系列之20---缓冲(buffer)类型BIO (36)openssl之BIO系列之21---Base64类型的BIO (38)openssl之BIO系列之22---Cipher类型的BIO (39)openssl之BIO系列之23---MD类型的BIO (40)openssl之BIO系列之24---SSL类型的BIO (43)openssl之BIO系列之25---结束语 (48)openssl之BIO系列之1---抽象的IO接口(作者:DragonKingMail:*************发布于: openssl专业论坛)其实包含了很多种接口,用通用的函数接口,主要控制在BIO_METHOD中的不通实现函数控制,我初步估计了一下,大概有14种,包括6种filter型和8种source/sink型。
BIO是在底层覆盖了许多类型I/O接口细节的一种应用接口,如果你在程序中使用BIO,那么就可以和SSL连接、非加密的网络连接以及文件IO进行透明的连接。
有两种不通的BIO接口,一种是source/sink型,一种是fileter型的。
顾名思义,source/sink类型的BIO是数据源或数据目标(我不知道sink该怎么翻译,据水木liaojzh说,一般是destination(目标、宿)的同义词,大家自己理解吧,呵呵),例如,sokect BIO和文件BIO。
而filter BIO就是把数据从一个BIO转换到另外一个BIO或应用接口,在转换过程中,这些数据可以不修改(如信息摘要BIO),也可以进行转换。
例如在加密BIO中,如果写操作,数据就会被加密,如果是读操作,数据就会被解密。
BIO可以连接在一起成为一个BIO链(单个的BIO就是一个环节的BIO链的特例),如下是BIO的结构定义,可以看到它有上下环节的:struct bio_st{BIO_METHOD *method;/* bio, mode, argp, argi, argl, ret */long (*callback)(struct bio_st *,int,const char *,int, long,long);char *cb_arg; /* first argument for the callback */int init;int shutdown;int flags; /* extra storage */int retry_reason;int num;void *ptr;struct bio_st *next_bio; /* used by filter BIOs */BIO下联struct bio_st *prev_bio; /* used by filter BIOs */BIO上联int references;unsigned long num_read;unsigned long num_write;CRYPTO_EX_DATA ex_data;};一个BIO链通常包括一个source BIO和一个或多个filter BIO,数据从第一个BIO读出或写入,然后经过一系列BIO变化到输出(通常是一个source/sink BIO)。
注:这是根据openssl的BIO.pod翻译和根据我自己的理解添加的,以后我会慢慢将BIO的细节说出来,希望大家一起努力。
openssl之BIO系列之2---BIO结构和BIO相关文件介绍BIO的结构定义和相关项解析如下:(包含在bio.h文件中,其主文件为bio_lib.c)typedef struct bio_st BIO;struct bio_st{BIO_METHOD *method;//BIO方法结构,是决定BIO类型和行为的重要参数,各种BIO 的不同之处主要也正在于此项。
/* bio, mode, argp, argi, argl, ret */long (*callback)(struct bio_st *,int,const char *,int, long,long);//BIO回调函数char *cb_arg; /* first argument for the callback *//回调函数的第一个参量int init;//初始化标志,初始化了为1,否则为0int shutdown;//BIO开关标志,如果为1,则处于关闭状态,如果为0,则处于打开的状态。
int flags; /* extra storage */int retry_reason;int num;void *ptr;struct bio_st *next_bio; /* used by filter BIOs */BIO下联struct bio_st *prev_bio; /* used by filter BIOs */BIO上联int references;unsigned long num_read;//读出的数据长度unsigned long num_write;//写入的数据长度CRYPTO_EX_DATA ex_data;};在BIO的所用成员中,method可以说是最关键的一个成员,它决定了BIO的类型,可以看到,在声明一个新的BIO结构时,总是使用下面的声明:BIO* BIO_new(BIO_METHOD *type);在源代码可以看出,BIO_new函数除了给一些初始变量赋值外,主要就是把type中的各个变量赋值给BIO结构中的method成员。
一般来说,上述type参数是以一个类型生成函数的形式提供的,如生成一个mem型的BIO结构,就使用下面的语句:BIO *mem = BIO_new(BIO_s_mem());这样的函数有以下一些:【source/sink型】BIO_s_accept():是一个封装了类似TCP/IP socket Accept规则的接口,并且使TCP/IP操作对于BIO接口是透明的。
BIO_s_bio():封装了一个BIO对,数据从其中一个BIO写入,从另外一个BIO读出 BIO_s_connect():是一个封装了类似TCP/IP socket Connect规则的接口,并且使TCP/IP 操作对于BIO接口是透明的BIO_s_fd():是一个封装了文件描述符的BIO接口,提供类似文件读写操作的功能BIO_s_file():封装了标准的文件接口的BIO,包括标志的输入输出设备如stdin等BIO_s_mem():封装了内存操作的BIO接口,包括了对内存的读写操作BIO_s_null():返回空的sink型BIO接口,写入这种接口的所有数据读被丢弃,读的时候总是返回EOFBIO_s_socket():封装了socket接口的BIO类型【filter型】BIO_f_base64():封装了base64编码方法的BIO,写的时候进行编码,读的时候解码 BIO_f_buffer():封装了缓冲区操作的BIO,写入该接口的数据一般是准备传入下一个BIO接口的,从该接口读出的数据一般也是从另一个BIO传过来的。
BIO_f_cipher():封装了加解密方法的BIO,写的时候加密,读的时候解密BIO_f_md():封装了信息摘要方法的BIO,通过该接口读写的数据都是已经经过摘要的。
BIO_f_null():一个不作任何事情的BIO,对它的操作都简单传到下一个BIO去了,相当于不存在。
BIO_f_ssl():封装了openssl 的SSL协议的BIO类型,也就是为SSL协议增加了一些BIO操作方法。
上述各种类型的函数正是构成BIO强大功能的基本单元,所以,要了解BIO的各种结构和功能,也就应该了解这些函数类型相关的操作函数。
所有这些源文件,都基本上包含于/crypto/bio/目录下的同名.c文件(大部分是同名的)中。
在BIO_METHOD里面,定义了一组行为函数,上述不通类型的BIO_METHOD行为函数的定义是不同的,其结构如下(以非16位系统为例):typedef struct bio_method_st{int type;const char *name;int (*bwrite)(BIO *, const char *, int);int (*bread)(BIO *, char *, int);int (*bputs)(BIO *, const char *);int (*bgets)(BIO *, char *, int);long (*ctrl)(BIO *, int, long, void *);int (*create)(BIO *);int (*destroy)(BIO *);long (*callback_ctrl)(BIO *, int, bio_info_cb *);} BIO_METHOD;在BIO的成员中,callback也是比较重要的,它能够用于程序调试用或者自定义改变BIO的行为。
详细会在以后相关的部分介绍。
BIO的很多操作,都是BIO_ctrl系列函数根据不通参数组成的宏定义来完成的。