码迷,mamicode.com
首页 > 其他好文 > 详细

ssl协议相关总结和创建私有CA过程

时间:2015-09-28 19:20:19      阅读:497      评论:0      收藏:0      [点我收藏+]

标签:ssl协议以及利用openssl创建ca

数据安全的相关术语:

NIST规定安全协议的应该具备的特性:

    保密性:

        数据保密性

        隐私性

    完整性:

        数据完整性

        系统完整性

    可用性:

 

安全攻击:

    被动攻击:窃听

    主动攻击:伪装、重放、消息篡改、拒绝服务


安全机制:

    加密、数字签名、访问控制、数据完整性、认证交换、流量填充、路由控制、公证


安全服务:

    认证、

    访问控制、

    数据保密性、

        链接保密性

        无连接保密性

        选择域保密性

        流量保密性

    数据完整性

    不可否认性


密码算法和协议:

    对称加密

    公钥加密

    单向加密

    认证加密

 

所谓的数字签名就是事先用单向加密技术对数据加密,然后使用私钥对数据指纹进行加密,然后放在数据的尾部进行传送

 

linux系统上的两个实现加密的协议opensslgpgpgp

常见的加密算法和协议:

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

            DES算法:data encryption standard

            3DES算法:

            AES128bits,192bits,258bits,384bits,512bits

            Blowfish

            Twofish

            IDEA

            RC6

            CAST5

对称加密特性

        1、加密解密使用同一个秘钥

        2、将原始数据分割成固定大小的块,逐个进行加密

 

对称加密缺陷

        1、秘钥过多。需要不同的秘钥为每一次加密提供加密,

        2、秘钥分发有困难。

 

公钥加密:(即非对称加密)

        公钥:公开给所有人。pubkey

        私钥:自己留存,必须保证其私密性。 secret key

 

特点:用公钥加密的数据,只能使用与之配对的私钥解密

 

身份认证(数字签名):

秘钥交换:发送方用对方的公钥加密一个对称秘钥,并发送给对方

数据加密:使用单向加密算法对数据进行加密

 

 

常见算法RSA,DSA,ELGamal(商业算法)

 

单向加密:只能加密,不能解密,用来提取数据指纹

    特性:定长输出、雪崩效应

    算法:

        md5:128bits

        sha1:160bits

        sha224:

        sha256

        sha384

        sha512

 

功能:实现数据的完整性加密,主要用来提取数据指纹

 

秘钥交换:IKE

公钥加密

DHdeffie-hellman)算法

 

PKIpublic key infrastructure  公钥基础设施,包含以下几个结构

    签证机构CA

    注册机构RA

    证书吊销列表CRL

    证书存取库

 

x509是目前证书的标准,定义了证书的格式以及认证协议标准

证书内容:版本号、序列号、签名算法ID、发行者名称、有效期限、主题名称(证书拥有者)、主体公钥、发行者唯一标示、主体唯一标识、扩展信息、发行者签名

 

SSLsecure socket layer 称为安全的套接字层是Netscape公司开发的,主要用于提高应用程序之间的数据安全系数

 

SSL协议主要提供三方面的服务:

    一  用户和服务器的合法性认证。

    二、加密数据已隐蔽被传送的数据。

    三、保护数据的完整性。SSL涉及所有的TCP/IP应用程序,是一个保证任何安装了安全套接字层的客户和服务器之间安全的协议

   

TLS 1.0  :transport layer secure 相当于SSL 2.0 的增强版,安全的传输层协议,协议结构包括TLS记录协议和TLS握手协议。

用于两个同信的应用层之间提供保密性和数据完整性。TLS记录协议(TLS Record)和TLS握手协议(TLS Handshake)。较低的层为TLS协议记录,位于某个可靠的传输协议(如TCP)上面

  

注意:目前使用广泛的是TLS 1.2版本,LLS/TLS 建立会话是基于ip的而不能是主机名,因此一个应用层程序同时只能维持一个ssl会话。

 

建立ssl或者tls握手规则4

    1.验证证书的发放者的证书的确是其自己的证书

    2、验证ca的来源合法性

    3、验证数据的完整性

    4、验证证书的有效期限(就是验证证书是否已过期)

 技术分享

 

