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

Python Django-Apache:从x509客户端证书获取扩展密钥使用字段,python,django,ssl,Python,Django,Ssl,我正在使用apache和mod_wsgi来运行一个django应用程序,该应用程序与客户端进行相互身份验证(SSL)。 我正在使用此配置获取证书公用名: SSLUserName SSL_CLIENT_S_DN_CN ServerAdmin webmaster@localhost SSLOptions +StdEnvVars +ExportCertData 我在Django后端设置了一个选项,当一个不存在的用户使用他的证书进行身份验证时,显式地创建该用户 class MyBacked(Remot

我正在使用apache和mod_wsgi来运行一个django应用程序,该应用程序与客户端进行相互身份验证(SSL)。 我正在使用此配置获取证书公用名:

SSLUserName SSL_CLIENT_S_DN_CN
ServerAdmin webmaster@localhost
SSLOptions +StdEnvVars +ExportCertData
我在Django后端设置了一个选项,当一个不存在的用户使用他的证书进行身份验证时,显式地创建该用户

class MyBacked(RemoteUserBackend):
     create_unknown_user = True
现在,我想扩展当前配置,以允许后端在用户不存在时创建该用户,并根据证书扩展密钥使用字段中的值将其添加到预创建的组中。

要获取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
c=OpenSSL.crypto
st#u cert=打开(,'rt')。读取()#读取证书
证书=c.load_证书(c.FILETYPE_PEM,st_证书)#加载证书
ext_cnt=cert.get_extension_count()#获取扩展数
对于范围(0,外部)中的索引:
if cert.get_扩展名(index.get_short_name=='keyusause':#检查扩展名是否为keyusause
keyVal=cert.get_扩展名(index).get_数据()#获取与keyUsage扩展名关联的数据
打破
这将返回一个十六进制值。 要检查什么是关键用法扩展OID和语法,请参阅:

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

第四个八位组是A0:1010 0000

第三个八位字节表示第四个八位字节中要从右侧消除多少位

结果是:101

由于最后一位是1,因此表示它与DER规则兼容

101表示:设置了数字签名和密钥加密。
  • 数字签名(0)

    不可否认性(1)——X.509的最新版本 --将此位重命名为contentCommitment

    密钥加密(2)

    数据加密(3)

    关键协议(4)

    钥匙号(5)

    cRLSign(6)

    仅加密(7)

    仅解密(8)


小诡辩:这个答案是针对“keyUsage”,问题是关于“extendedKeyUsage”。第一部分基本上是相同的-除了与扩展名短名称进行比较的字符串。