Python Django-Apache:从x509客户端证书获取扩展密钥使用字段
我正在使用apache和mod_wsgi来运行一个django应用程序,该应用程序与客户端进行相互身份验证(SSL)。 我正在使用此配置获取证书公用名: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
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)