opessl程序包:ssl协议的开源实现。

    opessl包含三个组件:

        openssl:多用途的命令行工具

        libcrypto:公共加密库:(程序员使用)提供对外接口

        libssl:库,实现了ssltls库,并提供对外接口(程序员使用)

 

[root@localhost lib64]# whereis libssl

libssl: /usr/lib64/libssl3.so /usr/lib64/libssl.so

[root@localhost lib64]# whereis libcrypto

libcrypto: /usr/lib64/libcrypto.so

 

查看当前系统的openssl组件的版本信息:openssl version

[root@localhost lib64]# openssl version

OpenSSL 1.0.1e-fips 11 Feb 2013

 

digest :摘要信息

algorithms:算法

symmetric:对称

encrypt:加密

decrypt:解密

 

openssl命令使用格式

    openssl command [ command_opts ] [ command_args ]

    openssl 标准命令 消息摘要命令 加密命令 摘要算法 消息摘要算法 公钥算法

 

可使用openssl -h列出可供使用的命令:

   标准命令、消息摘要命令、加密命令

 

对称加密: 

    工具:openssl encgpg

    算法:des3aesblowfishtwofish

 

enc命令: openssl enc [-e] [-d] [-a/-base64][-salt] [-in filename] [-out filename]

        

[root@localhost ~]# openssl enc -e -des3 -a -in aa -out aa.cipher.txt

enter des-ede3-cbc encryption password:

Verifying - enter des-ede3-cbc encryption password:

[root@localhost ~]# cat aa.cipher.txt 

U2FsdGVkX1/Ga1aIuR/VbIAIeP1UPYzH/jVXKWXR9DA/tLJjGWJ2xc9i9oojbYSd

[root@localhost ~]# openssl enc -d -des3 -a -salt -in aa.cipher.txt -out aa

 

单向加密

    工具:md5sum  sha1sum  sha224sum  sha256sum  sha284sum sha512sum shasum

    单向加密是用来提取数据指纹的,不能解密

md5sum -t file 表示为file文件提取数据指纹,可以使用重定向到一个文件中

md5sum -c|--check file 表示检查文件中的数据指纹

 

dgst命令

openssl dgst -md5 -out out_to_file file 也可以不指定-out而使用重定向到文件中,也可以使用sha1sum

MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现在网络通信中保证所传输的数据的完整性;

 

机制:

CBC-MAC

HMAC:使用md5sha1算法


passwd命令:用来手动生成用户密码

   openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}

[-crypt] :使用crypt加密算法

[-1] :使用基于BSD风格的md5加密算法 

[-apr1] :使用apr1加密算法

[-salt string] :表示加入的杂质,这个参数可以指定加入的杂事string,但是如果从终端输出密码,会加入随机的杂质,因此可以不直接指定-salt选项

[-in file] :表示可以从文件中取密码 

[-stdin] :表示可以从表中输入读取密码,例如echo 1111 | openssl passwd 

[-quiet] :表示静默模式,不输出警告信息

 例:

[root@localhost ~]# sha1sum aa > aa.txt

[root@localhost ~]# cat aa.txt 

f0a57a573e3d4932c986ff1eeea8d164f5ead5f7  aa

[root@localhost ~]# sha1sum -c aa.txt

[root@localhost ~]# openssl dgst -md5 -out aa.txt  aa

[root@localhost ~]# cat aa.txt

MD5(aa)= 0c258093fdb6cce07bc0633fcc504b07

[root@localhost ~]# openssl passwd -salt xx -1 

Password: 

$1$xx$gnNqGXcSDxBnqB0EA8G3a/

[root@localhost ~]# openssl passwd -salt xx 

Password: 

xx5R6mlcGJ2K.

[root@localhost ~]# openssl passwd -salt xx -apr1

Password: 

$apr1$xx$DkmE5ZyxWilgCxqivdw.q0

[root@localhost ~]# echo 111111 > aa

[root@localhost ~]# cat aa

111111

[root@localhost ~]# openssl passwd -salt ee -in aa 

eeEwBNf04p1x6

[root@localhost ~]# 

[root@localhost ~]# echo 111111 | openssl passwd -salt ee -1 -stdin

$1$ee$BwFFYsLTlJsb/wy1PTOna/

 

公钥加密

    算法:RSA ELGamal 

    工具:gpg,openssl rsautl

 

数字签名

    算法:RSA/DSA/ELGamal

 

