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/
呵呵,基础知识普及^_^
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/