Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4564863
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: 网络与安全

2017-10-26 15:53:42


http://blog.itpub.net/21851324/viewspace-1023022/
http://www.cnblogs.com/thbCode/p/5829719.html

1,公钥私钥成对出现
2,私钥只有我知道
3,大家可以用我的公钥给我发加密的信了
4,大家用我的公钥解密信的内容,看看能不能解开,能解开,说明是经过我的私钥加密了,就可以确认确实是我发的了。

总结一下结论:
1,用公钥加密数据,用私钥来解密数据
2,用私钥加密数据(数字签名),用公钥来验证数字签名。

在实际的使用中,公钥不会单独出现,总是以数字证书的方式出现,这样是为了公钥的安全性和有效性。

公钥和私钥一般都是用PEM方式保存,但是公钥文件还不足以成为证书,还需要CA的签名
CSR是证书签名请求,CA用自己的私钥文件签名之后生成CRT文件就是完整的证书了
CER和CRT其实是一样的,只是一般Linux下面叫CRT多,Windows下面叫CER多
不同的语言、工具序列SSL相关文件的格式和扩展名是不一样的。
其中Java系喜欢用keystore, truststore来干活,你看它的名字,Store,仓库,它里面存放着key和信任的CA,key和CA可以有多个。
这里的truststore就像你自己电脑的证书管理器一样,如果你打开Chrome的设置,找到HTTP SSL,就可以看到里面有很多CA,truststore就是干这个活儿的,它也里面也是存一个或多个CA让Tomcat或Java程序来调用。
而keystore就是用来存密钥文件的,可以存放多个。

