Сбой InitCrypto - невозможно включить SSL в клиенте Unity Smartfox - PullRequest
0 голосов
/ 15 марта 2019

Код, который я использую, является примером кода 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 из них), которые отправляет клиент, поэтому я не думаю, что это из-за невозможности согласовать приемлемый шифр.

Моя первоначальная попытка была с сертификатом Let's Encrypt на стороне Smartfox. Позже я приобрел его у Certum (эмитентом является Certum Domain Validation CA SHA2). Я не могу проверить, есть ли в моей установке Unity промежуточные продукты, необходимые для проверки этих сертификатов.

  1. Как выяснить причину сбоя SSL?

  2. Ожидает ли Unity все промежуточные сертификаты в своем собственном хранилище сертификатов?

  3. В любом случае, где находится хранилище сертификатов Unity? Как проверить наличие всех корневых сертификатов или нет?

  4. Какие-либо предложения о том, как я могу отладить эту проблему далее?

1 Ответ

0 голосов
/ 24 марта 2019

Для тех, кто может решить этот вопрос с похожими проблемами: я решил это с помощью поддержки 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

Этогарантирует, что конечный сертификат, его закрытый ключ и все промежуточные сертификаты перечислены в одном псевдониме в хранилище ключей.

...