Вопрос или проблема
Я пытаюсь загрузить действительный 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" указывает на проблему с форматом или содержимым сертификата.
Шаги для устранения проблемы:
-
Проверьте пароль для PFX-файла:
Если ваш PFX-файл был создан с использованием пароля, необходимо предоставить этот пароль при его загрузке в ваш код. Пример:string password = "ваш_пароль"; // Замените на свой пароль serverCertificate = new X509Certificate2("c:/my/path/server_pfx.pfx", password);
Если при создании PFX-файла пароль не использовался, но ошибка все еще возникает, попробуйте создать PFX заново с использованием пароля и затем загрузить его.
-
Создание PFX-файла с OpenSSL:
При создании PFX-файла с помощью OpenSSL, убедитесь, что вы используете правильные параметры. Ваши команды выглядят правильно, но вы можете добавить аргумент для установки пароля:openssl pkcs12 -export -in cert.pem -inkey key.pem -out server_pfx.pfx -passout pass:ваш_пароль
После этого просто укажите этот пароль при загрузке сертификата в Unity.
-
Использование альтернативных методов загрузки сертификата:
Кроме использования конструктораX509Certificate
, вы можете попробовать другой способ загрузки сертификата:serverCertificate = new X509Certificate2("c:/my/path/server_pfx.pfx", password, X509KeyStorageFlags.MachineKeySet);
Это может помочь, если существует проблема с доступом к хранилищу ключей.
-
Проверка формата PFX:
Убедитесь, что ваш PFX-файл действительно создан корректно и не поврежден. Для этого вы можете использовать различные инструменты или даже попытаться загрузить его с помощью другого инструмента (например, утилитыcertutil
) для проверки его содержимого. -
Убедитесь в совместимости с Unity:
Следует помнить, что некоторые функции или библиотеки могут вести себя по-разному в зависимости от версии Mono, используемой в Unity. Если вы имеете возможность, попробуйте обновить Unity до последней версии, так как это может помочь устранить проблемы с совместимостью.
Заключение
Если вы выполните все эти шаги, это должно помочь вам устранить ошибку и успешно загрузить ваш X509 сертификат. Если проблема все еще не решена, рекомендуется проверить логирование и отладку для получения дополнительной информации о том, что именно вызывает сбой.