python编写的windows X509根证书管理器(python调用.net dll的操作案例)

最近发现了Pythonnet这个神奇的库,可以直接调用由.net编写的dll(ctypes只能调c/c++编写的dll)

本文是一个python调用.net dll的简单实践

Pythonnet官网:http://pythonnet.github.io/

使用前先通过pip安装:

pip install pythonnet

主要使用clrAddReference来添加对.net dll文件的引用,十分方便,请看我编写的这个实例:


  • 有时候需要在自己电脑上安装X509根证书进行测试,这个python根证书管理器可以方便的进行管理。
  • 主要使用了System.Security.dll (一般系统会自带,可以直接引用)中的Cryptography.X509Certificates 模块
  • 微软的官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography.x509certificates

使用方法:

# 初始化
cm = CertManager('你的crt证书文件路径', '你的crt证书颁发者名称')
cm.cert_status() # 检测证书是否安装了
cm.add_cert() # 安装根证书(安装时会有一个弹框,请注意)
cm.remove() # 删除根证书(删除时会有一个弹框,请注意)

测试截图:
python编写的windows X509根证书管理器(python调用.net dll的操作案例)_第1张图片
python编写的windows X509根证书管理器(python调用.net dll的操作案例)_第2张图片
python编写的windows X509根证书管理器(python调用.net dll的操作案例)_第3张图片

接下来是代码:


# -*- coding: utf-8 -*-
"""
@author: PurePeace
"""

from clr import AddReference # 这里的cls就是Pythonnet了

class CertManager:
    def __init__(self, crt_file_path, subject_name):
	    '''
	    crt_file_path: crt证书路径
	    subject_name: 颁发者名字
	    '''
        print('初始化证书管理器...')
        try:
            self.cert_file = crt_file_path
            self.subject_name = subject_name
            AddReference("System.Security.Cryptography.X509Certificates")
            from System.Security.Cryptography.X509Certificates import (
                StoreName,
                StoreLocation,
                OpenFlags,
                X509Store,
                X509FindType,
                X509Certificate2
            )
            self.OpenFlags = OpenFlags
            self.X509Certificate2 = X509Certificate2
            self.X509FindType = X509FindType
            self.store = X509Store(StoreName.Root, StoreLocation.CurrentUser)
            print('证书管理器初始化完毕!')
        except Exception as err:
            print(f'证书管理器初始化失败,错误:{err}')


    def add_cert(self):
        print('正在安装证书...')
        try:
            self.store.Open(self.OpenFlags.ReadWrite)
            cert = self.X509Certificate2(self.cert_file)
            print(f'安装证书:{cert.Subject}')
            self.store.Add(cert)
            self.store.Close()
            return True
        except Exception as err:
            print(f'证书安装失败:{err}')
            self.store.Close()
            return False
    
    
    def remove_cert(self):
        print('正在移除证书...')
        done = 0
        try:
            self.store.Open(self.OpenFlags.ReadWrite)
            certificates = self.store.Certificates.Find(self.X509FindType.FindBySubjectName, self.subject_name, True)
            for cert in certificates:
                print(f'找到证书:{cert}\n尝试删除...')
                self.store.Remove(cert)
                done += 1
            self.store.Close()
            print(f'处理完毕,共移除证书{done}张!')
            return True
        except Exception as err:
            print(f'删除证书时出现错误:{err},处理完成数量:{done}')
            self.store.Close()
            return False

    
    def cert_status(self):
        print('正在查询证书安装情况...')
        try:
            self.store.Open(self.OpenFlags.ReadOnly)
            certificates = self.store.Certificates.Find(self.X509FindType.FindBySubjectName, self.subject_name, True)
            self.store.Close()
            if len([i for i in certificates]) > 0:
                print('证书已安装!')
                return True
            print('证书未安装!')
            return False
        except Exception as err:
            print(f'查询证书安装状态时失败:{err}')
            return False
        

if __name__ == '__main__':
    cm = CertManager('你的crt证书文件路径', '你的crt证书颁发者名称')
    cm.cert_status() # 检测证书是否安装了
	cm.add_cert() # 安装根证书(安装时会有一个弹框,请注意)
	cm.remove() # 删除根证书(删除时会有一个弹框,请注意)


结束

你可能感兴趣的:(python,教程,windows)