英文版地址:https://www.feistyduck.com/library/openssl-cookbook/online/ch-openssl.html
1. OpenSSL
OpenSSL 是一个开源项目,由加密算法库和SSL/TLS工具两部分组成。下面一段是OpenSSL项目网站上给出的定义:
The OpenSSL Project is a collaborative effort to develop a robust, commercial-grade, full-featured,and Open Source toolkit implementing the Secure Sockets Layer (SSL) and Transport Layer Security (TLS) protocols as well as a full-strength general purpose cryptography library. The project is managed by a worldwide community of volunteersthat use the Internet to communicate, plan, and develop the OpenSSL toolkit and its related documentation.
OpenSSL最早起源于Eric A. Young和Tim J. Hudson在1995年共同开发的SSLeay。1998年快要结束的时候Eric A. Young和Tim J. Hudson停止了SSLeay的开发工作,并将其作为开源项目提交给了开源社区,由此SSLeay便更名为OpenSSL了。
发展到现在,OpenSSL已经普遍应用于服务端以及客户端。其命令行工具作为证书和秘钥管理及测试工具更是被广泛使用。但是,作为客户端工具的最重要的一支——浏览器却一支使用着其他的SSL库。然而这一现象慢慢开始有所转变了,特别是在chrome使用了新的SSL库BoringSSL后,因为BoringSSL是从OpenSSL中分支出来的。
OpenSSL是双重许可证的,都是类BSD的许可证,有一个广告条。长久以来这个许可证都是有争议的,因为这两个许可证与GPL系列的许可证是不兼容的。因此,你经常会发现GPL许可的程序更倾向于用GnuTLS。
2. Getting Started
如果你用的是unix系统,那么基本上不用做任何事就可以使用openssl了,唯一需要关心或者说经常碰到的问题就是你系统里的openssl不是最新的版本。接下来的行文中用的环境都是unix系统,因为unix环境是OpenSSL最常用也是最直接的环境。
如果你用的是windows系统,那么需要你自行去OpenSSL的官网上下载安装,安装很简单直接,这里就不赘述了。
3. OpenSSL的版本选择以及配置
a. openssl version查看openssl的版本。结果类似:OpenSSL 1.0.1e-fips 11 Feb 2013
版本结果很直接,基本没啥好说的,唯一注意的一点就是1.0.1这个版本是最开始支持TLS1.1和TLS1.2的,之前的版本都不支持TLS1.1和TLS1.2
b. openssl version -a 查看openssl版本的详细信息,很多操作系统自带的openssl都是有修改的,虽然版本号一致,但是和标准的还是有一些区别,光用openssl version查看不出来,这时候就要用-a选项了,结果类似:
OpenSSL 1.0.1e-fips 11 Feb 2013
built on: Tue Jun 23 11:11:37 EDT 2015
platform: linux-x86_64
options: bn(64,64) md2(int) rc4(8x,char) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/etc/pki/tls"
engines: dynamic
需要特别注意的是OPENSSLDIR: "/etc/pki/tls",这里可查看openssl的配置信息已经证书和秘钥放置的位置。
/etc/pki/tls
|-- cert.pem -> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
|-- certs
| |-- ca-bundle.crt -> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
| |-- ca-bundle.trust.crt -> /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
| |-- make-dummy-cert
| |-- Makefile
| `-- renew-dummy-cert
|-- misc
| |-- CA
| |-- c_hash
| |-- c_info
| |-- c_issuer
| `-- c_name
|-- openssl.cnf
`-- private
4. 自己build OpenSSL
$ wget http://www.openssl.org/source/openssl-1.0.1p.tar.gz
$ ./config \
--prefix=/opt/openssl \
--openssldir=/opt/openssl \
enable-ec_nistp_64_gcc_128
$ make depend
$ make
$ sudo make install
You’ll get the following in /opt/openssl
:
drwxr-xr-x 2 root root 4096 Jun 3 08:49 bin
drwxr-xr-x 2 root root 4096 Jun 3 08:49 certs
drwxr-xr-x 3 root root 4096 Jun 3 08:49 include
drwxr-xr-x 4 root root 4096 Jun 3 08:49 lib
drwxr-xr-x 6 root root 4096 Jun 3 08:48 man
drwxr-xr-x 2 root root 4096 Jun 3 08:49 misc
-rw-r--r-- 1 root root 10835 Jun 3 08:49 openssl.cnf
drwxr-xr-x 2 root root 4096 Jun 3 08:49 private
5. 检测OpenSSL是否正常
$ openssl help openssl:Error: 'help' is an invalid command. Standard commands asn1parse ca ciphers cms crl crl2pkcs7 dgst dh dhparam dsa dsaparam ec ecparam enc engine errstr gendh gendsa genpkey genrsa nseq ocsp passwd pkcs12 pkcs7 pkcs8 pkey pkeyparam pkeyutl prime rand req rsa rsautl s_client s_server s_time sess_id smime speed spkac ts verify version x509 Message Digest commands (see the `dgst' command for more details) md2 md4 md5 rmd160 sha sha1 Cipher commands (see the `enc' command for more details) aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb aes-256-cbc aes-256-ecb base64 bf bf-cbc bf-cfb bf-ecb bf-ofb camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb camellia-256-cbc camellia-256-ecb cast cast-cbc cast5-cbc cast5-cfb cast5-ecb cast5-ofb des des-cbc des-cfb 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 idea idea-cbc idea-cfb idea-ecb idea-ofb rc2 rc2-40-cbc rc2-64-cbc rc2-cbc rc2-cfb rc2-ecb rc2-ofb rc4 rc4-40 seed seed-cbc seed-cfb seed-ecb seed-ofb zlib
看到上面输出的信息,基本确认你的OpenSSL环境可以工作了。