使用requests库进行HTTPS CredSSP身份验证。
项目描述
requests-credssp
关于这个库
此软件包允许使用requests库进行HTTPS CredSSP身份验证。CredSSP是微软的身份验证,允许将您的凭据委派给服务器,从而为您提供双跳身份验证。
功能
此库支持以下CredSSP功能
- 协议版本2到6
- 使用NTLM或Kerberos进行初始身份验证
- 使用
wrap
和unwrap
函数支持消息加密
要求
以下Python库是必需的;
- Python 3.6+
- cryptography
- pyspnego
- requests>=2.0.0
- 在Unix上使用Kerberos身份验证时,请安装python-gssapi和pykrb5,并使用
requests-credssp[kerberos]
安装。
默认情况下,此库可以使用NTLM消息与Windows主机进行身份验证,如果需要Kerberos身份验证,请阅读以下内容。
安装
要安装requests-credssp,只需运行
pip install requests-credssp
# to install the optional Kerberos functionality, run (see below)
pip install requests-credssp[kerberos]
Linux上的Kerberos
要在非Windows主机上添加对Kerberos身份验证的支持,必须安装Kerberos系统头文件和python-gssapi
库。要安装Kerberos系统头文件,您可以安装以下软件包;
# Via Yum (Centos RHEL)
yum -y install python-devel krb5-devel krb5-libs krb5-workstation
# Via Dnf (Fedora)
dnf -y install python-devel krb5-devel krb5-libs krb5-workstation
# Via Apt (Ubuntu)
apt-get -y install python-dev libkrb5-dev krb5-user
# Via Portage (Gentoo)
emerge -av app-crypt/mit-krb5
emerge -av dev-python/setuptools
# Via pkg (FreeBSD)
sudo pkg install security/krb5
# Via OpenCSW (Solaris)
pkgadd -d http://get.opencsw.org/now
/opt/csw/bin/pkgutil -U
/opt/csw/bin/pkgutil -y -i libkrb5_3
# Via Pacman (Arch Linux)
pacman -S krb5
安装完成后,可以使用以下命令安装Python Kerberos库;
pip install requests-credssp[kerberos]
安装完成后,应该配置/etc/krb5.conf
文件,以便它可以与Kerberos KDC通信。
为了添加对python-gssapi
的适当SPNEGO支持,还需要安装gss-ntlmssp,它将NTLM添加为支持的GSSAPI机制,这对于与Windows进行适当的SPNEGO互操作性是必需的。此软件包可以按以下方式安装;
# Via Yum (Centos RHEL) - requires epel-release
yum -y install epel-release
yum -y install gssntlmssp
# Via Dnf (Fedora)
dnf -y install gssntlmssp
# Via Apt (Ubuntu)
apt-get -y install gss-ntlmssp
# Via Pacman (Arch Linux)
pacman -S gss-ntlmssp
附加信息
CredSSP协议相当复杂,并且使用了许多其他协议或标准才能正常工作。不幸的是,这意味着一些较旧的宿主或设置可能不兼容或需要一些解决方案才能工作。目前,在初始化CredSSP类时,您可以配置以下设置;
auth_mechanism
:最初要使用的身份验证机制,默认为auto
disable_tlsv1_2
:是否禁用TLSv1.2
支持,并使用较旧的协议,如TLSv1.0
,默认为False
minimum_version
:客户端所需的最小CredSSP服务器版本,默认为2
身份验证机制
CredSSP协议的一部分是使用SPNEGO协议对用户的凭据进行身份验证。SPNEGO协议也称为Negotiate
,能够协商客户端和服务器之间的通用协议,目前可以是NTLM
或Kerberos
。Kerberos协议设置比较复杂,但只要可能,就应该使用它,因为NTLM使用的是较旧的标准,从安全角度来看被认为是已损坏的。
由于历史决策以及Kerberos并非始终默认可用,requests-credssp
的基础安装将仅与NTLM
一起工作。当安装并配置了Kerberos软件包时,requests-credssp
将自动尝试使用Kerberos
(如果可能),如果失败,则回退到NTLM
,就像在SPNEGO
中一样。如果您想强制使用Kerberos
或NTLM
而不是依赖SPNEGO
机制,您可以在创建HttpCredSSPAuth
时设置auth_mechanism=<auth_mech>
,如下所示;
import requests
from requests_credssp import HttpCredSSPAuth
# use SPNEGO (default if omitted)
credssp_auth = HttpCredSSPAuth('domain\\user', 'password',
auth_mechanism='auto')
# only allow Kerberos
credssp_auth = HttpCredSSPAuth('user@REALM.COM', 'password',
auth_mechanism='kerberos')
# only allow NTLM
credssp_auth = HttpCredSSPAuth('domain\\user', 'password',
auth_mechanism='ntlm')
r = requests.get("https://server:5986/wsman", auth=credssp_auth)
TLS协议版本
由于CredSSP使用TLS加密客户端和服务器之间传输的令牌,因此它容易受到SSL不同实现的影响。默认情况下,requests-credssp
将与提供TLSv1.2的服务器一起工作,但较旧的Windows宿主不支持此较新版本的协议将
TLSv1.2是在Windows Server 2012和Windows 8中添加的,较旧的宿主需要安装可选更新才能使用。如果无法安装此更新或您愿意接受使用较旧TLS协议的风险,则可以将requests-credssp
设置为禁用TLSv1.2,并按如下方式使用较旧的协议;
import requests
from requests_credssp import HttpCredSSPAuth
credssp_auth = HttpCredSSPAuth('domain\\user', 'password', disable_tlsv1_2=True)
r = requests.get("https://server:5986/wsman", auth=credssp_auth)
CredSSP协议版本
最近,微软发布了针对CredSSP的安全更新,以缓解CVE 2018-0886漏洞。该更新添加了2个新的CredSSP协议版本,即5
和6
,这改变了客户端和服务器相互验证的方式。虽然这些更改对使用此库的人来说是透明的,但设置此客户端将进行验证的最小版本可能是谨慎的。这意味着任何未修补此漏洞的旧服务器都将被拒绝。
要设置仅允许修补了CVE 2018-0886
的服务器使用的最小协议版本,在创建HttpCredSSPAuth
时设置minimum_version=5
,如下所示;
import requests
from requests_credssp import HttpCredSSPAuth
credssp_auth = HttpCredSSPAuth('domain\\user', 'password', minimum_version=5)
r = requests.get("https://server:5986/wsman", auth=credssp_auth)
消息加密
您可以使用此库加密和解密发送到服务器以及从服务器接收的消息。消息加密是在认证阶段协商的TLS通道上完成的。下面是加密和解密消息的示例,请注意,这只是一个基本示例,不是可运行的脚本,实际实现取决于读取消息的协议。
import requests
from requests_credssp import HttpCredSSPAuth
# build the auth request and sent an empty message to authenticate
hostname = "server"
session = requests.Session()
session.auth = HttpCredSSPAuth('domain\\user', 'password')
request = requests.Request('POST', "https://%s:5986/wsman" % server, data=None)
prepared_request = self.session.prepare_request(request)
response = session.send(prepared_request)
context = session.auth.contexts[hostname]
# encrypt the message using the wrap command
message = b'hi server'
encrypted_message = context.wrap(message)
# send the encrypted message and get the encrypted response
request = requests.Request('POST', 'https://server:5986/wsman', data=encrypted_message)
prepared_request = self.session.prepare_request(request)
response = session.send(prepared_request)
# decrypt the encrypted response from the server
encrypted_response = response.content
decrypted_response = context.unwrap(encrypted_response)
日志记录
此库使用标准的Python日志功能。日志消息记录到requests_credssp
和requests_credssp.credssp
命名记录器。
如果您收到任何错误或希望调试CredSSP进程,应启用DEBUG级别的日志。这些日志显示细粒度信息,例如协商的协议和加密算法以及认证过程中使用的每个CredSSP令牌。
队列
- 添加对不同凭证类型(如智能卡和重定向凭证)的支持
项目详情
下载文件
下载适合您平台的自定义文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。
源分发
构建分发
requests-credssp-2.0.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 229afe2f6e1c9fabef64fc2bdf2a10e794ca6c4a0c00a687d53fbfaf7b8ee71d |
|
MD5 | c6bf9dfb8f54d8615acaddd7a01919ff |
|
BLAKE2b-256 | bcc3de13b8598287440ab1df7eba97b93278d309dffb920f0163a09e089b71ec |
requests_credssp-2.0.0-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 47c8b250eef663f9b55af179f341e823f1f7f63b8b2b9037063e641a2df4bfa3 |
|
MD5 | 7ab42daa623b32c24cba973732f4f2f1 |
|
BLAKE2b-256 | 8b8d0330147347692deb564cbd72c7cc3aae3b4be148c5d521a1445c096c35cb |