Concepts and Practice, Example by OpenSSL

来源:互联网 发布:社交软件的坏处 编辑:程序博客网 时间:2024/05/02 07:17

一、数据通信中的安全相关概念

这几个概念是正交的,所谓正交,是指:

  • 彼此独立,互不影响,可独立演化

  • 可两两结合使用

1. 保证安全通常需要解决三个问题

  1. 数据本身的机密性:数据有没有被窃听造成信息泄漏,即电子世界的盗窃行为

  2. 数据本身的正确性:数据有没有被篡改造成数据破坏,即电子世界的侵略行为

  3. 数据来源和目的的合法性:数据有没有被伪造或诱拐,即电子世界的欺诈行为

如果这三个问题都得到解决,那么就解决了安全通信的终极问题:数据的不可抵赖性

2. 针对这几个问题,通常有两种应对方案

  1. 保密:认为所有的一切都是不安全的,因此需要进行加密和解密

  2. 验证:包括验证数据的正确性和合法性:

    1. 数据的正确性:在正文之外包含额外的信息,这种信息通常是将正文作为某个算法的输入后产生的输出,因此需要发明保证两个不同的输入不会产生相同输出的算法

    2. 数据的合法性:认为数据来源和目的具有某种凭据才是可信任的,因此出现颁发凭据和验证凭据的安全机制

如前所述,这几种方式可以结合使用

3. 保密世界观中的加密与解密

3.1 概念

  • 加密:改变数据本来的意思

  • 解密:还原数据本来的意思

  • 密钥:加密解密时所使用的参数,可以是一个整数或一串字符,或其它任何加解密方法所能理解的形式

  • 对称密钥:加密和解密使用同一个密钥

  • 非对称密钥:加密和解密使用两个密钥,其中任何一个密钥加密的数据都能且都只能被另一个密钥解开

  • 公钥私钥:非对称密钥的一种实践形式,两个密钥中公开的人人皆知的那个称为公钥,保密的那个称为私钥

  • PKI:公钥基础设施,泛指使用了非对称加密的平台、工具等

3.2 常见实践

  • 公钥私钥:

  1. A将数据用自己的私钥加密,发送给B,C,D

  2. B,C,D用A的公钥解密

  3. B,C,D将各自的响应用A的公钥加密,发送给A

  4. A将返回的响应用自己的私钥解密

  • 用公钥加密对称密钥:

  1. A用对称密钥将数据加密,然后用自己的私钥把对称密钥本身加密,一起发送给B,C,D

  2. B, C, D用A的公钥解密对称密钥

  3. B, C, D用解密后的对称密钥继续解密,得到原始数据

  4. ...

4. 验证世界观中的数据正确性

4.1 概念

  • 消息摘要(Message Digest):一种算法,对正文进行计算后得到比较精简(通常是固定长度)的一小段摘要数据,该算法保证不会有两个不同的输入能够产生相同的输出,从而在保证摘要正确的前提下可验证数据的正确性,即没有被篡改;一个较为普遍的算法是MD5

  • 数字签名:消息摘要的一种应用,通常算法的输入涉及了通信方的身份标识,如私钥信息等,接收方收到数字签名后,可结合使用对方的公钥,消息摘要算法等验证消息的发送方确实是所声称的实体,比如,如果没有私钥就不可能计算出那个签名

4.2 常见实践

  • 正文明文,摘要加密

  1. A将正文产生的摘要加密(可使用前述加密实践中的任何一种),然后将正文明文和摘要密文一起发送给B,C,D

  2. B,C,D解密摘要,然后重新根据正文明文计算摘要,判断两个摘要是否相同,用以验证数据的正确性

  • 正文和摘要都加密

  1. 即将“加密”和“验证”完全正交的配合使用

5. 验证世界观中的数据合法性

5.1 概念

  • 证书:即电子世界中的身份证,通信开始前它可能是硬盘上的一个文件,或文件中的一段,通信开始后,它可能被传输到网络上到通信的另一方,用于告知对方自己的身份信息;这些身份信息具有一定的标准格式,即证书格式标准,常见的有X.509等,通常包括:公司名称,地址等,当然还有公钥,发证机关标识;是的,就像现实世界中的身份证,学生证,军人证一样,电子证书也需要发证机关,这就是CA

  • CA:证书颁发机构,类似现实世界中的公安局、学生处、军队等,但在电子世界中,这是一个逻辑上的概念,用于指称一切可以接受证书申请,可以签署证书,可以吊销证书的实体,因此CA可以是:

    1,某座写字楼里的几十人的公司,他们处理客户的书面证书申请,核实他们的信息,签署证书,将证书以电子邮件附件或网址的形式告知客户供他们下载,并收取一定的费用;该公司通常具有较高的公信力,有较多的交易方信任他们签署的证书

    2,某个软件,如Windows证书服务,如OpenSSL,它可以交互的提问和接受你的证书申请,并签署之,最后产生一个硬盘文件给你,你可以在信任该证书的范围内使用,如Windows域用户的各种安全服务

     

  • 信任:就像银行信任客户的身份证,不信任你的QQ号码一样,通信方可以有选择的信任某些证书,确切的说,信任某些CA颁发的证书,就像银行信任公安局颁发的身份证,不信任腾讯颁发的QQ号一样

  • 证书库:通信方在得到对方的证书后,需要验证是否在信任范围内,这个信任范围由信任的证书库给出,这个证书库通常是一个或多个硬盘文件,里面包含了信任的证书信息;证书库的建立,通常由使用的通信软件完成,如IE,它可以在你首次碰到一个证书时,询问你是否信任之,若选择始终信任,它将该证书导入到证书库中,下次便不再提问

  • CA层次:由于众多客户,分布可能极广,几个少数的CA显然不能满足全世界的交易需求,因此就像公安部、公安厅、公安局、派出所一样,CA也以层次化的形式存在,最顶层的CA称为根CA

  • CA层次与信任关系:就像你信任了公安部,也顺便信任了公安局、派出所一样(这个例子不太恰当,呵呵),信任了根CA(签署的证书),便信任了该根CA所有的下属分支(签署的证书)

