在IIS中发送Apple推送通知时遇凭证未识别错误求助
解决IIS环境下发送APN报"The credentials supplied to the package were not recognized"的问题
我之前处理过好几起类似的案例——控制台程序跑APN完全正常,一部署到IIS就报The credentials supplied to the package were not recognized,核心问题基本都出在IIS运行上下文和控制台的权限/环境差异上,哪怕你已经给了IIS_IUSRS权限,还有几个容易漏掉的细节:
证书文件/存储的权限与路径问题
- 控制台运行时用的是当前登录用户的上下文,如果你是用本地用户存储的证书,或者证书文件路径是相对路径,IIS进程根本访问不到。
- 如果用的是
.p12/.pem证书文件:- 一定要用绝对路径(比如
C:\Certificates\apn-cert.p12),别依赖相对路径——IIS的工作目录和控制台启动目录完全不同。 - 给你的IIS应用池标识账户(比如默认的
ApplicationPoolIdentity,或者你指定的自定义账户)直接添加这个证书文件的读取权限,别只给IIS_IUSRS组,有时候组权限继承会有问题。
- 一定要用绝对路径(比如
- 如果是把证书导入到Windows证书存储:
- 必须导入到本地计算机的「个人」存储,而不是当前用户的存储。
- 右键证书→「所有任务」→「管理私钥」,添加你的应用池账户(格式是
IIS AppPool\你的应用池名称),给它读取权限。
应用池标识的权限细节
- 很多人会给IIS_IUSRS权限,但如果你的应用池用的是默认的
ApplicationPoolIdentity,这个账户并不属于IIS_IUSRS组(或者说权限继承不生效),直接给这个特定的应用池账户分配权限才是最可靠的。 - 可以临时把应用池标识改成
LocalSystem测试(注意:这只是排查手段,别长期用,不安全),如果能正常发送APN,那就实锤是标识账户的权限问题,再改回原来的标识并补全对应权限。
- 很多人会给IIS_IUSRS权限,但如果你的应用池用的是默认的
PushSharp的配置适配
- 如果你用的是PushSharp旧版本,可能在IIS环境下有兼容性问题,建议升级到最新稳定版试试。
- 检查PushSharp的APN配置,确保证书存储位置设置正确:如果证书在本地计算机存储,要显式设置
StoreLocation = StoreLocation.LocalMachine,而不是默认的CurrentUser。
加密服务目录的权限
- 这个错误偶尔和Windows加密服务的存储目录权限有关,IIS进程需要访问
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys(存储证书私钥缓存的地方)。 - 打开这个目录的权限设置,添加你的应用池账户,给它读取和写入权限(写入权限是为了让系统缓存私钥,避免每次都重新读取)。
- 这个错误偶尔和Windows加密服务的存储目录权限有关,IIS进程需要访问
按照这个顺序排查,应该能解决大部分类似问题——毕竟控制台能跑就说明证书和代码逻辑没问题,就是IIS的运行环境没适配好。
内容的提问来源于stack exchange,提问作者Sean Forman
相关产品推荐
相关产品推荐

