You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python结合CAC/PIV证书对接SharePoint(无需Azure)

使用CAC/PIV证书访问SharePoint(无需Azure)及代码修改方案

一、无需Azure能否用CAC/PIV证书访问SharePoint?

可以。CAC/PIV证书属于基于X.509的客户端证书认证,多数企业部署的SharePoint环境(包括本地/混合部署的SharePoint Server,以及配置了本地证书信任的SharePoint Online)直接支持这种认证方式,无需依赖Azure AD。前提是你的组织已将CAC/PIV证书纳入SharePoint信任体系,且证书包含有效的用户身份信息。

二、修改现有代码适配证书认证

原代码采用用户名密码认证,需替换为证书认证逻辑,具体步骤如下:

1. 更新依赖库

确保office365-python-client版本足够新(建议v2.5+),执行以下命令更新:

pip install --upgrade office365-python-client

2. 替换认证逻辑

移除原用户名密码认证代码,改用用户证书认证适配CAC/PIV场景。需准备你的CAC/PIV证书文件(通常为.pfx格式,若证书设了密码需一并准备)。

修改后的完整代码:

from office365.sharepoint.client_context import ClientContext
from office365.runtime.auth.user_certificate_credential import UserCertificateCredential

#### 配置参数 ####
# SharePoint站点URL
url_shrpt = 'https://YourOrganisation.sharepoint.com/sites/YourSharepointSiteName'
# CAC/PIV证书文件路径(.pfx格式)
cert_path = '/path/to/your/cac_piv_certificate.pfx'
# 证书密码(若证书未设密码可留空)
cert_password = 'YourCertificatePassword'
# 目标文件夹URL
folder_url_shrpt = '/sites/YourSharepointSiteName/Shared%20Documents/YourSharepointFolderName/'
##################

### 证书认证流程 ###
try:
    # 初始化用户证书凭证(适配CAC/PIV这类绑定用户身份的证书)
    creds = UserCertificateCredential(cert_path, cert_password)
    # 创建SharePoint客户端上下文
    ctx = ClientContext(url_shrpt).with_credentials(creds)
    
    # 验证认证结果
    web = ctx.web
    ctx.load(web)
    ctx.execute_query()
    print('已成功认证到SharePoint站点:', web.properties['Title'])

except Exception as e:
    print('认证失败:', str(e))

3. 特殊场景适配(智能卡存储证书)

若CAC/PIV证书存储在智能卡中,需借助pkcs11库读取智能卡内的证书和私钥,示例代码如下:

import pkcs11
from office365.sharepoint.client_context import ClientContext
from office365.runtime.auth.user_certificate_credential import UserCertificateCredential

#### 配置参数 ####
url_shrpt = 'https://YourOrganisation.sharepoint.com/sites/YourSharepointSiteName'
# PKCS11库路径(根据操作系统和读卡器型号调整)
pkcs11_lib_path = '/path/to/pkcs11/library.so'
# 智能卡令牌标签
token_label = 'YourSmartCardTokenLabel'
# 智能卡PIN码
smart_card_pin = 'YourSmartCardPIN'
##################

try:
    # 初始化PKCS11会话
    lib = pkcs11.lib(pkcs11_lib_path)
    token = lib.get_token(token_label=token_label)
    with token.open(user_pin=smart_card_pin) as session:
        # 读取智能卡中的证书和私钥
        cert = next(session.get_objects({pkcs11.Attribute.CLASS: pkcs11.ObjectClass.CERTIFICATE}))
        private_key = next(session.get_objects({pkcs11.Attribute.CLASS: pkcs11.ObjectClass.PRIVATE_KEY}))
        
        # 创建凭证并初始化上下文
        creds = UserCertificateCredential(cert, private_key)
        ctx = ClientContext(url_shrpt).with_credentials(creds)
        
        # 验证认证
        web = ctx.web
        ctx.load(web)
        ctx.execute_query()
        print('已成功通过智能卡认证:', web.properties['Title'])

except Exception as e:
    print('认证失败:', str(e))

注意事项

  • 需确认CAC/PIV证书已被SharePoint环境信任,且证书主体信息与SharePoint内的用户账户匹配。
  • 若为SharePoint Online环境,部分组织可能要求通过Azure AD做证书中转信任,但核心认证逻辑仍可参考上述代码调整。

内容的提问来源于stack exchange,提问作者Liffi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:42:49