SSL工作流程:
  • 浏览器请求一个安全的页面(通过以https://开头)
  • WEB服务器返回它的公钥和证书
  • 浏览检查证书是由可信的机构颁发的(通过是可信的根CA),证书仍然有效并且证书与被访问的网站相关
  • 浏览器使用公钥来加密一个随机的对称密钥,加上加密后的URL和其它加密后的http数据一起发回至服务器。
  • WEB服务器使用私钥解密对称密钥,并用它来解密在浏览器上加密了的URL和http数据
  • WEB服务器使用对称密钥加密请求的HTML文档和http数据并发回至浏览器
  • 浏览器使用对称密钥解密HTML文档和http数据并展示给用户

  • 1. 用户浏览器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送到服务器。
    2. 服务器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送给浏览器,同时发给浏览器的还有服务器的证书。如果配置服务器的SSL需要验证用户身份,还要发出请求要求浏览器提供用户证书。
    3. 客户端检查服务器证书,如果检查失败,提示不能建立SSL连接。如果成功,那么继续。
    4. 客户端浏览器为本次会话生成pre-master secret,并将其用服务器公钥加密后发送给服务器。
    5. 如果服务器要求鉴别客户身份,客户端还要再对另外一些数据签名后并将其与客户端证书一起发送给服务器。
    6. 如果服务器要求鉴别客户身份,则检查签署客户证书的CA是否可信。如果不在信任列表中,结束本次会话。如果检查通过,服务器用自己的私钥解密收到的pre-master secret,并用它通过某些算法生成本次会话的master secret。
    7. 客户端与服务器均使用此master secret生成本次会话的会话密钥(对称密钥)。在双方SSL握手结束后传递任何消息均使用此会话密钥。这样做的主要原因是对称加密比非对称加密的运算量低一个数量级以上,能够显著提高双方会话时的运算速度。
    8. 客户端通知服务器此后发送的消息都使用这个会话密钥进行加密。并通知服务器客户端已经完成本次SSL握手。
    9. 服务器通知客户端此后发送的消息都使用这个会话密钥进行加密。并通知客户端服务器已经完成本次SSL握手。
    10. 本次握手过程结束,会话已经建立。双方使用同一个会话密钥分别对发送以及接受的信息进行加、解密。
    1 SSL通讯示意图
    SSL通讯示意图如图1所示:



    证书

    OpenSSL建立自己的CA

    (1) 环境准备

    首先,需要准备一个目录放置CA文件,包括颁发的证书和CRL(Certificate Revoke List)
    这里我们选择目录 /var/MyCA

    然后我们在/var/MyCA下建立两个目录,certs用来保存我们的CA颁发的所有的证书的副本;private用来保存CA证书的私钥匙。

    除了生成钥匙,在我们的CA体系中还需要创建三个文件。第一个文件用来跟踪最后一次颁发的证书的序列号,我们把它命名为serial,初始化为01。第二个文件是一个排序数据库,用来跟踪已经颁发的证书。我们把它命名为index.txt,文件内容为空。

    $ mkdir /var/MyCA
    $ cd /var/MyCA
    $ mkdir certs private
    $ chmod g-rwx,o-rwx private
    $ echo "01" > serial
    $ touch index.txt

    第三个文件是OpenSSL的配置文件,创建起来要棘手点。示例如下:

    $ touch openssl.cnf

    文件内容如下:

    [ ca ]
    default_ca = myca

    [ myca ]
    dir = /var/MyCA
    certificate = $dir/cacert.pem
    database = $dir/index.txt
    new_certs_dir = $dir/certs
    private_key = $dir/private/cakey.pem
    serial = $dir/serial

    default_crl_days= 7
    default_days = 365
    default_md = md5

    policy = myca_policy
    x509_extensions = certificate_extensions

    [ myca_policy ]
    commonName = supplied
    stateOrProvinceName = supplied
    countryName = supplied
    emailAddress = supplied
    organizationName= supplied
    organizationalUnitName = optional

    [ certificate_extensions ]
    basicConstraints= CA:false

    [ req ]
    default_bits = 2048
    default_keyfile = /var/MyCA/private/cakey.pem
    default_md = md5
    prompt = no
    distinguished_name = root_ca_distinguished_name
    x509_extensions = root_ca_extensions
    [ root_ca_distinguished_name ]
    commonName = My Test CA
    stateOrProvinceName = HZ
    countryName = CN
    emailAddress = test@cert.com 
    organizationName = Root Certification Authority
    [ root_ca_extensions ]
    basicConstraints = CA:true

    (2) 生成根证书 (Root Certificate)

    我们需要一个证书来为自己颁发的证书签名,这个证书可从其他CA获取,或者是自签名的根证书。这里我们生成一个自签名的根证书。


    $ openssl req -x509 -newkey rsa -out cacert.pem -outform PEM -days 356 -config openssl.cnf

    验证一下我们生成的文件。

    $ openssl x509 -in cacert.pem -text -noout

    生成结果:
    private/cakey.pem 是CA证书的私钥文件,
    cacert.pem 是CA证书。


    制作用于CA签名的CA的私钥和公钥文件
    [root@localhostssl.crt]#openssl genrsa -des3 -out ca.key 1024
    //要求为key文件输入密码(ca.key.password,随便输入,可以和输入的PEM密码不同)
    [root@localhostssl.crt]#openssl req -new -x509 -days 18250-key ca.key -out ca.crt 
    //要求输入密码以及证书信息。输入的密码要与使用的key文件的密码一致,否则会出错。

    同时需要输入证书信息。以完成公钥生成。


    2、制作服务器证书

    a、生成服务器私钥(server.key)
    [root@localhost ssl.crt]#openssl genrsa -des3 -out server.key 1024
    输入加密密码(server.key.password),用128位rsa算法密钥server.key文件
    该密码在部署客户端密钥时需要使用。
    b、生成服务器证书请求(server.csr)
    [root@localhost ssl.crt]#openssl req -new -key server.key -out server.csr
    这里要求输入的CommonName必须与通过浏览器访问您网站的 URL 完全相同,否则用户会发现您服务器证书的通用名与站点的名字不匹配,用户就会怀疑您的证书的真实性。可以使域名也可以使IP地址。
    c、生成服务器公钥(证书)
    [root@localhost ssl.crt]#openssl ca -in server.csr -days 18250 -out server.crt -cert ca.crt -keyfile ca.key  -config openssl.cnf

    d、查看和验证证书信息

    [root@localhost ssl.crt]#openssl x509 -noout -text -in server.crt //查看证书信息
    [root@localhost ssl.crt]#openssl verify -CAfile ca.crt server.crt //验证证书信息

    一定要保证验证通过,没有报错或警告信息。否则可能会在使用时出错。


    3、制作客户端证书

    a、生成客户端私钥(client.key)
    [root@localhost ssl.crt]#openssl genrsa -des3 -out client.key 1024
    输入加密密码(client.key.password),用128位rsa算法密钥client.key文件
    该密码在部署客户端密钥时需要使用。
    b、生成客户端证书请求(client.csr)
    [root@localhost conf]#openssl req -new -key client.key -out client.csr
    Common Name 可以随便取。
    c、生成客户端公钥(证书)
    [root@localhost ssl.crt]#openssl ca -in client.csr -days 18250 -out client.crt -cert ca.crt -keyfile ca.key  -config openssl.cnf
    将证书转换成浏览器可识别的格式:
    [root@conf]#openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

    需要输入Export密码,可以和Key文件密码不一样。该密码在客户端部署KEY文件时需要使用。
    d、
    [root@localhost ssl.crt]#openssl x509 -noout -text -in client.crt //查看证书信息
    [root@localhost ssl.crt]#openssl verify -CAfile ca.crt client.crt //验证证书信息

    一定要保证验证通过,没有报错或警告信息。否则可能会在使用时出错。


    阅读(716) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~