Единство: При попытке загрузить сертификат X509 я получаю исключение ArgumentException: Только целое число может быть преобразовано.

Вопрос или проблема

Я пытаюсь загрузить действительный X509, чтобы использовать функцию

sslStream.AuthenticateAsServer(serverCertificate, clientCertificateRequired: false, checkCertificateRevocation: true);

Я пытаюсь загрузить сертификат следующим образом:

serverCertificate = new X509Certificate("c:/my/path/server_pfx.pfx");

Однако, когда я это делаю, я получаю эту ошибку:

FormatException: Только целое число может быть преобразовано
Mono.Security.ASN1Convert.ToInt32 (Mono.Security.ASN1 asn1) (в <193c77b884c54aa38915aba0dcad62fa>:0)
Mono.Security.X509.PKCS12.Decrypt (Mono.Security.PKCS7+EncryptedData ed) (в <193c77b884c54aa38915aba0dcad62fa>:0)
Mono.Security.X509.PKCS12.Decode (System.Byte[] data) (в <193c77b884c54aa38915aba0dcad62fa>:0)
Mono.Security.X509.PKCS12..ctor (System.Byte[] data, System.String password) (в <193c77b884c54aa38915aba0dcad62fa>:0)
System.Security.Cryptography.X509Certificates.X509Certificate2ImplMono.ImportPkcs12 (System.Byte[] rawData, System.String password) (в <bbae6af52a2a4bd982f8fde9721d2c3b>:0)
System.Security.Cryptography.X509Certificates.X509Certificate2ImplMono.ImportPkcs12 (System.Byte[] rawData, Microsoft.Win32.SafeHandles.SafePasswordHandle password) (в <bbae6af52a2a4bd982f8fde9721d2c3b>:0)
System.Security.Cryptography.X509Certificates.X509Certificate2ImplMono..ctor (System.Byte[] rawData, Microsoft.Win32.SafeHandles.SafePasswordHandle password, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags keyStorageFlags) (в <bbae6af52a2a4bd982f8fde9721d2c3b>:0)
Mono.X509PalImpl.ImportFallback (System.Byte[] data, Microsoft.Win32.SafeHandles.SafePasswordHandle password, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags keyStorageFlags) (в <bbae6af52a2a4bd982f8fde9721d2c3b>:0)
Mono.X509PalImplMono.Import (System.Byte[] data, Microsoft.Win32.SafeHandles.SafePasswordHandle password, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags keyStorageFlags) (в <bbae6af52a2a4bd982f8fde9721d2c3b>:0)
Mono.SystemCertificateProvider.Import (System.Byte[] data, Microsoft.Win32.SafeHandles.SafePasswordHandle password, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags keyStorageFlags, Mono.CertificateImportFlags importFlags) (в <bbae6af52a2a4bd982f8fde9721d2c3b>:0)
Mono.SystemCertificateProvider.Mono.ISystemCertificateProvider.Import (System.Byte[] data, Microsoft.Win32.SafeHandles.SafePasswordHandle password, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags keyStorageFlags, Mono.CertificateImportFlags importFlags) (в <bbae6af52a2a4bd982f8fde9721d2c3b>:0)
System.Security.Cryptography.X509Certificates.X509Helper.Import (System.Byte[] rawData, Microsoft.Win32.SafeHandles.SafePasswordHandle password, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags keyStorageFlags) (в <e40e5a8f982c4b618a930d29f9bd091c>:0)
System.Security.Cryptography.X509Certificates.X509Certificate..ctor (System.String fileName, System.String password, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags keyStorageFlags) (в <e40e5a8f982c4b618a930d29f9bd091c>:0)
System.Security.Cryptography.X509Certificates.X509Certificate..ctor (System.String fileName) (в <e40e5a8f982c4b618a930d29f9bd091c>:0)
Server.Start () (в Assets/Scripts/Server.cs:32)

Сертификат был сгенерирован следующим образом:

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -sha256 -keyout key.pem -out cert.pem
openssl pkcs12 -export -in cert.pem -inkey key.pem -out server_pfx.pfx -macalg sha1

Есть идеи, что я мог сделать не так? Или более простой вопрос: как я могу создать сертификат, который будет работать с функцией AuthenticateAsServer?

Ответ или решение

Ошибка, с которой вы столкнулись, возникает при загрузке файла сертификата в формате PFX (PKCS#12) в Unity. Ошибка "ArgumentException: Only integer can be converted" указывает на проблему с форматом или содержимым сертификата.

Шаги для устранения проблемы:

  1. Проверьте пароль для PFX-файла:
    Если ваш PFX-файл был создан с использованием пароля, необходимо предоставить этот пароль при его загрузке в ваш код. Пример:

    string password = "ваш_пароль"; // Замените на свой пароль
    serverCertificate = new X509Certificate2("c:/my/path/server_pfx.pfx", password);

    Если при создании PFX-файла пароль не использовался, но ошибка все еще возникает, попробуйте создать PFX заново с использованием пароля и затем загрузить его.

  2. Создание PFX-файла с OpenSSL:
    При создании PFX-файла с помощью OpenSSL, убедитесь, что вы используете правильные параметры. Ваши команды выглядят правильно, но вы можете добавить аргумент для установки пароля:

    openssl pkcs12 -export -in cert.pem -inkey key.pem -out server_pfx.pfx -passout pass:ваш_пароль

    После этого просто укажите этот пароль при загрузке сертификата в Unity.

  3. Использование альтернативных методов загрузки сертификата:
    Кроме использования конструктора X509Certificate, вы можете попробовать другой способ загрузки сертификата:

    serverCertificate = new X509Certificate2("c:/my/path/server_pfx.pfx", password, X509KeyStorageFlags.MachineKeySet);

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

  4. Проверка формата PFX:
    Убедитесь, что ваш PFX-файл действительно создан корректно и не поврежден. Для этого вы можете использовать различные инструменты или даже попытаться загрузить его с помощью другого инструмента (например, утилиты certutil) для проверки его содержимого.

  5. Убедитесь в совместимости с Unity:
    Следует помнить, что некоторые функции или библиотеки могут вести себя по-разному в зависимости от версии Mono, используемой в Unity. Если вы имеете возможность, попробуйте обновить Unity до последней версии, так как это может помочь устранить проблемы с совместимостью.

Заключение

Если вы выполните все эти шаги, это должно помочь вам устранить ошибку и успешно загрузить ваш X509 сертификат. Если проблема все еще не решена, рекомендуется проверить логирование и отладку для получения дополнительной информации о том, что именно вызывает сбой.

Оцените материал
Добавить комментарий

Капча загружается...