我正在使用带有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
我现在想要扩展当前配置,让后端创建用户(如果不存在),并根据证书 扩展中的值将其添加到预先创建的组中密钥用法字段。
答案 0 :(得分:0)
这里是将证书加载到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规则兼容。
digitalSignature(0),
nonRepudiation(1), - X.509的最新版本 - 将此位重命名为contentCommitment
keyEncipherment(2),
dataEncipherment(3),
keyAgreement(4),
keyCertSign(5),
cRLSign(6),
encipherOnly(7),
decipherOnly(8)