Django - Apache:从x509客户端证书获取扩展密钥使用字段

时间:2014-10-02 12:13:20

标签: python django ssl

我正在使用带有mod_wsgi的apache来运行与客户端进行相互身份验证(SSL)的django应用程序。  我使用此配置获取证书Common Name:

SSLUserName SSL_CLIENT_S_DN_CN
ServerAdmin webmaster@localhost
SSLOptions +StdEnvVars +ExportCertData

我已经在Django后端设置了选项,以便在不存在的用户使用其证书进行身份验证时显式创建用户。

class MyBacked(RemoteUserBackend):
     create_unknown_user = True

我现在想要扩展当前配置,让后端创建用户(如果不存在),并根据证书 扩展中的值将其添加到预先创建的组中密钥用法字段。

1 个答案:

答案 0 :(得分:0)

要在Python中获取SSL证书的密钥用法,请使用pyOpenSSL包。

这里是将证书加载到OpenSSL.crypto对象

的代码
c = OpenSSL.crypto 
st_cert = open(<Path to certificate>,'rt').read() #read certificate
cert = c.load_certificate(c.FILETYPE_PEM, st_cert) #load certificate
ext_cnt = cert.get_extension_count() #get no. of extensions
for index in range(0,ext_cnt):
    if cert.get_extension(index).get_short_name == 'keyUsage': #check if extension name is keyUsage
            keyVal = cert.get_extension(index).get_data() #get data associated with keyUsage extension
            break

这将返回十六进制值。 要查看关键用法扩展OID和语法是什么,请参阅:http://tools.ietf.org/html/rfc5280#appendix-A.1

十六进制值可以解释如下: 例如:03 02 05 A0

第四个八位位组是A0:1010 0000

第3个八位位组表示在第4个八位位组中从右侧消除多少位

结果是:101

由于最后一位为1,表示它与DER规则兼容。

101表示:已设置数字签名和密钥加密。

  • digitalSignature(0),

    nonRepudiation(1), - X.509的最新版本                                 - 将此位重命名为contentCommitment

    keyEncipherment(2),

    dataEncipherment(3),

    keyAgreement(4),

    keyCertSign(5),

    cRLSign(6),

    encipherOnly(7),

    decipherOnly(8)