CredStore执行查询错误


109

我在对应用后端进行API调用时遇到问题,现在每个连接都会提示

CredStore - performQuery - Error copying matching creds.  Error=-25300, query={
    atyp = http;
    class = inet;
    "m_Limit" = "m_LimitAll";
    ptcl = http;
    "r_Attributes" = 1;
    srvr = "myappsurl.com";
    sync = syna;
}

我有点不知所措,因为我不确定是什么原因导致的,甚至是CredStore造成的。CredStore在iOS中有什么用途?


我在使用iOS 11 + Xcode beta 6的模拟器中拥有相同的日志。我希望这仅仅是因为beta
nacho4d

您是否从未找到解决方案?
swalkner

@swalkner尚未,仍在尝试查找更多信息。
安东尼·泰勒

我也有同样的问题。任何新闻?
亚历山大·佩列克涅夫

您正在播放视频吗?
丹尼尔·斯托姆

Answers:


34

试图检索时会出现此错误URLCredentialURLCredentialStorage未知URLProtectionSpace。例如

let protectionSpace = URLProtectionSpace.init(host: host, 
                                              port: port, 
                                              protocol: "http", 
                                              realm: nil, 
                                              authenticationMethod: nil)

var credential: URLCredential? = URLCredentialStorage.shared.defaultCredential(for: protectionSpace)

产生

CredStore - performQuery - Error copying matching creds.  Error=-25300, query={
    class = inet;
    "m_Limit" = "m_LimitAll";
    ptcl = http;
    "r_Attributes" = 1;
    srvr = host;
    sync = syna;
}

给它一个保护空间的凭证:

let userCredential = URLCredential(user: user, 
                                   password: password, 
                                   persistence: .permanent)

URLCredentialStorage.shared.setDefaultCredential(userCredential, for: protectionSpace)

并且下次您尝试检索证书时错误消失了。

我有点不知所措,因为我不确定是什么原因导致的,甚至是CredStore造成的。CredStore在iOS中有什么用途?

iOS上的凭证存储使用户可以将基于证书或基于密码的凭证安全地临时或永久地存储在设备上。

我怀疑您在后端服务器上进行了某种身份验证,并且该服务器正在向您的应用程序请求身份验证挑战(不存在任何凭据)。

可以安全地忽略它,因为从中返回nil URLCredentialStorage是有效的响应


2
您将如何创建保护空间?
汤姆·福克斯

@Brett您能提供有关protectionSpace的信息吗?
帕夫洛斯

2
如何在Moya和Alamofire中使用?
索尼

1
使用alamofire时,我也有这个问题stackoverflow.com/questions/50342214/...,我不知道在哪里把userCredential在Alamofire :(
Alexa289

1
@Brett,当通过AFNetwrking调用Twilio API时,我也面临这个问题。有什么建议,要查找哪些内容才能解决AFNetworking问题?
Sunita '18

8

我不确定在使用Alamofire执行请求时为什么会出现此错误,但是如果您使用HTTP标头中的某些令牌进行API请求,则可能根本不需要凭证存储。因此,我们可以为我们的请求禁用它:

let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = ourHeaders
// disable default credential store
configuration.urlCredentialStorage = nil

let manager = Alamofire.SessionManager(configuration: configuration)
...

更改后没有错误。


4

这是传输错误,让我们在plist文件中添加如下传输权限:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

请注意,因为这会导致从您的应用程序连接到任何服务器。在继续之前,请阅读有关App Transport Security的更多信息。查看@kezi的评论


我不知道为什么这会被否决,这种解决方案对我有帮助!我通过FRadioPlayer 遇到
caffeinum,

8
@caffeinum因为这样会删除所有安全性。这不是软件方面的错误。这是为了保护您的应用程序而添加的。这个答案什么也没有说,也不意味着任意负载意味着什么。
凯吉(Keji)

Apple的应用程序审查可能会对此进行标记,并且将询问您为什么您的应用程序需要连接到任意主机。如果他们不喜欢您的答案,他们可能会拒绝该应用程序。最好为您要连接的特定主机名添加一个密钥。
詹斯·阿尔夫克

4

我遇到了同样的问题,我发现如果您的API URL的URL末尾不包含“ /”,则iOS不会将“授权”值发送到服务器。因此,您将在控制台中看到类似问题的消息。

因此,只需在网址末尾添加“ /”

https://example.com/api/devices/

2

我编辑了包含URL的字符串来解决此问题:

var myUrl = "http://myurl.com"
myUrl = myUrl.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed)!

let url = URL(string: myUrl)


2

我收到此错误的原因是由于我不小心在授权标头中的“承载者”和访问令牌之间使用了两个空格。

不正确:

request.setValue("Bearer  \(accessToken)", forHTTPHeaderField: "Authorization")

正确:

request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")

简单的错误,但是花了一段时间才找到。


2

就我而言,我没有使用API​​密钥初始化Stripe SDK。

        STPPaymentConfiguration.shared().publishableKey = publishableKey

如果进行任何Stripe操作,我们可以打印错误日志,它很容易理解。

        print(error.debugDescription)

1

好的,我遇到了这个错误,并且在与我的Ruby on Rails应用程序进行交互时已经花了很长时间(多年)。

我已经按照接受的答案中的说明设置了默认凭据,但是仍然出现错误,并且一直依靠didReceiveChallenge响应来提供凭据-幸运的是,这种方法可以解决。

但!我刚刚找到了解决方案!

我当时的直觉是,protectedSpace字段与Ruby on Rails服务器的Authorization挑战不匹配-我调查了realm字段,这似乎是唯一未定义的字段。

我首先打印出服务器响应标头,尽管我能够检查这些标头,但它们不包括本应包含领域字段的WWW-Authorization字段。

我以为这可能是因为我的Rails应用未指定领域,所以我开始着眼于Rails方面。

我发现我可以在调用中指定领域,

authenticate_or_request_with_http_basic

...我正在使用它进行HTTP基本身份验证。

我尚未指定领域,所以添加了一个领域,

authenticate_or_request_with_http_basic("My Rails App")

然后,我将相应的字符串添加到protectionSpace中,

NSURLProtectionSpace *protectionSpace =
    [[NSURLProtectionSpace alloc] initWithHost:@"myrailsapp.com"
        port:443
        protocol:NSURLProtectionSpaceHTTPS
        realm:@"My Rails App"
        authenticationMethod:NSURLAuthenticationMethodHTTPBasic];

瞧!那行得通,我再也听不到了,

CredStore - performQuery - Error copying matching creds.  Error=-25300

即使在Rails应用程序中指定了领域之后,我仍然看不到它在HTTP标头中传递,我也不知道为什么,但是至少它可以工作。


1
很高兴找到您的答案,这真让我感到震惊。
ggrana

0

该错误也可能是因为内容安全策略(CSP)的限制过于严格。就我们而言,我们需要一个或多或少完全开放并允许所有功能的CSP。请记住,打开CSP可能是一个很大的安全问题(取决于您在应用程序中到底在做什么)。



-1
    let credentialData = "\(user):\(password)".data(using: String.Encoding.utf8)!
    let base64Credentials = credentialData.base64EncodedString(options: [])
    let headers = ["Authorization": "Basic \(base64Credentials)"]
    Alamofire.request(url, method: .get, parameters: params,encoding: URLEncoding.default,headers: headers)
                .responseJSON{
            response in
            guard let value =  response.result.value else {return}
                    print(value)
     }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.