调用WSDL服务时反复出现消息安全验证错误求因
调用WSDL服务时遭遇"验证消息安全性时出错"的问题排查
我尝试用Zeep调用WSDL服务获取信息,但反复收到错误提示:An error occurred when verifying security for the message.(中文:验证消息安全性时发生错误),想了解该报错的原因。以下是我的代码及报错堆栈信息:
from zeep import Client import certifi import os import xlrd import arcpy from zeep import helpers import pandas as pd import logging import warnings from requests import Session from requests.auth import HTTPBasicAuth from zeep.transports import Transport import requests from zeep.wsse.username import UsernameToken from zeep.wsse.signature import Signature wsdl = "https://kpsv2.saglik.gov.tr/?wsdl&service=kpsServices&isTest=true" session = Session() session.verify = certifi.where() #session.auth = HTTPBasicAuth(nvi_id,nvi_pw) client = Client(wsdl, transport=Transport(session=session)) client.service.YetkiListesi()
报错信息:
Fault Traceback (most recent call last) In [5]: Line 1: client.service.YetkiListesi() File C:\Program Files\ArcGIS\Server\framework\runtime\ArcGIS\bin\Python\envs\mersinOrtami\lib\site-packages\zeep\proxy.py, in __call__: Line 51: kwargs, File C:\Program Files\ArcGIS\Server\framework\runtime\ArcGIS\bin\Python\envs\mersinOrtami\lib\site-packages\zeep\wsdl\bindings\soap.py, in send: Line 135: return self.process_reply(client, operation_obj, response) File C:\Program Files\ArcGIS\Server\framework\runtime\ArcGIS\bin\Python\envs\mersinOrtami\lib\site-packages\zeep\wsdl\bindings\soap.py, in process_reply: Line 229: return self.process_error(doc, operation) File C:\Program Files\ArcGIS\Server\framework\runtime\ArcGIS\bin\Python\envs\mersinOrtami\lib\site-packages\zeep\wsdl\bindings\soap.py, in process_error: Line 396: subcodes=subcodes, Fault: An error occurred when verifying security for the message.
报错原因分析
这个错误是WSDL服务的安全验证未通过导致的,结合代码和目标服务(土耳其KPSV2政务身份验证服务)的特性,主要原因包括:
- 未启用身份验证:代码中注释掉了
HTTPBasicAuth的配置,而该服务要求使用NVI账号密码进行身份验证,缺失这一步会导致服务端无法识别请求合法性。 - 未配置WSSE安全头:从导入的
UsernameToken和Signature可以看出,该服务大概率要求WSSE(Web Services Security)格式的安全凭证,当前Client初始化未添加相关配置,请求缺少必要的安全标识。 - 权限或凭证无效:即使配置了验证方式,如果使用的测试账号密码无效,或者账号没有
YetkiListesi接口的调用权限,也会触发安全验证失败。
修复建议
- 启用HTTP Basic认证:取消注释
session.auth = HTTPBasicAuth(nvi_id,nvi_pw),确保nvi_id和nvi_pw是测试环境的有效账号密码。 - 添加WSSE安全头:初始化Client时传入WSSE凭证,示例代码:
client = Client( wsdl, transport=Transport(session=session), wsse=UsernameToken(nvi_id, nvi_pw) )
若服务要求证书签名,需补充配置Signature:
wsse = Signature( private_key_filename="你的私钥文件路径.pem", certificate_filename="你的证书文件路径.pem" ) client = Client(wsdl, transport=Transport(session=session), wsse=wsse)
- 确认账号权限:联系服务提供方确认测试账号是否拥有
YetkiListesi接口的调用权限。
内容的提问来源于stack exchange,提问作者Fatih Enes
相关产品推荐
相关产品推荐