秘钥交换

    算法:dh

 

DSA: Digital Signature Algorithm

DSSDigital Signature Standard

rsautl命令:本指令能够使用RSA算法签名,验证身份, 加密/解密数据

 openssl rsautl [-in file] [-out file] [-inkey file]

       [-pubin] [-certin] [-sign] [-verify] [-encrypt]

       [-decrypt] [-pkcs] [-ssl] [-raw] [-hexdump] [-asn1parse] 

    OPTIONS :

    -in filename 

    指定输入文件名。缺省为标准输入。 

    -out filename 

    指定输入文件名, 缺省为标准输出。 

    -inkey file 

    指定我们的密钥文件, 格式必须是RSA密钥文件。(默认表示私钥) 

    -pubin 

    指定我们的公共密钥文件。说真的我还真不知道RSA的公共密钥文件有什么用,一般公共密钥都是放在证书里面的。 

    -certin 

    指定我们的证书文件了。 

    -sign 

    给输入的数据签名。需要我们的私有密钥文件。 

    -verify 

    对输入的数据进行验证。 

    -encrypt 

    用我们的公共密钥对输入的数据进行加密。 

    -decrypt 

    用RSA的私有密钥对输入的数据进行解密。 

    -pkcs, -oaep, -ssl, -raw 

   采用的填充模式, 上述四个值分别代表:PKCS#1.5(缺省值), PKCS#1 OAEP, SSLv2里面特定的填充模式,或者不填充。如果要签名,只有-pkcs-raw可以使用

    -hexdump 

    用十六进制输出数据。 

    -asn1parse 

    对输出的数据进行ASN1分析。看看指令asn1parse吧。该指令一般和-verify一起用的时候威力大。 

    本指令加密数据的时候只能加密少量数据,要加密大量数据,估计要调API.我也没试过写RSA加密解密的程序来玩。 

 

对一个文件进行数字签名(这个内容不能太大),然后对其进行验证

[root@localhost tmp]# openssl rsautl -in a.txt -sign -inkey b.txt -out d.txt

[root@localhost tmp]# openssl rsautl -verify -inkey b.txt -in d.txt

 

对一个文件进行加密和解密

先生成秘钥对(私钥)

[root@localhost ~]# openssl genrsa  -out aa.txt  1024

从私钥中提取公钥

[root@localhost ~]# openssl rsa -in aa.txt -pubout

用公钥对文件进行加密

[root@localhost tmp]# openssl rsautl  -in a.txt  -out d.txt -pubin -inkey c.txt -encrypt

用私钥对加密后的文件进行解密

[root@localhost tmp]# openssl rsautl -decrypt -in d.txt -inkey b.txt 

sdfasodif

 

生成秘钥对的工具

gendsa命令:基于DSA算法

 

genrsa命令:基于RSA算法

   openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER]

       [-in filename] [-passin arg] [-out filename] [-passout

       arg] [-sgckey] [-des] [-des3] [-idea] [-text] [-noout]

       [-modulus] [-check] [-pubin] [-pubout] [-engine id] bits

 


[-in filename] :指定从文件中读取一个秘钥

-out file :指定创建后的私钥保存的位置而不是直接输出到屏幕

[-des] [-des3] [-idea] :为私钥加密

[-check] :检查私钥的  

[-pubin]

 

注意:创建的公钥都是包含在私钥中的,需要使用命令从私钥中提取公钥

 

创建一个私钥并输出到文件中

[root@localhost ~]# openssl genrsa  -out aa.txt  1024

[root@localhost ~]# cat aa.txt 

-----BEGIN RSA PRIVATE KEY-----

MIICXgIBAAKBgQDFAqWF/3pozvJ3LDCcVbwn4O6NI5oqqyMNdiXK64lmiCeBm1FI

qv96/2vfBbI3OPV5y6He67zfGs1oC8Z2NHNUZzn7Hl2noGQK/PkECPfSEJ5NR6tP

V/5CfsuLOxPX9mgouqmT9cVxEERtP38dRjHasElI3LUQcYsElngBTsyuXwIDAQAB

AoGAVUn0BrK3d7A/37/Nu6CSOGF0ZL3I/DfikO1ZJyQY8751+/IVmnQM7l6tgHui

