尝试使用 MongoDB 从解析服务器中保存或检索数据时出现“服务器在没有 SSL 支持的情况下启动”错误

Posted

技术标签:

【中文标题】尝试使用 MongoDB 从解析服务器中保存或检索数据时出现“服务器在没有 SSL 支持的情况下启动”错误【英文标题】:"Server is started without SSL support" error when trying to save or retrieve data from parse server with MongoDB 【发布时间】:2019-02-08 00:18:05 【问题描述】:

我正在尝试在我的 ios 移动应用程序中使用本地解析(使用 MongoDB)。 我已经安装了节点、mongo、解析、解析仪表板。我为我的 iOS 项目(XCode)创建了一个 pod 文件,并使用它安装了 parse。我把这段代码放到了 AppDelegate 的应用程序 didFinishLaunchingWithOptions 方法中:

import Parse

Parse.enableLocalDatastore()
        
        let parseConfig = ParseClientConfiguration 
            $0.applicationId = "XXXXXXXXXX"
            $0.clientKey = "YYYYYY"
            $0.server = "http://(IP addr):(port)/parse"
        
        Parse.initialize(with: parseConfig)

我正在从终端启动 mongoDB 并且

解析服务器也来自终端:

--appId “XXXXXXXXXX” --clientKey "YYYYYY" --masterKey “ZZZZ” --databaseURI mongodb://localhost/parse

在我的 XCode 应用程序的 viewController 的 viewDidLoad 方法中,我输入了以下代码:

      import Parse
      
      let gameScore = PFObject(className:"GameScore")
        gameScore["score"] = 1337
        gameScore["playerName"] = "Sean Plott"
        gameScore["cheatMode"] = false
        gameScore.saveInBackground 
            (success: Bool, error: Error?) in
            if (success) 

             else 
                print("saveInBackground error: ", error!)
            
        

当我运行我的 XCode swift 应用程序时,我收到了这个错误:

[Error]: unauthorized (Code: 0, Version: 1.17.2)
error:  Error Domain=Parse Code=0 "unauthorized" UserInfo=error=unauthorized, NSLocalizedDescription=unauthorized, temporary=0

此错误来自 saveInBackground Parse 方法。我也尝试从解析服务器检索数据而不是保存,我得到了同样的错误:

let query = PFQuery(className:"GameScore")
        query.whereKey("playerName", equalTo: "Michael Yabuti")
        do 
            let scoreArray = try query.findObjects()
            print(scoreArray)
        
        catch 
            print("findObjects error: ", error)
        

从我的解析仪表板中,我可以看到服务器正在运行,但我的移动应用程序没有保存任何数据

我从来没有做过这样的事情,请有人给我一些指示可能是什么问题。任何帮助将不胜感激

MongoDB 给了我这个错误:

AssertionException handling request, closing client connection: xxx SSL handshake received but server is started without SSL support
2019-02-13... I NETWORK  [initandlisten] connection accepted from x.x.x.x:yyyy

【问题讨论】:

您是否使用解析服务器验证了您的客户端密钥? 在本地执行npm start时是否遇到任何错误? @CodeChanger,感谢您的帮助 :) 我没有使用 npm start 来启动解析服务器。您可以在我的问题中找到我用来启动解析服务器的命令:“--appId “XXXXXXXXXX”--clientKey “YYYYYY”--masterKey “ZZZZ”--databaseURI mongodb://localhost/parse” 这就是我开始的方式解析服务器:我 cd 进入节点模块的解析服务器文件夹并从那里运行此命令。之后,我用解析服务器仪表板检查它,它工作正常,解析服务器正在运行,它是可访问的。是的,我使用 clientID 启动解析服务器。 对不起,我不得不在上面使用一些大写字母来使我的信息更容易阅读......因为 *** 不允许我们输入我们的信息:( 当我启动解析服务器和解析仪表板时,我没有收到任何错误,一切似乎都是正确的。即使在启动 MongoDB(首先我启动它)之后,我也没有收到任何错误,只有当我运行我的 XCode 项目时 【参考方案1】:

根据错误消息,我假设您必须在 mongod 上启用 SSL。这可以在启动时使用以下参数完成:--sslMode requireSSL。执行此操作时,您必须提供带有 --sslPEMKeyFile 的 pem 文件或带有 --sslCertificateSelector 的证书选择器

pem 文件更容易设置。为此,请执行以下操作:

// Create a crt and key file
openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
// concat both files to get a pem file
cat mongodb-cert.key mongodb-cert.crt > mongodb.pem

现在您可以使用 SSL 支持启动 mongod:

mongod --sslMode requireSSL --sslPEMKeyFile mongodb.pem <plus any other options>

如何使用SSL配置mongodb在官方教程中有说明:https://docs.mongodb.com/manual/tutorial/configure-ssl/

【讨论】:

谢谢@mbuechmann 我试过了,当我在我的 Mac 上运行终端命令时,一切顺利,没有错误 - 你写道。但是,当我开始我的 XCode 项目时,我遇到了与之前类似的错误:nw_socket_handle_socket_event [C1.1:2] Socket SO_ERROR [61: Connection refused] [Error]: authorized (Code: 0, Version: 1.17.2) Error Domain =Parse Code=0 "未授权" UserInfo=error=unauthorized, NSLocalizedDescription=unauthorized,temporary=0 我在 XCode 中的 swift 代码是正确的,我从 Parse 文档网站复制了整个代码:docs.parseplatform.org/ios/guide 有可能,现在一个问题已经解决了,而您正在处理下一个问题。 mongodb中是否还有其他错误消息?现在看起来您必须在连接到解析服务器时从您的 iOS 应用程序发送凭据。 mongoDB 没有错误。一切看起来都很好。我正在从 iOS 应用程序发送我的凭据。这是我在上面的描述中添加的第一个代码(以 import Parse 和 Parse.enableLocalDatastore() 开头的代码 那么这些凭据不正确。错误消息指出您未获得授权 (unauthorized)。但这是另一个值得提出另一个问题的问题。

以上是关于尝试使用 MongoDB 从解析服务器中保存或检索数据时出现“服务器在没有 SSL 支持的情况下启动”错误的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试使用 nodejs 从 mongodb 集合中检索数据,但我必须请求两次才能获得正确的信息

直接从客户端访问MongoDB

Socket.io - React:如何在 React 中检索保存的 socket.io 数据(MongoDB)?

TextArea 从数据库中保存/检索

从SharedPreferences保存并检索Intent

如何从解析swift中检索音频文件