InitCrypto失败-无法在Unity Smartfox客户端中启用SSL

时间:2019-03-15 03:41:10

标签: c# unity3d smartfoxserver

我正在使用的代码是SFS的Unity示例代码-即只是概念证明。服务器是SFS 2.13.0。

这是我所做的事情。

  • 在区域配置中启用了加密( true )。
  • 最初使用Let's Encrypt证书,然后使用Certum的证书。
  • 证书被导入到JKS密钥库中,并放置在lib / jetty / etc中。 lib / jetty / start.d / ssl.ini已相应更新,并且服务器已重新启动。

在SFS启动时,我可以连接openssl命令行工具并查看证书。

我正在从Unity尝试使用示例客户端(Connector.cs)登录。如果我禁用加密,则可以正常工作。添加侦听器的那一刻失败。

首先,有事件监听器:

if (useEncryption) {

    sfs.AddEventListener (SFSEvent.CRYPTO_INIT, OnCryptoInit);
}

然后从OnConnection触发事件:

if (useEncryption) {

    trace("Initializing Crypto");
    StartCoroutine(sfs.InitCrypto ());
} else {

    enableInterface ("LOGIN");
    uiState = 2;
}

OnCryptoInit方法如下:

private void OnCryptoInit(BaseEvent evt) {

    trace("Crypto Initialized?");

    if ((bool) evt.Params["success"]) {

        trace("....YES!");
        enableInterface ("LOGIN");
        uiState = 2;
    } else {

        trace("Encryption initialization failed: " + (string)evt.Params["errorMessage"]);
    }
}

运行此命令时,我总是得到(与证书无关):

Encryption initialization failed: Unknown Error

不是很有帮助。

Wireshark转储向我显示了一个客户端问候,一个服务器问候和一个握手失败。我在Smartfox端仅启用一个密码(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256),但是我可以在客户端发出的密码列表(其中有85个密码)列表中看到该密码,因此我认为这不是因为无法协商可接受的密码。

我最初的尝试是在Smartfox端使用Let's Encrypt证书。后来我从Certum购买了一个(Certum域验证CA SHA2是发行者)。我无法验证我的Unity安装是否具有验证这些证书所需的中间件。

  1. 我如何找出SSL失败的原因?

  2. Unity是否希望所有中间证书都在其自己的证书存储区中?

  3. Unity的证书存储区在哪里?如何检查是否存在所有根证书?

  4. 关于如何进一步调试此问题的任何建议?

1 个答案:

答案 0 :(得分:0)

对于那些可能遇到类似问题的人:我在SFS支持的帮助下解决了这个问题。简而言之,问题在于密钥库需要在一个别名下使用所有证书和密钥。我有一个在不同别名下列出的中间证书(该脚本用于生成以CN的哈希版本为别名的密钥库导入的中间文件),因此无法使用它们。这导致客户端上的证书链验证不完整,该错误并未准确地报告给应用程序代码。

生成密钥库的正确命令顺序为:

CN=my.domain.tld
cat $CN.pem IntermediateCert1.pem IntermediateCert2.pem > $CN-chain.pem
openssl pkcs12 -export -in $CN-chain.pem -inkey $CN.key -name $CN -out $CN.p12
keytool -importkeystore -deststorepass xxxxxx -destkeystore $CN.keystore -srckeystore $CN.p12 -srcstoretype PKCS12

这可以确保最终证书,其私钥和所有中间证书都在密钥库中的单个别名下列出。