SSL基础

###SSL基础

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。

TLS与SSL在传输层对网络连接进行加密。 Secure Socket Layer,为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。

它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。 SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol)它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。

###SSL握手协议(SSL Handshake Protocol)

它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

功能:

  1. 认证用户和服务器,确保数据发送到正确的客户机和服务器;
  2. 加密数据以防止数据中途被窃取;
  3. 维护数据的完整性,确保数据在传输过程中不被改变。

服务器认证阶段:

  1. 客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;
  2. 服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;
  3. 客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;
  4. 服务器回复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。 用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。

###linux下安装OpenSSL

安装OpenSSL:
命令:

apt-cache search libssl | grep SSL  

搜索得到libssl的最新版本,安装。 如果希望利用openssl的库进行开发,则需要安装apt-get install libssl-dev
OpenSSL的命令模式,以下是一些例子:
下面这个命令将使用Base64编码方法(Base64 Encoding)
"Welcome to LinuxCareer.com"(欢迎访问LinuxCaeer.com)这个消息进行加密:

$ echo "Welcome to LinuxCareer.com" | openssl enc -base64 V2VsY29tZSB0byBMaW51eENhcmVlci5jb20K  

上述这个命令的输出是一个经过加密的字符串,含有已经过编码的消息"Welcome to LinuxCareer.com"。想对经过编码的字符串进行解密,恢复成原始消息,我们就要颠倒顺序,加上-d选项,进行解密:

$ echo "V2VsY29tZSB0byBMaW51eENhcmVlci5jb20K" | openssl enc -base64 -d  

上述加密易于使用,不过它缺少密码的一个重要特性,这个重要特性应该可用于加密。比如说,试着用密码”pass”对下列字符串进行解密:

U2FsdGVkX181xscMhkpIA6J0qd76N/nSjjTc9NrDUC0CBSLpZQxQ2Db7ipd7kexj  

为此,就要再次使用OpenSSL,这回带-d选项和编码方法aes-256-cbc:

echo "U2FsdGVkX181xscMhkpIA6J0qd76N/nSjjTc9NrDUC0CBSLpZQxQ2Db7ipd7kexj" | openssl enc -aes-256-cbc -d -a  

你恐怕已经猜想到了,要像上面那样用密码创建经过加密的消息,可以使用下面这个命令:

$ echo "OpenSSL" | openssl enc -aes-256-cbc -a enter aes-256-cbc encryption password:  

Verifying - enter aes-256-cbc encryption password: U2FsdGVkX185E3H2me2D+qmCfkEsXDTn8nCn/4sblr8=  

如果你想把OpenSSL的输出存储到文件中,而不是存储到STDOUT,只要使用STDOUT重定向”>”。将经过加密的输出存储到文件中时,你还可以删去-a选项,因为不再需要输出是基于ASCII文本的:

$ echo "OpenSSL" | openssl enc -aes-256-cbc > openssl.dat  
enter aes-256-cbc encryption password:  
Verifying -enter aes-256-cbc encryption password:  
$ file openssl.dat  
openssl.dat: data  

想对openssl.dat文件进行解密,恢复至原始消息,请使用:

$ openssl enc -aes-256-cbc -d -in openssl.dat  
enter aes-256-cbc decryption password:  
OpenSSL  

####对文件进行加密和解密

想使用OpenSSL对文件进行加密,其实就跟对消息进行加密一样简单。唯一的区别在于,我们不是使用echo命令,而是使用-in选项,后面跟以我们想进行加密的实际文件,并使用-out选项,这会指令OpenSSL将经过加密的文件存储到某个名称的文件中:

$ openssl enc -aes-256-cbc -in /etc/services -out services.dat  

想对我们的服务文件进行解密,恢复成原样,请使用:

$ openssl enc -aes-256-cbc -d -in services.dat > services.txt  
enter aes-256-cbc decryption password:  

####对目录进行加密和解密

万一你需要使用OpenSSL对整个目录进行加密,首先需要创建gzip打包文件(tarball),然后用上述方法对该打包文件进行加密,也可以使用pipe,同时完成这两项任务:

# tar cz /etc | openssl enc -aes-256-cbc -out etc.tar.gz.dat  
tar: Removing leading `/' from member names  
enter aes-256-cbc encryption password:  
Verifying - enter aes-256-cbc encryption password:  

想对整个etc/目录进行解密,并提取到当前的工作目录,请使用:

# openssl enc -aes-256-cbc -d -in etc.tar.gz.dat | tar xz  
enter aes-256-cbc decryption password:  

上述方法对自动备份加密目录来说相当有用。


###SSL证书相关知识

生产CA和CA签名的详细介绍
ubuntu openssl
ubuntu httpd apache2配置
ubuntu证书


个人主页


「你还是一个人吗」  
「难道我回变成一条狗吗」  

「汪汪汪」