z61k+Dlj9nHv7lZYHncakAnc8yavBG86Jcy7oAg7/VjxIU2+sqc6HJXXAl3zZM4n

/QRF0BHyf8qPxzOffQ/llaFPN5/D+uGs8OLHrdVMMG0cgsECQQDqJ6vfc22FnUvw

cTlaFB/C1QglovTicEgOqCLl7VcO/ArTkVwCppEThkE0VnsW5LrYvfb2k25GtCUI

86TmsW+pAkEA12PZYqijgMucnldzS9SytgUI4M7AmYq6Zv29InheEqvHpSrmAu7I

25YRV1MsEN491/HeiMNf1TlmDv8hT/0SxwJBAIOaXG0wUOQB7kZrPJK2MMuuM/AD

UKNb/APQ2BxmcsHHQsZ6Mj6DI5LXqBokaPYLBEEBM6aOYjJ22UHYvluyalECQQDA

dAlDLCeb51Kz8LOmaBCervT12gchqmFPsR0T9bUovbCPljsbF70E55vrCPfwwoND

tmv+i4PPg4/7il97l0b1AkEAgBCO1Y4DhqBo5TTCbP8VuoEekIMRkt9s76higs3U

aMy0bo8pLKdTFnau/a8Ak/BPVvsDSWsYer7B5sKVe8w2Xw==

-----END RSA PRIVATE KEY-----

 

从指定的私钥中提取公钥

[root@localhost ~]# openssl rsa -in aa.txt -pubout

writing RSA key

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFAqWF/3pozvJ3LDCcVbwn4O6N

I5oqqyMNdiXK64lmiCeBm1FIqv96/2vfBbI3OPV5y6He67zfGs1oC8Z2NHNUZzn7

Hl2noGQK/PkECPfSEJ5NR6tPV/5CfsuLOxPX9mgouqmT9cVxEERtP38dRjHasElI

3LUQcYsElngBTsyuXwIDAQAB

-----END PUBLIC KEY-----

[root@localhost ~]# openssl rsa -in aa.txt -pubout -out ab.txt

writing RSA key

[root@localhost ~]# cat ab.txt 

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFAqWF/3pozvJ3LDCcVbwn4O6N

I5oqqyMNdiXK64lmiCeBm1FIqv96/2vfBbI3OPV5y6He67zfGs1oC8Z2NHNUZzn7

Hl2noGQK/PkECPfSEJ5NR6tPV/5CfsuLOxPX9mgouqmT9cVxEERtP38dRjHasElI

3LUQcYsElngBTsyuXwIDAQAB

-----END PUBLIC KEY-----

 

 

证书申请及签署步骤

    1、生成申请请求:

    2RA核验

    3CA签署:

    4、获取证书,从CA的证书库中获取

 

如何创建私有CA

openssl的配置文件:/etc/pki/tls/openssl.cnf

(1)创建所需要的文件或目录

   #touch index.txt

   #echo 01 > serial

   #

(2)CA自签证书

   #创建私钥

   (umask 077;openssl genrsa -out /etc/pki/CA/privite/cakey.pem 2048

   #openssl req -new -x509 -key /etc/pki/CA/private/cakeu.pem -days 7300 -out  /etc/pki/CA/cacert.pem


练习:

1、创建所需数据存放文件,以及存放序列号的文件

[root@localhost CA]# touch index.txt

[root@localhost CA]# echo 01 >serial

[root@localhost CA]# ls

cacert.pem  certs  crl  index.txt  newcerts  private  serial

 

2、创建ca的秘钥对

[root@localhost CA]# (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)

Generating RSA private key, 2048 bit long modulus

..............................................+++

................+++

e is 65537 (0x10001)

 

3CA自签证书

[root@localhost CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.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) [XX]:CN  

State or Province Name (full name) []:henan

Locality Name (eg, city) [Default City]:henan

Organization Name (eg, company) [Default Company Ltd]:henancom

Organizational Unit Name (eg, section) []:henancom

Common Name (eg, your name or your server‘s hostname) []:hostname

Email Address []:admin@lpw.com

[root@localhost CA]# ls

cacert.pem  certs  crl  newcerts  private

 

4私有ca创建完成,接下来是需要使用证书的机构向ca申请签证

在另外一个主机上,加入为http服务器创建证书

  首先、申请证书的服务器要有自己的秘钥对:手动生成

[root@localhost httpd]# (umask 077; openssl genrsa -out /etc/httpd/httpd.key 1024)

Generating RSA private key, 1024 bit long modulus

..........................................++++++

...........................................++++++

e is 65537 (0x10001)

[root@localhost httpd]# ls

conf  conf.d  httpd.key  logs  modules  run


5、申请证书的主机向ca申请签证,首先生成待签证的证书请求

[root@localhost httpd]# openssl req -new -key /etc/httpd/httpd.key -days 365 -out /etc/httpd/httpd.csr

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) [XX]:CN