5.2 实践

证书的应用,可以说是结合了几乎所有电子安全手段的一种应用,既有加密解密,又有正确性验证和身份验证 

  1. CA签发证书时,在证书上包含了自己的数字签名,从而保证了证书的不可伪造性

  2. 证书上包含了证书拥有者的公钥信息,接收方可以使用该信息解密正文数据和加密响应

 

二、SSL

SSL比较好理解,就是使用了PKI的一种应用,完全可以google之:

SSL(Secure Socket Layer)是一个介于HTTP协议与TCP之间的一个可选层,其位置大致如下:

---------
| HTTP/FTP etc.|
---------
| SSL          |
---------
| TCP          |
---------
| IP           |
---------

SSL层: 借助下层协议的的信道安全的协商出一份加密密钥,并用此密钥来加密HTTP请求。
TCP层:与web server的443端口建立连接,传递SSL处理后的数据。

接收端与此过程相反。

SSL在TCP之上建立了一个加密通道,通过这一层的数据经过了加密,因此达到保密的效果。

SSL协议分为两部分:Handshake Protocol和Record Protocol,。其中Handshake Protocol用来协商密钥,协议的大部分内容就是通信双方如何
利用它来安全的协商出一份密钥。 Record Protocol则定义了传输的格式。
 

三、OpenSSL实践

工作中需要配置使用SSL来双向认证并通信的FTP服务器,以OpenSSL和Java的keytool为例,来完成证书的制作:

d:/openssl/mkcerts>openssl genrsa -out ca.key 1024

创建CA私钥
Loading 'screen' into random state - done
warning, not much extra random data, consider using the -rand option
Generating RSA private key, 1024 bit long modulus
...................................................................++++++
.............++++++
e is 65537 (0x10001)

d:/openssl/mkcerts>openssl req -new -days 3650 -x509 -key ca.key -out demoCA/cacert.pem -config openssl.cnf

创建CA自签名证书(使用上一步创建的CA私钥来签名)
Using configuration from openssl.cnf
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) [AU]:CN
State or Province Name (full name) [Some-State]:BEIJING
Locality Name (eg, city) []:BEIJING
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Chelseafc
Organizational Unit Name (eg, section) []:FTPTest
Common Name (eg, YOUR name) []:CHELSEA
Email Address []:chelsea@chelseafc.com

d:/openssl/mkcerts>openssl genrsa -des3 -out server.key 1024

创建服务器私钥
Loading 'screen' into random state - done
warning, not much extra random data, consider using the -rand option
Generating RSA private key, 1024 bit long modulus
..............++++++
.++++++
e is 65537 (0x10001)
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:

d:/openssl/mkcerts>openssl rsa -in server.key -out serverkey.pem

加密服务器私钥(保护私钥信息)
read RSA key
Enter PEM pass phrase:
writing RSA key

d:/openssl/mkcerts>openssl req -new -days 3650 -key server.key -out server.csr-config openssl.cnf

创建申请服务器所需证书的请求
Using configuration from openssl.cnf
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) [AU]:CN
State or Province Name (full name) [Some-State]:BEIJING
Locality Name (eg, city) []:BEIJING
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Chelseafc
Organizational Unit Name (eg, section) []:FTPTest
Common Name (eg, YOUR name) []:CHELSEA
Email Address []:chelsea@chelseafc.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

d:/openssl/mkcerts>openssl ca -in server.csr -out server.pem -config openssl.cnf

CA签署服务器证书(需要CA私钥和序列号文件)
Using configuration from openssl.cnf
Loading 'screen' into random state - done
./demoCA/private/cakey.pem: No such file or directory(CA私钥文件./demoCA/private/cakey.pem)
trying to load CA private key
3776:error:02001000:system library:fopen:system library:tmp/bss_file.c:245:fopen
('./demoCA/private/cakey.pem','rb')
3776:error:20074002:BIO routines:FILE_CTRL:system lib:tmp/bss_file.c:247:

d:/openssl/mkcerts>openssl ca -in server.csr -out server.pem -config openssl.cnf

Using configuration from openssl.cnf
Loading 'screen' into random state - done
./demoCA/serial: No such file or directory(序列号文件./demoCA/serial)
error while loading serial number
4324:error:02001000:system library:fopen:system library:tmp/bss_file.c:245:fopen
('./demoCA/serial','rb')
4324:error:20074002:BIO routines:FILE_CTRL:system lib:tmp/bss_file.c:247:

d:/openssl/mkcerts>openssl ca -in server.csr -out server.pem -config openssl.cnf

Using configuration from openssl.cnf
Loading 'screen' into random state - done
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName :PRINTABLE:'CN'
stateOrProvinceName :PRINTABLE:'BEIJING'
localityName :PRINTABLE:'BEIJING'
organizationName :PRINTABLE:'Chelseafc'
organizationalUnitName:PRINTABLE:'FTPTest'
commonName :PRINTABLE:'CHELSEA'
emailAddress :IA5STRING:'chelsea@chelseafc.com'
Certificate is to be certified until Oct 26 03:01:33 2006 GMT (365 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

d:/openssl/mkcerts>openssl x509 -in server.pem -out server.crt

转换格式

d:/openssl/mkcerts>openssl x509 -in demoCA/cacert.pem -out demoCA/cacert.crt

转换格式

d:/openssl/mkcerts>keytool -genkey -keyalg RSA -alias ftpsconnector -keystore ftps.jks -storepass changeit -storetype jks

产生Java客户端私钥文件
您的名字与姓氏是什么?
[Unknown]: CHELSEA
您的组织单位名称是什么?
[Unknown]: FTPTest
您的组织名称是什么?
[Unknown]: Chelseafc
您所在的城市或区域名称是什么?
[Unknown]: BEIJING
您所在的州或省份名称是什么?
[Unknown]: BEIJING
该单位的两字母国家代码是什么
[Unknown]: CN
CN=CHELSEA, OU=FTPTest, O=Chelseafc, L=BEIJING, ST=BEIJING, C=CN 正确吗?
[否]: Y

输入<ftpsconnector>的主密码
(如果和 keystore 密码相同,按回车):

d:/openssl/mkcerts>keytool -certreq -alias ftpsconnector -keyalg RSA -file ftpsconnector.csr -keystore ftps.jks

产生Java客户端证书请求
输入keystore密码: changeit

d:/openssl/mkcerts>openssl ca -in ftpsconnector.csr -out ftpsconnector.pem -config openssl.cnf

CA签署Java客户端证书
Using configuration from openssl.cnf
Loading 'screen' into random state - done
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName :PRINTABLE:'CN'
stateOrProvinceName :PRINTABLE:'BEIJING'
localityName :PRINTABLE:'BEIJING'
organizationName :PRINTABLE:'Chelseafc'
organizationalUnitName:PRINTABLE:'FTPTest'
commonName :PRINTABLE:'CHELSEA'
Certificate is to be certified until Oct 26 03:05:08 2006 GMT (365 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

d:/openssl/mkcerts>openssl x509 -in ftpsconnector.pem -out ftpsconnector.cer

转换格式

d:/openssl/mkcerts>keytool -import -alias root -trustcacerts -file demoCA/cacert.crt -keystore ftps.jks

导入CA证书到jks文件并信任之(由此CA所签署的所有证书也因此在信任之列)


输入keystore密码: changeit
Owner: EMAILADDRESS=chelsea@chelseafc.com, CN=CHELSEA, OU=FTPTest, O=Chelseafc, L=BEIJING, S
T=BEIJING, C=CN
发照者: EMAILADDRESS=chelsea@chelseafc.com, CN=CHELSEA, OU=FTPTest, O=Chelseafc, L=BEIJING,
ST=BEIJING, C=CN
序号: 0
有效期间: Wed Oct 26 10:55:43 CST 2005 至: Sat Oct 24 10:55:43 CST 2015
认证指纹:
MD5: 85:21:11:10:26:4A:CD:01:55:B7:47:DF:0D:58:AA:A3
SHA1: 91:74:88:03:B7:5C:E4:BD:27:1F:27:BF:10:23:0A:BA:2C:42:13:2B
信任这个认证? [否]: y
认证已添加至keystore中

d:/openssl/mkcerts>keytool -import -alias ftpsconnector -trustcacerts -file ftpsconnector.cer -keystore ftps.jks

导入自己的证书到jks文件(至此,此jks文件包括了建立SSL连接所需所有信息)
 

输入keystore密码: changeit
认证回复已安装在 keystore中

四、Java客户端

客户端通常有一个文件,包含了所有信任的证书信息(包括SSL服务器),如上面的ftps.jks,可以以编程的方式将此文件的位置密码格式等告知客户端socket运行时,这样在试图建立SSL连接时收到服务器发送过来的证书时,便可以进行信任验证

 
原创粉丝点击