pyOpenssl简介

来源:互联网 发布:3d美工面试题 编辑:程序博客网 时间:2024/05/17 00:59
pyOpenssl简介

呵呵,基础知识普及^_^

1、SSL基本原理
   SSL(security socket layer),是为了加强网络信息安全的一套机制。
   SSL原理包括:握手协议和数据传送协议两个部分:
    a.握手协议:是为了确定通信双方都支持的通讯密钥处理方式。(实际上密钥算法有很多种,在产生的过程        中可选的辅助算法也有多种,握手就是确定密钥的)这里需要区分通信密钥(每次都会改变的)和我们平        常所说的证书、公钥、私钥等概念。
    b.数据传送协议:定义了消息传送的报文格式
   
   SSL通信流程(这里只列出服务器端提供验证的流程,当然客户端也可以提供证书证明自己):


    好了,现在我们知道了ssl的通信过程了,下面我们看看证书是怎么生成的。
    
2、X.509证书的生成与使用

   2.1 X.509证书简介
      X.509非常通用的证书格式,它通过一些标准的字段定义证书拥有者的信息
    实际上X.509是一个标准,它包含了很多版本,所以证书里一般会包含以下的信息:
    a.版本号
    b.拥有者公钥
    c.证书的序列号,同一个发布者范围内唯一的
    d.拥有者标识,这个标识是全世界唯一的
    e.证书的有效期
    f.发布者的数字签名
    g.签名算法的描述
    
    好吧,我们看一个证书的实例:
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number: 3 (0x3)
            Signature Algorithm: md5WithRSAEncryption
            Issuer: C=aa, ST=a, L=a, O=a, OU=a, CN=a/emailAddress=a
            Validity
                Not Before: Apr  2 03:19:08 2007 GMT
                Not After : Apr  1 03:19:08 2008 GMT
            Subject: C=ww, ST=ww, L=ww, O=ww, OU=ww, CN=ww/emailAddress=ww
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                RSA Public Key: (1024 bit)
                    Modulus (1024 bit):
                        00:b7:ab:b3:09:54:13:ee:45:79:a3:cb:2c:27:99:
                        1e:bd:a5:fc:fa:60:2b:de:9a:02:7e:53:84:2d:a3:
                        68:f5:01:63:5e:4f:40:82:dc:1d:1e:a3:da:88:e8:
                        88:20:f4:08:87:d1:a9:93:74:b7:0b:97:57:d5:c1:
                        98:c5:6f:70:c0:86:3d:13:b8:06:fa:53:25:68:96:
                        0a:14:be:c6:02:03:92:b5:a6:a2:79:00:da:65:c7:
                        0d:cf:45:c0:55:13:82:34:4f:84:c2:50:1f:70:77:
                        e8:fc:4d:23:08:57:e0:6e:df:c6:81:8a:02:82:01:
                        dc:76:01:63:fc:50:7d:93:dd
                    Exponent: 65537 (0x10001)
            X509v3 extensions:
                X509v3 Basic Constraints:
                    CA:FALSE
                Netscape Comment:
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier:
                    08:8F:93:DD:02:B6:9C:4D:92:6A:AA:84:C9:99:DB:87:2F:B6:6E:F6
                X509v3 Authority Key Identifier:
                    keyid:97:1D:AF:5B:52:7D:DA:08:D7:69:A8:B3:6B:47:FD:64:8F:D3:5B:4F
                    DirName:/C=aa/ST=a/L=a/O=a/OU=a/CN=a/emailAddress=a
                    serial:8D:5A:3D:1B:C3:7E:1B:6F
    
        Signature Algorithm: md5WithRSAEncryption
            a2:d7:91:f3:2e:4c:1c:40:51:f5:d2:59:ba:13:74:c7:0b:75:
            d7:91:d1:8c:05:c0:47:f5:9e:28:6a:48:a8:3c:1a:1a:22:df:
            f9:49:70:4a:d9:94:73:ca:08:0e:48:d9:a6:9c:b9:bd:50:0a:
            00:5e:40:29:a6:26:ce:f3:84:89:fe:ce:e2:a6:53:30:a8:41:
            1c:5f:0e:2b:49:38:25:2a:8c:c6:f4:85:e6:0f:92:9d:1e:6a:
            dd:11:74:fa:93:b7:14:eb:de:a2:7c:72:c5:d5:78:74:d7:89:
            f1:ab:fc:56:89:66:3a:b2:a5:36:25:47:95:82:10:3e:d7:ff:
            1d:bd
    -----BEGIN CERTIFICATE-----
    MIIDHjCCAoegAwIBAgIBAzANBgkqhkiG9w0BAQQFADBbMQswCQYDVQQGEwJhYTEK
    MAgGA1UECBMBYTEKMAgGA1UEBxMBYTEKMAgGA1UEChMBYTEKMAgGA1UECxMBYTEK
    MAgGA1UEAxMBYTEQMA4GCSqGSIb3DQEJARYBYTAeFw0wNzA0MDIwMzE5MDhaFw0w
    ODA0MDEwMzE5MDhaMGExCzAJBgNVBAYTAnd3MQswCQYDVQQIEwJ3dzELMAkGA1UE
    BxMCd3cxCzAJBgNVBAoTAnd3MQswCQYDVQQLEwJ3dzELMAkGA1UEAxMCd3cxETAP
    BgkqhkiG9w0BCQEWAnd3MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3q7MJ
    VBPuRXmjyywnmR69pfz6YCvemgJ+U4Qto2j1AWNeT0CC3B0eo9qI6Igg9AiH0amT
    dLcLl1fVwZjFb3DAhj0TuAb6UyVolgoUvsYCA5K1pqJ5ANplxw3PRcBVE4I0T4TC
    UB9wd+j8TSMIV+Bu38aBigKCAdx2AWP8UH2T3QIDAQABo4HrMIHoMAkGA1UdEwQC
    MAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRl
    MB0GA1UdDgQWBBQIj5PdAracTZJqqoTJmduHL7Zu9jCBjQYDVR0jBIGFMIGCgBSX
    Ha9bUn3aCNdpqLNrR/1kj9NbT6FfpF0wWzELMAkGA1UEBhMCYWExCjAIBgNVBAgT
    AWExCjAIBgNVBAcTAWExCjAIBgNVBAoTAWExCjAIBgNVBAsTAWExCjAIBgNVBAMT
    AWExEDAOBgkqhkiG9w0BCQEWAWGCCQCNWj0bw34bbzANBgkqhkiG9w0BAQQFAAOB
    gQCi15HzLkwcQFH10lm6E3THC3XXkdGMBcBH9Z4oakioPBoaIt/5SXBK2ZRzyggO
    SNmmnLm9UAoAXkAppibO84SJ/s7iplMwqEEcXw4rSTglKozG9IXmD5KdHmrdEXT6
    k7cU696ifHLF1Xh014nxq/xWiWY6sqU2JUeVghA+1/8dvQ==
    -----END CERTIFICATE-----
    
    现在我们已经知道了证书是什么样子的,现在我们来看看生成一个证书的主流程:
    我们使用openssl来生成需要的CA和证书(事实上SSL/X.509可以理解为一套机制,我们完全可以自己搭建基于这套机制的独立应用--自己同时充当CA、Client、Server的角色)
    (在openssl安装目录下一般会有一个CA.sh文件帮助创建CA和证书的(没有的话,可以在source里找到),不过为了更好地了解openssl,我们这里直接用openssl命令)
    
    openssl会使用openssl.cnf配置一些参数信息,在这个配置中默认的文件系统结构如下:
    demoCA/
       cacert.pem              - root certificate
       index.txt               - empty
       serial                  - text file containing "01"
       certs/                  - empty
       crl/                    - empty
       newcerts/               - empty
       private/cakey.pem       - private key
    如果通过CA.sh来产生证书的话,它会自动建立些文件夹和文件的,我们这里手工建好了。
    i)生成一个CA Cert 和CA Private Key,这些是用于发布新的证书的
      openssl req -new -x509 -keyout ./demoCA/private/cakey.pem 
            -out ./demoCA/cacert.pem -days 365
      按照提示输入响应的信息后我们自己的CA证书(cacert.pem)和private key(cakey.pem)就产生了。
      
    ii)生成一个新的证书请求,它是一个等待被CA签名的不完整的证书信息
       openssl req -new -keyout mycert.private -out mycert.pem -days 365
       
       对比i)的命令,它少了一个 -x509 参数,对应到配置文件中就决定了这个证书能否签名其他证书,
       也就是说它是否一个CA,能否成为CA只是-x509参数的其中一个作用而已,更详细的描述可以查看
       openssl的说明
       
    iii) 用CA签名mycert
        openssl ca -policy policy_anything -out mycert.cert -infiles mycert.pem
        
    当然在执行上面命令的时候都需要填写一些信息,这些信息中需要区分两种密码,一种是用于签名的时候必须填写的CA private key的密码,另一种是使用证书private key加密数据时候需要输入的证书private key的密码。
    
    好了,经过以上三步以后在当前目录下会有一下文件:
     mycert.cert-->新的证书, mycert.private---->证书的私钥
     ./demoCA/newcerts/**.pem----->也是新的证书它和mycert.cert是一样的,“**”表示有个唯一的标号(最大的那个),例如:“01”等

    至于多级证书的发布和一级证书的有点不一样,它生成的时候必须指定CA:True参数,详细的说明可以看openssl的说明。    
    
    有了证书后,下面我们看看在程序中是怎么使用的。
    
 3、pyOpenssl中证书的使用
    
    可以看到pyOpenssl非常易于使用(重要的还是理解SSL的架构和原理^_^),在初始化以后,剩下的就是普通的sock操作了。
    
    在pyOpenssl的源码包中还有其他证书的生成(在类的说明里,我没有发现可以直接生成带Phrase证书的方法,所以在使用时,我都是通过openssl命令直接生成证书的)、SecureXMLRPCServer等例子,如果原理比较清晰的话,那么代码是比较简单的^_^。

 
转自:http://happyiww.popo.blog.163.com/blog/static/92244832007324367178/