State or Province Name (full name) []:henan  

Locality Name (eg, city) [Default City]:henan

Organization Name (eg, company) [Default Company Ltd]:henancom

Organizational Unit Name (eg, section) []:henancom

Common Name (eg, your name or your server‘s hostname) []:hostname

Email Address []:admin@lpw.com

 

Please enter the following ‘extra‘ attributes

to be sent with your certificate request

A challenge password []:111111

An optional company name []:111111

[root@localhost httpd]# ls

conf  conf.d  httpd.csr  httpd.key  logs  modules  run

 

6、将待签证证书交给CA来签证

[root@localhost CA]# scp root@172.16.249.236:/etc/httpd/httpd.csr ./

root@172.16.249.236‘s password: 

httpd.csr                           100%  753     0.7KB/s   00:00    

[root@localhost CA]# ls

cacert.pem  crl        index.txt  private

certs       httpd.csr  newcerts   serial

 

7CA为处理签证请求

[root@localhost CA]# openssl ca -in ./httpd.csr -out ./httpd.crt -days 365

Using configuration from /etc/pki/tls/openssl.cnf

Check that the request matches the signature

Signature ok

Certificate Details:

        Serial Number: 1 (0x1)

        Validity

            Not Before: Sep 15 05:55:00 2015 GMT

            Not After : Sep 14 05:55:00 2016 GMT

        Subject:

            countryName               = CN

            stateOrProvinceName       = henan

            organizationName          = henancom

            organizationalUnitName    = henancom

            commonName                = hostname

            emailAddress              = admin@lpw.com

        X509v3 extensions:

            X509v3 Basic Constraints: 

                CA:FALSE

            Netscape Comment: 

                OpenSSL Generated Certificate

            X509v3 Subject Key Identifier: 

                12:11:1A:53:D3:0A:EC:05:58:7B:DE:04:09:5D:0E:F5:CA:3A:5D:3D

            X509v3 Authority Key Identifier: 

                keyid:8A:BA:AE:18:22:9C:C5:60:AE:70:43:55:51:81:16:A4:86:2A:D0:65

 

Certificate is to be certified until Sep 14 05:55:00 2016 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

[root@localhost CA]# 

 

8、将签好的证书交给申请者,或者申请者自己获取

[root@localhost httpd]# scp root@172.16.249.125:/etc/pki/CA/httpd.crt ./

root@172.16.249.125‘s password: 

httpd.crt                                                        100% 3831     3.7KB/s   00:00    

[root@localhost httpd]# ls

conf  conf.d  httpd.crt  httpd.key  logs  modules  run

 

9、申请者的证书已注册好,可以在对外提供服务时提供自己的证书

 

10、证书吊销过程




 

linux系统上有两个随机生成器

/dev/random : 仅从熵池中返回随机数,若熵池中随机数用完,就会阻塞,暂时不能继续取随机数

/dev/urandom :从熵池中返回随机数,若熵池中随机数用尽,则利用软件生成伪随机数,不会阻塞


生成随机数:rand命令

openssl rand -base64|-hex NUM

NUM: 表示字节数;-hex时,每个字符4位,出现的字符数为NUM*2; 

可以使用-out指定输出到某个文件中,而不是输出到屏幕

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一

hex表示16进制数

 

[root@localhost ~]# openssl rand -base64 4

zYbwOA==

[root@localhost ~]# openssl rand -hex 4

1d224208

 

 


本文出自 “七颗星” 博客,请务必保留此出处http://qikexing.blog.51cto.com/7948843/1698792

ssl协议相关总结和创建私有CA过程

标签:ssl协议以及利用openssl创建ca

原文地址:http://qikexing.blog.51cto.com/7948843/1698792

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!