2.3 Linux下安装和配置OpenSSL
2.3.1 下载OpenSSL源代码
OpenSSL是一套公布原始码(Open Source)的套件,可以从http://www.openssl.org/取得。此文件撰写时,OpenSSL最新版本为0.9.8d。
2.3.2 安装OpenSSL
STEP 01 首先必须下载OpenSSL原始码。
wget http://www.openssl.org/source/openssl-0.9.8d.tar.gz
STEP 02 解压缩。
tar zxvf openssl-0.9.8d.tar.gz
STEP 03 设定OpenSSL安装,“--prefix”参数为欲安装之目录,也就是安装后的档案会出现在该目录下。
cd openssl-0.9.8d ./config --prefix=/home/blave/openssl
将“/home/blave/openssl”指定到你自己的目录下。其他参数说明如表2-2所示。
表2-2 其他参数说明
MD5:MD5是将一任意长的数据转化为固定长度的数据流的安全哈希算法。MD2、MD4和MD5(MD表示信息摘要)是由Ron Rivest设计的专门用于加密处理的,并被广泛使用的Hash函数,它们产生一种128位信息摘要,除彻底地搜寻外,没有更快的方法对其加以攻击,而其搜索时间一般需要1025年之久。
RSA:可以用来加密,也可以用来签名的被广泛使用的公钥加密算法。
RC2、RC4:由RSA Data Security, INC所专有的bulk加密算法。RC2是一块加密算法,而RC4是一流加密算法。
SHA:安全哈希算法(Secure Hash Algorithm)是在IPS PUB 180-1中定义的,它将产生一20 bit的输出。
DES:DES是一被广泛使用的对称加密算法,它属于块加密。
CBC:CBC是一种加密方式,其中,每一明文块在加密之前首先与上一个明文块的加密所得的密文相异或(当所加密的密文块是第一个密文块时,它与初始化向量相异或),然后再进行加密。
STEP 04 编译OpenSSL。
make
STEP 05 安装OpenSSL。
make install
STEP 06 修改 ~/openssl/ssl/openssl.cnf。
dir=/home/blave/openssl/ssl/misc/demoCA #设定存取CA凭证的路径并将blave改成你自己的路径 default_days= 3650 #设定凭证可使用的天数 default_bits = 2048 #设定公钥长度(bits)
2.3.3 产生CA凭证
我们所产生的CA凭证,将放置在 ~/openssl/ssl/misc/demoCA目录下,以下我们将介绍如何产生出最上层的CA凭证。
STEP 01 执行CA凭证产生程序。
cd ~/openssl/ssl/misc ./CA.sh -newca CA certificate filename (or enter to create) [enter] Making CA certificate ... Generating a 1024 bit RSA private key .............................................................++++++ ..++++++ writing new private key to './demoCA/private/./cakey.pem' Enter PEM pass phrase:[设定通行码] Verifying - Enter PEM pass phrase:[确认通行码] ----- You are about to be asked to enter information that will be incorporated into 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 blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]: CN State or Province Name (full name) [Berkshire]:Beijing Locality Name (eg, city) [Newbury]:Taichung Organization Name (eg, company) [My Company Ltd]:Tung-hai University Organizational Unit Name (eg, section) []:ISLAB Common Name (eg, your name or your server's hostname) []:ISLAB_CA Email Address []:blave@islab.csie.cn
STEP 02 确定CA凭证及公钥是否产生。
cd ~/openssl/ssl/misc/demoCA ls cacert.pem certs crl index.txt newcerts private serial
“cacert.pem”即是CA之凭证,而“private”目录即是存放CA私钥之处。
STEP 03 设定CA凭证之存取权限,仅允许本人能存取,其他人必须限制存取权限。
chmod -R 660~/openssl/ssl/misc/demoCA
2.3.4 CA产生次级凭证
在CA凭证产生完之后,我们便可以产生使用者或公司所需要的凭证,此次级凭证产生后,使用者便可应用于E-mail签章加密或HTTPS等SSL传输加密。
STEP 01 产生使用者的公钥及CSR文件(Certificate Signing Request)。
cd ~/openssl/ssl/misc/demoCA ~/openssl/bin/openssl req -nodes -new -keyout islab_key.pem \ -out islab_req.pem -days 3650-config ~/openssl/ssl/openssl.cnf #此处“-keyout”即为产生Private key的文件名,我们以“islab_key.pem”为例 #,你可自行设定。而“-out”则产生CSR的文件名,我们以“islab_req.pem”为例。 Generating a 2048 bit RSA private key ..........................................................+++ ..............................................................................+++ writing new private key to 'islab_key.pem' ----- You are about to be asked to enter information that will be incorporated into 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 blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [TW]:Cn State or Province Name (full name) [TAIWAN]:beijing Locality Name (eg, city) []:Taichung Organization Name (eg, company) [THU]:THU Organizational Unit Name (eg, section) []:ISLAB Common Name (eg, YOUR name) []:blave@islab.csie.cn #Common Name请输入你所欲使用的名称,如此凭证产生后欲使用于E-mail #签章,则必须填入E-mail名称;若此凭证欲使用在HTTPS,则必须填网址。 E-mail Address []:blave@islab.csie.cn Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:[password] An optional company name []:[company] #以上两项可随意输入即可。
STEP 02 产生使用者的凭证。
~/openssl/bin/openssl ca -config ~/openssl/ssl/openssl.cnf \ -policy policy_anything -out islab_cert.pem -infiles islab_req.pem Using configuration from /home/blave/openssl/ssl/openssl.cnf Enter pass phrase for /home/blave/openssl/ssl/misc/demoCA/private/cakey.pem:[输入 CA通行码] Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Feb 24 14:34:582005 GMT Not After : Feb 22 14:34:582015 GMT Subject: countryName = CN stateOrProvinceName = Beijing localityName = Taichung organizationName = THU organizationalUnitName = ISLAB commonName = blave@islab.csie.cn emailAddress = blave@islab.csie.cn X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: EC:88:66:DE:FF:79:CE:81:C2:EE:93:BF:9A:65:92:3B:AC:2C:CD:7E X509v3 Authority Key Identifier: keyid:37:AA:42:CF:FA:D9:73:C7:80:E5:0C:E2:9F:7B:95:86:40:66:72:C5 DirName:/C=TW/ST=Taiwan/L=Taichung/O=Tung-hai University/OU=ISLAB/CN= ISLAB_CA/emailAddress=blave@islab.csie.cn serial:00 Certificate is to be certified until Feb 22 14:34:582015 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
STEP 03 检查凭证是否产生。
cd ~/openssl/ssl/misc/demoCA ls cacert.pem crl index.txt.attr islab_cert.pem islab_req.pem private serial.old certs index.txt index.txt.old islab_key.pem newcerts serial
islab_cert.pem、islab_req.pem及islab_key.pem分别为刚刚所产生出来的凭证、CSR及Private Key。
2.3.5 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/emailAddress= blave@mail.tekgate.cn
4.检查凭证起始及终止日期时间
~/openssl/bin/openssl x509-noout -in islab_cert.pem -dates notBefore=Feb 24 07:54:162005 GMT notAfter=Feb 22 07:54:162015 GMT
5.检查个人凭证信息Subject
~/openssl/bin/openssl x509-noout -in islab_cert.pem -subject subject= /C=TW/ST=TAIWAN/L=Taichung/O=THU/OU=CSIE/CN=blave@mail.tekgate.idv.tw/ emailAddress= blave@mail.tekgate.cn
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)方可验证文件。
14.文件加密并签章
我们已经知道如何加解密,以及签章验证的方法,即我们必须先将文件进行签章再加密,而收方则以相反步骤进行解密再验证即可(如图2-4所示)。
图2-4 文件加密并签章的流程
2.3.6 OpenSSL常用命令
OpenSSL有两种运行模式:交互模式和批处理模式。直接输入“openssl”回车进入交互模式,输入带命令选项的“openssl”进入批处理模式。OpenSSL命令列表如图2-5所示。
图2-5 OpenSSL命令列表
● enc:通用加密程序,可以使用不同的加密组合完成加密,输入及输出可以通过Base64编码转换。
● dgst:通用邮件文摘,使用MD2、MD5、SHA (SHA-0或SHA-1)或者MDC2等算法。
● asn1parse:分解并显示ASN1编码的二进制文件。
● rsa:操纵RSA私钥。
● dsa:操纵DSA私钥。
● dh:操纵Diffie-Hellman参数文件。
● dsaparam:操纵并产生DSA参数文件。
● crl2pkcs7:产生包括了一个CRL和证书的PKCS7对象。
● x509:操纵X.509证书,“自签”证书。
● req:操纵PKCS10证书需求,并且产生证书请求。
● genrsa:产生一个任意大小的RSA私钥。
● gendh:产生一组Diffie-Hellman参数。
● ca:从PKCS10证书请求产生一个证书,该程序同时维护着所颁发的证书的数据库。
● verify:检测X.509证书的签名。
OpenSSL的指令和选项繁多,这里主要介绍几个常用的。
1.OpenSSL指令gendsa
格式:
openssl gendsa [-out filename] [-des] [-des3] [-idea] [-rand file(s)] [paramfile]
描述:本指令由DSA参数来产生DSA的一对密钥。“dsa”参数可以用“dsaparam”来产生。
主要选项如下。
● -des/-des3/-idea:采用什么加密算法来加密我们的密钥。一般会要你输入保护密码。如果这三个中一个也没设置,我们的密钥将不被加密而输入。
● -rand file(s):产生Key的时候用过Seed的文件,可以把多个文件用冒号分开一起做Seed。
● paramfile:指定使用的DSA参数文件。
2.OpenSSL指令genrsa
格式:
openssl genrsa[-out filename][-passout arg][-des][-des3][-idea] [-f4][-3][-rand file(s)] [numbits]
描述:本指令是生成RSA私有密钥的工具。
主要选项如下。
● -out filename:私有密钥输入文件名,默认为标准输出。
● -passout arg:参看指令“dsa”里面的“passout”参数说明。
● -f4|-3:使用的公共组件,一种是3,一种是f4。
● -rand file(s):产生Key的时候用过Seed的文件,可以把多个文件用冒号分开一起做Seed。
● numbits:指明产生的参数的长度。必须是本指令的最后一个参数,如果没有指明,则产生512bit长的参数。
3.OpenSSL指令rand
格式:
openssl rand [-out file] [-rand file(s)] [-base64] num
描述:本命令用来产生伪随机字节。随机数字产生器需要一个Seed,在没有/dev/srandom情况下的解决方法是自己做一个~/.rnd文件。
主要选项如下:
● -out file:输出文件。
● -rand file(s):产生随机数字的时候用过Seed的文件,可以把多个文件用冒号分开一起做Seed。
● -base64:对产生的东西进行Base64编码。
● num:指明产生多少字节随机数。