什么是OpenSSL
OpenSSL采用C语言作为开发语言,这使得OpenSSL具有优秀的跨平台性能,这对于广大技术人员来说是一件非常美妙的事情,可以在不同的平台使用同样熟悉的东西。OpenSSL支持Linux、Windows、BSD、Mac、VMS等平台,这使得OpenSSL具有广泛的适用性。不过,对于目前新成长起来的C++程序员,可能对于C语言的代码不是很习惯,但习惯C语言总比使用C++重新写一个跟OpenSSL相同功能的软件包轻松不少。
OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。
1.对称加密算法
OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、 Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。
2.非对称加密算法
OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。
3.信息摘要算法
OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。
4.密钥和证书管理
密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。
首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和 BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。
在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。
事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。
5.SSL和TLS协议
OpenSSL实现了SSL协议的SSLv2和SSLv3,支持了其中绝大部分算法协议。OpenSSL也实现了TLSv1.0,TLS是SSLv3的标准化版,虽然区别不大,但毕竟有很多细节不尽相同。
虽然已经有众多的软件实现了OpenSSL的功能,但是OpenSSL里面实现的SSL协议能够让我们对SSL协议有一个更加清楚的认识,因为至少存在两点:一是OpenSSL实现的SSL协议是开放源代码的,我们可以追究SSL协议实现的每一个细节;二是OpenSSL实现的SSL协议是纯粹的 SSL协议,没有跟其它协议(如HTTP)协议结合在一起,澄清了SSL协议的本来面目。
6.应用程序
OpenSSL的应用程序已经成为了OpenSSL重要的一个组成部分,其重要性恐怕是OpenSSL的开发者开始没有想到的。现在OpenSSL 的应用中,很多都是基于OpenSSL的应用程序而不是其API的,如OpenCA,就是完全使用OpenSSL的应用程序实现的。OpenSSL的应用程序是基于OpenSSL的密码算法库和SSL协议库写成的,所以也是一些非常好的OpenSSL的API使用范例,读懂所有这些范例,你对 OpenSSL的API使用了解就比较全面了,当然,这也是一项锻炼你的意志力的工作。
OpenSSL的应用程序提供了相对全面的功能,在相当多的人看来,OpenSSL已经为自己做好了一切,不需要再做更多的开发工作了,所以,他们也把这些应用程序成为OpenSSL的指令。OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。
7.Engine机制
Engine机制的出现是在OpenSSL的0.9.6版的事情,开始的时候是将普通版本跟支持Engine的版本分开的,到了OpenSSL的 0.9.7版,Engine机制集成到了OpenSSL的内核中,成为了OpenSSL不可缺少的一部分。 Engine机制目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。OpenSSL的Engine机制成功地达到了这个目的,这使得OpenSSL已经不仅仅使一个加密库,而是提供了一个通用地加密接口,能够与绝大部分加密库或者加密设备协调工作。当然,要使特定加密库或加密设备更OpenSSL协调工作,需要写少量的接口代码,但是这样的工作量并不大,虽然还是需要一点密码学的知识。Engine机制的功能跟 Windows提供的CSP功能目标是基本相同的。目前,OpenSSL的0.9.7版本支持的内嵌第三方加密设备有8种,包括: CryptoSwift、nCipher、Atalla、Nuron、UBSEC、Aep、SureWare以及IBM 4758 CCA的硬件加密设备。现在还出现了支持PKCS#11接口的Engine接口,支持微软CryptoAPI的接口也有人进行开发。当然,所有上述 Engine接口支持不一定很全面,比如,可能支持其中一两种公开密钥算法。
8.辅助功能
BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。
OpenSSL对于随机数的生成和管理也提供了一整套的解决方法和支持API函数。随机数的好坏是决定一个密钥是否安全的重要前提。
OpenSSL还提供了其它的一些辅助功能,如从口令生成密钥的API,证书签发和管理中的配置文件机制等等。如果你有足够的耐心,将会在深入使用OpenSSL的过程慢慢发现很多这样的小功能,让你不断有新的惊喜。
安装OpenSSL
$./config --prefix=/prog/openssl-0.9.8d
$ make
$ make test
$ make install
$ ln -s /prog/openssl-0.9.8d /usr/local/openssl
$ ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
$ ln -s /usr/local/openssl/include/openssl /usr/include/openssl
$ ln -s /usr/local/openssl/ssl/openssl.cnf /etc/openssl.cnf
$ cp /usr/local/openssl/lib/libssl.a /usr/lib
证书管理
建立根证书
(Root Certification Authority Certificate)根证书是一个为CA自己颁发的证书签名,这个证书可从其他CA获取,或者是自签名(selfsign)的根证书。
方案一:进入openssl安装目录,在ssl目录下的misc目录中有一个CA.sh和CA.pl的初始化安装文件。运行./CA.sh -newca可以建立一个根证书。
方案二:首先,需要准备一个目录放置CA文件,包括颁发的证书和CRL(Certificate Revoke List),例如,/home/certadm/demoCA。(注:certadm是Linux上的一个用户,是认证证书管理员)在 /home/certadm/demoCA下建立几个目录,certs用来保存我们的CA颁发的所有的证书的副本;private用来保存CA证书的私钥匙;crl用于保存回收证书列表信息。
运行openssl需要指定openssl.cnf配置文件的路径。我们可以在命令行中使用config命令选项指定配置文件的位置,或者通过环境变量OPENSSL_CONF来声明。
$ openssl req -nodes -new -keyout demo_key.pem -out demo_req.pem -day 3650 -config /etc/openssl.cnf
$ OPENSSL_CONF="/opt/myca/openssl.cnf"
$ export OPENSSL_CONF
openssl.cnf配置文件需要添加一些信息。
[ req ]
default_bits = 2048
default_keyfile = /opt/myca/private/cakey.pem
default_md = md5
prompt = no
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions
[ root_ca_distinguished_name ]
commonName = My Test
CA stateOrProvinceName = Beijing
countryName = CN
emailAddress = [email protected]
organizationName = Root Certification Authority
[ root_ca_extensions ]
basicConstraints = CA:true
创建根证书。
$ openssl req -x509 -newkey rsa -out cacert.pem -outform PEM
验证根证书文件。
$ openssl x509 -in cacert.pem -text -noout
CA的私钥匙很重要,至少需要2048位长度。建议保存在硬件里,或者至少不要放在网络中。除了生成钥匙,在CA体系中还需要创建三个文件。第一个文件用来跟踪最后一次颁发的证书的序列号,它命名为serial,初始化为01。第二个文件是一个排序数据库,用来跟踪已经颁发的证书,命名为 index.txt,文件内容为空。
$ chmod g-rwx,o-rwx private
$ echo "01" > serial
$ touch index.txt
颁发客户证书
在给客户颁发证书之前,需要客户提供证书的基本信息。创建证书时应使用默认的OpenSSL配置文件,不要使用创建根证书时所用的配置文件或环境变量。
$ openssl req -newkey rsa:1024 -keyout demo_key.pem -keyform PEM -out demo_req.pem -outform PEM
或
$ openssl req -nodes -new -keyout islab_key.pem -out demo_req.pem -days 3650 -config ~/openssl/ssl/openssl.cnf
生成用户CSR(Certificate Signing Request)文件
$ openssl ca -config ~/openssl/ssl/openssl.cnf -policy policy_anything -out demo_cert.pem -infiles islab_req.pem
生成用户证书文件
命令运行过程中有两次提示用户输入口令,第一次的口令用来加密私钥匙demo_key.pem,第二次口令一般被OpenSSL忽略。结果生成两个文件:私钥demo_key.pem;demo_req.pem,请求信息,其中包括公钥。
可以通过batch选项取消命令提示,可通过notext选项取消证书的输出显示。 此外,还可以一次给多个客户颁发证书,方法是用 infiles选项替换in选项,不过这个选项必须放在最后,因为此后的任何字符均被处理为文件名称列表。
吊销用户证书
将待吊销的证书从证书的保存位置拷贝到另外一个目录,然后运行ca命令就可以。关键操作是设置好OPENSSL_CONF环境变量。
$ cp certs/01.pem testcert.pem
$ openssl ca -revoke testcert.pem
命令行运行过程中需要输入CA私钥匙的密码。
为了使证书吊销操作让用户知道,可以生成CRL(Certificate Revoke List),然后公布到网上去。由于每个颁发的证书都有一个过期时间,一旦证书过期了,就可以把该证书从CRL中删除。
1.生成CRL列表
$ openssl ca -gencrl -out exampleca.crl
2.查看CRL列表信息
$ openssl crl -in exampleca.crl -text -noout
3.验证CRL列表签名信息
$ openssl crl -in exampleca.crl -noout -CAfile cacert.pem
可以看到CRL的版本号为1,这是OpenSSL默认的,除非crl_extensions被指定在配置文件ca一节中。
案例分析
因特网协议保护
[举例]大部分的Web服务器及浏览器都广泛支持SSL技术。当浏览器试图连接一个具有SSL认证加密的服务器时,就会唤醒一个SSL会话,浏览器检查认证,必须具备下面三个条件: 1)有一个权威机构发放证书,当然可以创建自我签订的证书(x509 结构)。 2)证书不能过期。 3)证书是属于它所连接的服务器的。 只有全部具备了这三个条件,浏览器才能成功完成认证。通过这三个条件,用户能确认其浏览器连接到正确的服务器,而不是连接到一些想盗取用户密码等重要信息的虚假的服务器上。
在当今的电子商务中还有一项被广泛使用的安全协议是SET协议。SET(Secure Electronic Transaction,安全电子交易)协议是由VISA和MasterCard两大信用卡公司于1997年5月联合推出的规范。SET能在电子交易环节上提供更大的信任度、更完整的交易信息、更高的安全性和更少受欺诈的可能性。SET交易分三个阶段进行:用户向商家购物并确定支付;商家与银行核实;银行向商家支付货款。每个阶段都涉及到RSA对数据加密,以及RSA数字签名。使用SET协议,在一次交易中,要完成多次加密与解密操作,故有很高的安全性,但SET协议比SSL协议复杂,商家和银行都需要改造系统以实现互操作。
Email保护
加密保护
(本文参考 O'Reilly - Network Security with OpenSSL)
1. 以cacert驗證產生出來的使用者cert ~/openssl/bin/openssl verify -CApath . \ -CAfile cacert.pem islab_cert.pem
2. 檢查產生的序號 ~/openssl/bin/openssl x509 -noout -serial -in islab_cert.pem serial=01
3. 檢查發行者資訊 ~/openssl/bin/openssl x509 -noout -issuer -in islab_cert.pem issuer= /C=TW/ST=TAIWAN/L=Taichung/O=THU/OU=ISLAB/CN=www.tekgate.idv.tw/[email protected]
4. 檢查憑證起始及終止日期時間 ~/openssl/bin/openssl x509 -noout -in islab_cert.pem -dates notBefore=Feb 24 07:54:16 2005 GMT notAfter=Feb 22 07:54:16 2015 GMT
5. 檢查個人憑證資訊subject ~/openssl/bin/openssl x509 -noout -in islab_cert.pem -subject subject= /C=TW/ST=TAIWAN/L=Taichung/O=THU/OU=CSIE/[email protected]/[email protected]
6. 檢查MD5 fingerprint ~/openssl/bin/openssl x509 -noout -in islab_cert.pem -fingerprint MD5 Fingerprint=A4:A1:95:41:CC:26:18:00:AA:16:07:25:A8:5F:65:6E
7. 檢查SHA-1 fingerprint ~/openssl/bin/openssl x509 -noout -in islab_cert.pem -fingerprint -sha1 SHA1 Fingerprint=B2:D7:CF:DF:DA:B7:A6:3B:4C:99:3A:94:52:64:B8:28:0B:3A:24:9D
8. 由PEM轉至PKCS12。Microsoft Outlook Express使用PKCS12格式,因此欲使用Microsoft Outlook Express寄出簽章信件,只要將產生出來的.p12檔安裝在Windows即可使用。 ~/openssl/bin/openssl pkcs12 -export -in islab_cert.pem -out islab_cert.p12 -name "Blave's Certificate" -inkey islab_key.pem Enter Export Password: Verifying - Enter Export Password:
9. 由PKCS12轉至PEM
(1) 由PKCS12產生Private Key ~/openssl/bin/openssl pkcs12 -in islab_cert.p12 -out islab_key2.pem Enter Import Password: MAC verified OK Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
(2) 再由Private Key產生憑證 ~/openssl/bin/openssl x509 -in islab_key2.pem -text \ -out islab_cert2.pem
10. 文件加密「islab_cert.pem」為個人憑證,可以公開給大家,因此某人欲加密傳送一文件給我,便可以依下列方式加密。編輯一純文字檔,在此我們預設檔名為「document.txt」,而經加密碼之檔名為「document.enc」。 echo "This is a text file." > document.txt cat document.txt This is a text file. ~/openssl/bin/openssl smime -encrypt -in document.txt \ -out document.enc islab_cert.pem cat document.enc MIME-Version: 1.0 Content-Disposition: attachment; filename="smime.p7m" Content-Type: application/x-pkcs7-mime; name="smime.p7m" Content-Transfer-Encoding: base64
MIICFgYJKoZIhvcNAQcDoIICBzCCAgMCAQAxggG5MIIBtQIBADCBnDCBljELMAkG A1UEBhMCVFcxDzANBgNVBAgTBlRBSVdBTjERMA8GA1UEBxMIVGFpY2h1bmcxDDAK … (略) … DQEHATAaBggqhkiG9w0DAjAOAgIAoAQIIyXl/VHcSASAGOtS9efsvXwqks1LmBp6 irSgxerAE6TShw==
11. 文件解密倘若我們收到了某人傳送的「document.enc」,我們便能使用Private Key來進行解密。 ~/openssl/bin/openssl smime -decrypt -in document.enc \ -recip islab_cert.pem -inkey islab_key.pem This is a text file.
12. 文件簽章為文件簽章可證明文件的來源為本人無誤,並且可以驗證文件是否被篡改。我們依前例,為一純文字檔「document.txt」簽章,簽章後檔名為「document.sig」。 ~/openssl/bin/openssl smime -sign -inkey islab_key.pem \ -signer islab_cert.pem -in document.txt -out document.sig cat document.sig MIME-Version: 1.0 Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="----F565CC3F7AEE7ACC3F74CA855D8EC920"
This is an S/MIME signed message
F565CC3F7AEE7ACC3F74CA855D8EC920
This is a text file.
F565CC3F7AEE7ACC3F74CA855D8EC920
Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s"
MIIHBgYJKoZIhvcNAQcCoIIG9zCCBvMCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3 DQEHAaCCBFYwggRSMIIDu6ADAgECAgEBMA0GCSqGSIb3DQEBBAUAMIGWMQswCQYD … (略) …
F565CC3F7AEE7ACC3F74CA855D8EC920--
13. 文件簽章驗證當某人收到這份文件時,可利用我們的憑證(islab_cert.pem)以及CA憑證(cacert.pem)來驗證文件。 ~/openssl/bin/openssl smime -verify -in document.sig \ -signer islab_cert.pem -out document.txt -CAfile cacert.pem Verification successful ■因此我們可以知道,驗證方必須事先取得CA憑證(cacert.pem)方可驗證文件。
参考资料
http://www.chinaunix.net/jh/4/479635.html OpenSSL学习纪要 命令行常用功能 使用OpenSSL实现证书的管理 OpenSSL.cn OpenSSL开发指南 中国OPENSSL API安全编程
取自"http://demo.itedu.info/mediawiki/index.php?title=OpenSSL